精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Springboot2.x AOP 實現緩存鎖,分布式鎖

開發 架構 分布式
本人深根后臺系統多年的經驗;用戶在網絡不好情況下; 在做表單提交時;會出現重復提交的情況;故而我們需要:做到防止表單重提。

 [[410877]]

Springboot2.x AOP 實現 緩存鎖, 分布式鎖 防止重復提交

本人深根后臺系統多年的經驗;用戶在網絡不好情況下; 在做表單提交時;會出現重復提交的情況;故而我們需要:做到防止表單重提

google的guave cache

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-web</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.     <groupId>org.springframework.boot</groupId> 
  7.     <artifactId>spring-boot-starter-aop</artifactId> 
  8. </dependency> 
  9. <dependency> 
  10.     <groupId>com.google.guava</groupId> 
  11.     <artifactId>guava</artifactId> 
  12.     <version>21.0</version> 
  13. </dependency> 

 

注解接口

  1. package com.ouyue.xiwenapi.annotation; 
  2.  
  3. import java.lang.annotation.*; 
  4.  
  5. /** 
  6.  * @ClassName:${} 
  7.  * @Description:TODO 
  8.  * @author:xx@163.com 
  9.  * @Date
  10.  */ 
  11. @Target(ElementType.METHOD) 
  12. @Retention(RetentionPolicy.RUNTIME) 
  13. @Documented 
  14. @Inherited 
  15. public @interface GuaveLock 
  16.  
  17.     String key() default ""
  18.  
  19.     /** 
  20.      * 過期時間 TODO 由于用的 guava 暫時就忽略這屬性吧 集成 redis 需要用到 
  21.      * 
  22.      * @author fly 
  23.      */ 
  24.     int expire() default 5; 

AOP的運用

  1. package com.ouyue.xiwenapi.config; 
  2.  
  3. import com.google.common.cache.Cache; 
  4. import com.google.common.cache.CacheBuilder; 
  5. import com.ouyue.xiwenapi.annotation.GuaveLock; 
  6. import org.aspectj.lang.ProceedingJoinPoint; 
  7. import org.aspectj.lang.annotation.Around; 
  8. import org.aspectj.lang.annotation.Aspect; 
  9. import org.aspectj.lang.reflect.MethodSignature; 
  10. import org.springframework.context.annotation.Configuration; 
  11. import org.springframework.util.StringUtils; 
  12.  
  13. import java.lang.reflect.Method; 
  14. import java.util.concurrent.TimeUnit; 
  15.  
  16. /** 
  17.  * @ClassName:${} 
  18.  * @Description:TODO 
  19.  * @author:xx@163.com 
  20.  * @Date
  21.  */ 
  22. @Aspect 
  23. @Configuration 
  24. public class LockMethodAopConfigure { 
  25.     private static final Cache<String, Object> CACHES = CacheBuilder.newBuilder() 
  26.             // 最大緩存 100 個 
  27.             .maximumSize(1000) 
  28.             // 設置寫緩存后 5 秒鐘過期 
  29.             .expireAfterWrite(5, TimeUnit.SECONDS) 
  30.             .build(); 
  31.  
  32.     @Around("execution(public * *(..)) && @annotation(com.ouyue.xiwenapi.annotation.GuaveLock)"
  33.     public Object interceptor(ProceedingJoinPoint pjp) { 
  34.         MethodSignature signature = (MethodSignature) pjp.getSignature(); 
  35.         Method method = signature.getMethod(); 
  36.         GuaveLock localLock = method.getAnnotation(GuaveLock.class); 
  37.         String key = getKey(localLock.key(), pjp.getArgs()); 
  38.         if (!StringUtils.isEmpty(key)) { 
  39.             if (CACHES.getIfPresent(key) != null) { 
  40.                 throw new RuntimeException("請勿重復請求"); 
  41.             } 
  42.             // 如果是第一次請求,就將 key 當前對象壓入緩存中 
  43.             CACHES.put(keykey); 
  44.         } 
  45.         try { 
  46.             return pjp.proceed(); 
  47.         } catch (Throwable throwable) { 
  48.             throw new RuntimeException("服務器異常"); 
  49.         } finally { 
  50.             // TODO 為了演示效果,這里就不調用 CACHES.invalidate(key); 代碼了 
  51.         } 
  52.     } 
  53.  
  54.     /** 
  55.      * key 的生成策略,如果想靈活可以寫成接口與實現類的方式(TODO 后續講解) 
  56.      * 
  57.      * @param keyExpress 表達式 
  58.      * @param args       參數  可以 采用MD5加密成一個 
  59.      * @return 生成的key 
  60.      */ 
  61.     private String getKey(String keyExpress, Object[] args) { 
  62.         for (int i = 0; i < args.length; i++) { 
  63.             keyExpress = keyExpress.replace("arg[" + i + "]", args[i].toString()); 
  64.         } 
  65.         return keyExpress; 
  66.     } 

Controller

  1. @RestController 
  2. @RequestMapping("/business"
  3. public class BusinessController { 
  4.     @GuaveLock(key = "business:arg[0]"
  5.     @GetMapping 
  6.     public String query(@RequestParam String token) { 
  7.         return "success - " + token; 
  8.     } 

上面的基本都是居于內存級別的緩存;在分布式系統上; 是無法滿足的;故而我們需要做到分布式系統中;也能使用

基于Redis 緩存鎖的實現

pom.xml

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-data-redis</artifactId> 
  4. </dependency> 
  5. spring.redis.host=localhost 
  6. spring.redis.port=6379 

RedisLock

  1. prefix: 緩存中 key 的前綴
  2. expire: 過期時間,此處默認為 5 秒
  3. timeUnit: 超時單位,此處默認為秒
  4. delimiter: key 的分隔符,將不同參數值分割開來
  1. package com.ouyue.xiwenapi.annotation; 
  2.  
  3. import java.lang.annotation.*; 
  4. import java.util.concurrent.TimeUnit; 
  5.  
  6. /** 
  7.  * @ClassName:${} 
  8.  * @Description:TODO 
  9.  * @author:xx@163.com 
  10.  * @Date
  11.  */ 
  12. @Target(ElementType.METHOD) 
  13. @Retention(RetentionPolicy.RUNTIME) 
  14. @Documented 
  15. @Inherited 
  16. public @interface RedisLock { 
  17.     /** 
  18.      * redis 鎖key的前綴 
  19.      * 
  20.      * @return redis 鎖key的前綴 
  21.      */ 
  22.     String prefix() default ""
  23.  
  24.     /** 
  25.      * 過期秒數,默認為5秒 
  26.      * 
  27.      * @return 輪詢鎖的時間 
  28.      */ 
  29.     int expire() default 5; 
  30.  
  31.     /** 
  32.      * 超時時間單位 
  33.      * 
  34.      * @return 秒 
  35.      */ 
  36.     TimeUnit timeUnit() default TimeUnit.SECONDS; 
  37.  
  38.     /** 
  39.      * <p>Key的分隔符(默認 :)</p> 
  40.      * <p>生成的Key:N:SO1008:500</p> 
  41.      * 
  42.      * @return String 
  43.      */ 
  44.     String delimiter() default ":"

CacheParam 注解

  1. package com.ouyue.xiwenapi.annotation; 
  2.  
  3. import java.lang.annotation.*; 
  4.  
  5. /** 
  6.  * @ClassName:${} 
  7.  * @Description:TODO 
  8.  * @author:xx@163.com 
  9.  * @Date
  10.  */ 
  11. @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.FIELD}) 
  12. @Retention(RetentionPolicy.RUNTIME) 
  13. @Documented 
  14. @Inherited 
  15. public @interface CacheParam { 
  16.     /** 
  17.      * 字段名稱 
  18.      * 
  19.      * @return String 
  20.      */ 
  21.     String name() default ""

Key 生成策略

  1. package com.ouyue.xiwenapi.componet; 
  2.  
  3. import org.aspectj.lang.ProceedingJoinPoint; 
  4.  
  5. public interface CacheKeyGenerator { 
  6.     /** 
  7.      * 獲取AOP參數,生成指定緩存Key 
  8.      * 
  9.      * @param pjp PJP 
  10.      * @return 緩存KEY 
  11.      */ 
  12.     String getLockKey(ProceedingJoinPoint pjp); 

Key 生成策略(實現)

  1. package com.ouyue.xiwenapi.service; 
  2.  
  3. import com.ouyue.xiwenapi.annotation.CacheParam; 
  4. import com.ouyue.xiwenapi.annotation.RedisLock; 
  5. import com.ouyue.xiwenapi.componet.CacheKeyGenerator; 
  6. import org.aspectj.lang.ProceedingJoinPoint; 
  7. import org.aspectj.lang.reflect.MethodSignature; 
  8. import org.springframework.util.ReflectionUtils; 
  9. import org.springframework.util.StringUtils; 
  10.  
  11. import java.lang.annotation.Annotation; 
  12. import java.lang.reflect.Field; 
  13. import java.lang.reflect.Method; 
  14. import java.lang.reflect.Parameter; 
  15.  
  16. /** 
  17.  * @ClassName:${} 
  18.  * @Description:TODO 
  19.  * @author:xx@163.com 
  20.  * @Date
  21.  */ 
  22. public class LockKeyGenerator implements CacheKeyGenerator { 
  23.     @Override 
  24.     public String getLockKey(ProceedingJoinPoint pjp) { 
  25.         MethodSignature signature = (MethodSignature) pjp.getSignature(); 
  26.         Method method = signature.getMethod(); 
  27.         RedisLock lockAnnotation = method.getAnnotation(RedisLock.class); 
  28.         final Object[] args = pjp.getArgs(); 
  29.         final Parameter[] parameters = method.getParameters(); 
  30.         StringBuilder builder = new StringBuilder(); 
  31.         // TODO 默認解析方法里面帶 CacheParam 注解的屬性,如果沒有嘗試著解析實體對象中的 
  32.         for (int i = 0; i < parameters.length; i++) { 
  33.             final CacheParam annotation = parameters[i].getAnnotation(CacheParam.class); 
  34.             if (annotation == null) { 
  35.                 continue
  36.             } 
  37.             builder.append(lockAnnotation.delimiter()).append(args[i]); 
  38.         } 
  39.         if (StringUtils.isEmpty(builder.toString())) { 
  40.             final Annotation[][] parameterAnnotations = method.getParameterAnnotations(); 
  41.             for (int i = 0; i < parameterAnnotations.length; i++) { 
  42.                 final Object object = args[i]; 
  43.                 final Field[] fields = object.getClass().getDeclaredFields(); 
  44.                 for (Field field : fields) { 
  45.                     final CacheParam annotation = field.getAnnotation(CacheParam.class); 
  46.                     if (annotation == null) { 
  47.                         continue
  48.                     } 
  49.                     field.setAccessible(true); 
  50.                     builder.append(lockAnnotation.delimiter()).append(ReflectionUtils.getField(field, object)); 
  51.                 } 
  52.             } 
  53.         } 
  54.         return lockAnnotation.prefix() + builder.toString(); 
  55.     } 

Lock 攔截器(AOP)

 

  1. package com.ouyue.xiwenapi.config; 
  2.  
  3. import com.ouyue.xiwenapi.annotation.RedisLock; 
  4. import com.ouyue.xiwenapi.componet.CacheKeyGenerator; 
  5. import org.aspectj.lang.ProceedingJoinPoint; 
  6. import org.aspectj.lang.annotation.Around; 
  7. import org.aspectj.lang.annotation.Aspect; 
  8. import org.aspectj.lang.reflect.MethodSignature; 
  9. import org.springframework.beans.factory.annotation.Autowired; 
  10. import org.springframework.context.annotation.Configuration; 
  11. import org.springframework.data.redis.connection.RedisStringCommands; 
  12. import org.springframework.data.redis.core.RedisCallback; 
  13. import org.springframework.data.redis.core.StringRedisTemplate; 
  14. import org.springframework.data.redis.core.types.Expiration; 
  15. import org.springframework.util.StringUtils; 
  16.  
  17. import java.lang.reflect.Method; 
  18.  
  19. /** 
  20.  * @ClassName:${} 
  21.  * @Description:TODO 
  22.  * @author:xx@163.com 
  23.  * @Date
  24.  */ 
  25. @Aspect 
  26. @Configuration 
  27. public class LockMethodInterceptor { 
  28.     @Autowired 
  29.     public LockMethodInterceptor(StringRedisTemplate lockRedisTemplate, CacheKeyGenerator cacheKeyGenerator) { 
  30.         this.lockRedisTemplate = lockRedisTemplate; 
  31.         this.cacheKeyGenerator = cacheKeyGenerator; 
  32.     } 
  33.  
  34.     private final StringRedisTemplate lockRedisTemplate; 
  35.     private final CacheKeyGenerator cacheKeyGenerator; 
  36.  
  37.  
  38.     @Around("execution(public * *(..)) && @annotation(com.ouyue.xiwenapi.annotation.RedisLock)"
  39.     public Object interceptor(ProceedingJoinPoint pjp) { 
  40.         MethodSignature signature = (MethodSignature) pjp.getSignature(); 
  41.         Method method = signature.getMethod(); 
  42.         RedisLock lock = method.getAnnotation(RedisLock.class); 
  43.         if (StringUtils.isEmpty(lock.prefix())) { 
  44.             throw new RuntimeException("lock key don't null..."); 
  45.         } 
  46.         final String lockKey = cacheKeyGenerator.getLockKey(pjp); 
  47.         try { 
  48.             // 采用原生 API 來實現分布式鎖 
  49.             final Boolean success = lockRedisTemplate.execute((RedisCallback<Boolean>) connection -> connection.set(lockKey.getBytes(), new byte[0], Expiration.from(lock.expire(), lock.timeUnit()), RedisStringCommands.SetOption.SET_IF_ABSENT)); 
  50.             if (!success) { 
  51.                 // TODO 按理來說 我們應該拋出一個自定義的 CacheLockException 異常;這里偷下懶 
  52.                 throw new RuntimeException("請勿重復請求"); 
  53.             } 
  54.             try { 
  55.                 return pjp.proceed(); 
  56.             } catch (Throwable throwable) { 
  57.                 throw new RuntimeException("系統異常"); 
  58.             } 
  59.         } finally { 
  60.             // TODO 如果演示的話需要注釋該代碼;實際應該放開 
  61.             // lockRedisTemplate.delete(lockKey); 
  62.         } 
  63.     } 

請求

  1. package com.ouyue.xiwenapi.controller; 
  2.  
  3. import com.ouyue.xiwenapi.annotation.CacheParam; 
  4. import com.ouyue.xiwenapi.annotation.GuaveLock; 
  5. import com.ouyue.xiwenapi.annotation.RedisLock; 
  6. import org.springframework.web.bind.annotation.GetMapping; 
  7. import org.springframework.web.bind.annotation.RequestMapping; 
  8. import org.springframework.web.bind.annotation.RequestParam; 
  9. import org.springframework.web.bind.annotation.RestController; 
  10.  
  11. /** 
  12.  * @ClassName:${} 
  13.  * @Description:TODO 
  14.  * @author:xx@163.com 
  15.  * @Date
  16.  */ 
  17.  
  18. @RestController 
  19. @RequestMapping("/business"
  20. public class BusinessController { 
  21.     @GuaveLock(key = "business:arg[0]"
  22.     @GetMapping 
  23.     public String query(@RequestParam String token) { 
  24.         return "success - " + token; 
  25.     } 
  26.  
  27.     @RedisLock(prefix = "users"
  28.     @GetMapping 
  29.     public String queryRedis(@CacheParam(name = "token") @RequestParam String token) { 
  30.         return "success - " + token; 
  31.     } 

mian 函數啟動類上;將key 生產策略函數注入

  1. @Bean 
  2. public CacheKeyGenerator cacheKeyGenerator() { 
  3.     return new LockKeyGenerator(); 

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-01-13 07:39:07

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數據分布式鎖

2024-11-28 15:11:28

2018-11-27 16:17:13

分布式Tomcat

2021-11-26 06:43:19

Java分布式

2024-07-29 09:57:47

2024-10-07 10:07:31

2021-02-28 07:49:28

Zookeeper分布式

2017-01-16 14:13:37

分布式數據庫

2018-04-03 16:24:34

分布式方式

2024-04-01 05:10:00

Redis數據庫分布式鎖

2024-01-02 13:15:00

分布式鎖RedissonRedis

2022-04-08 08:27:08

分布式鎖系統

2017-04-13 10:51:09

Consul分布式

2023-08-27 22:13:59

Redisson分布式緩存

2019-06-19 15:40:06

分布式鎖RedisJava

2023-09-04 08:12:16

分布式鎖Springboot
點贊
收藏

51CTO技術棧公眾號

日本中文不卡| 日本免费一区二区三区视频观看| 午夜激情视频网| 欧美v亚洲v| 国产亚洲综合色| 亚洲jizzjizz日本少妇| 91蜜桃视频在线观看| 欧美精选视频在线观看| 日韩欧美你懂的| 四虎永久在线精品无码视频| 精品176二区| 91美女片黄在线观看91美女| 成人国产精品一区二区| 国产又爽又黄的视频| 66视频精品| 亚洲男人天堂手机在线| 欧美日韩一区二区区别是什么 | 色欧美自拍视频| 亚洲爱爱爱爱爱| 最新免费av网址| 免费成人动漫| 午夜日韩在线观看| 二级片在线观看| www.在线播放| 91蜜桃在线免费视频| 成人午夜电影在线播放| 一区二区三区免费在线视频| 久久精品免费| 久久人人爽人人爽人人片av高清| 中文字幕第24页| 亚洲毛片免费看| 精品国产成人系列| 成人高清在线观看视频| 欧美97人人模人人爽人人喊视频| 色网站国产精品| a在线视频观看| 国产美女一区视频| 亚洲卡通欧美制服中文| 一区二区三区四区在线视频 | 亚洲日本va午夜在线电影| 欧美视频第二页| 麻豆av免费在线| 在线高清av| 欧美特黄级在线| 少妇av一区二区三区无码| 午夜激情在线| 一区二区三区中文字幕精品精品 | 91久久在线| 欧美—级高清免费播放| 久久这里只有精品免费| 欧美在线播放| 欧美疯狂xxxx大交乱88av| 希岛爱理中文字幕| 四季av一区二区凹凸精品| 中文字幕国产亚洲| 亚洲欧洲综合网| 97精品国产| 久久中文字幕在线| 国产一区二区视频在线观看免费| 中文精品电影| 久久久久久亚洲精品不卡| 久久精品第一页| 在线日韩欧美| 97超碰色婷婷| 天天干天天色综合| 蜜桃一区二区三区四区| 成人国产在线视频| www黄色网址| www.66久久| 麻豆av一区二区三区久久| 免费a在线观看| 中文字幕亚洲在| 日韩一二区视频| h片在线观看| 色狠狠桃花综合| 亚洲激情在线观看视频| 国产免费区一区二区三视频免费| 日韩欧美美女一区二区三区| 给我看免费高清在线观看| 久操成人av| 北条麻妃99精品青青久久| 一区二区成人免费视频| 国产精品外国| 91精品国产自产在线| 精品人妻一区二区三区蜜桃 | 96av在线| 欧美亚男人的天堂| 自拍偷拍激情视频| 亚洲精品无吗| 久久影视电视剧免费网站清宫辞电视 | 色婷婷综合视频| 欧美国产视频在线| 800av在线免费观看| 日本免费一区二区三区四区| 91精品一区二区三区久久久久久 | 国产精品一级视频| 99视频精品免费视频| 亚洲一区二区三区欧美| 伦理在线一区| 欧美日韩视频在线第一区 | 91片在线免费观看| 亚洲小说欧美另类激情| 涩涩视频在线| 日韩欧美一区中文| 亚洲一区二区自偷自拍| 国产精品hd| 国产精品扒开腿做爽爽爽男男| av无码精品一区二区三区宅噜噜| 26uuu久久天堂性欧美| 日本一区二区三区四区五区六区| 一区二区三区短视频| 日韩美一区二区三区| 久久久久亚洲av无码a片| 亚洲经典三级| 亚洲aa中文字幕| av在线播放网站| 精品女同一区二区三区在线播放| 992tv人人草| 欧美日韩性在线观看| 久久久爽爽爽美女图片| 国产乱淫av片免费| 国产欧美一区二区精品仙草咪| 97在线国产视频| 91麻豆精品| 中文字幕亚洲综合久久| 国产寡妇亲子伦一区二区三区四区| 国产不卡视频在线播放| 亚洲7777| 日韩欧美精品一区二区综合视频| 日韩成人中文字幕| 国产无码精品一区二区| 国产麻豆精品theporn| 一区二区精品国产| 黄色成人在线视频| 国产一区二区久久精品| 免费观看成人毛片| aa级大片欧美| www在线观看免费| 国产毛片精品| 国内精品400部情侣激情| 午夜精品久久久久久久爽| 亚洲男女一区二区三区| 99九九99九九九99九他书对| 色喇叭免费久久综合网| 国产精品自拍网| 成人免费黄色网页| 欧美午夜不卡视频| 国产视频123区| 日本免费新一区视频| 视频在线观看成人| 免费成人美女女| 亚洲四色影视在线观看| 天天爱天天做天天爽| 久久精品一区二区三区不卡| 久久久久久久少妇| 成人综合一区| 成人免费在线视频网站| 高清全集视频免费在线| 欧美一区二区三区在线电影| 五月婷婷一区二区| 成人动漫一区二区| av黄色在线网站| 国产欧美高清视频在线| 国产精品专区第二| 黄色在线免费| 精品国产不卡一区二区三区| 成年人午夜视频| 26uuu亚洲综合色| 精品日韩久久久| 亚洲国产精品日韩专区av有中文| 91系列在线播放| 成人影音在线| 国产午夜精品一区理论片飘花| 中文字幕在线观看第二页| 18成人在线观看| 性欧美18—19sex性高清| 亚洲中字在线| 亚洲高清乱码| 澳门成人av| 国产极品jizzhd欧美| 免费大片黄在线观看视频网站| 日韩欧美一区中文| 男人天堂av在线播放| 亚洲三级在线免费观看| 国产精品一区二区在线免费观看| 国产农村妇女精品一二区| 亚洲综合视频一区| eeuss鲁片一区二区三区| 国产精品第3页| 在线观看wwwxxxx| 亚洲精品在线91| 国产视频在线观看免费| 欧美性xxxxx极品娇小| 伊人久久久久久久久久久久久久| 成人一区二区三区在线观看| 国产视频一区二区三区在线播放| 91tv官网精品成人亚洲| 久久国产欧美精品| **日韩最新| 欧美综合第一页| 粗大黑人巨茎大战欧美成人| 亚洲男人天堂视频| 亚洲成人中文字幕在线| 欧美亚洲国产bt| 久久露脸国语精品国产91| 亚洲视频每日更新| a天堂中文字幕| 成人av中文字幕| 国产美女视频免费看| 葵司免费一区二区三区四区五区| 草草草视频在线观看| 欧美色图国产精品| 久久免费99精品久久久久久| 精品视频成人| 国产精品极品尤物在线观看 | 91免费视频国产| 亚洲天堂一区二区| 81精品国产乱码久久久久久| 国产淫片在线观看| 最近的2019中文字幕免费一页 | 国产精品一级视频| 在线欧美日韩精品| 特级做a爱片免费69| 亚洲资源在线观看| 九九九在线视频| 亚洲免费观看高清| 日本不卡一区视频| 国产色爱av资源综合区| 精品国产av色一区二区深夜久久| 国产精品一区二区不卡| www.桃色.com| 久久se这里有精品| 奇米影视四色在线| 蜜臀av一区二区在线观看| 少妇性l交大片| 日韩国产在线观看| 欧美一级黄色片视频| 久久福利一区| 激情五月亚洲色图| 老**午夜毛片一区二区三区| 国产成人精品无码播放| 另类图片国产| 91香蕉视频污版| 日本va欧美va欧美va精品| av丝袜天堂网| 麻豆中文一区二区| 亚洲18在线看污www麻豆| 久久精品国产99| 日本三级黄色网址| 国产在线日韩欧美| 人妻换人妻仑乱| 国产成人鲁色资源国产91色综| 午夜免费视频网站| 成人激情小说网站| 亚洲熟女乱综合一区二区三区| 99久久精品免费| 国产三级国产精品| 国产欧美久久久精品影院| 日本一卡二卡在线播放| 国产精品成人一区二区三区夜夜夜| 国产精品久久久免费看| 综合久久久久综合| 免费毛片一区二区三区| 黄色一区二区在线| 高潮毛片又色又爽免费| 欧美日韩中文字幕一区| 国产毛片毛片毛片毛片| 日韩精品中文字幕在线一区| 无码精品视频一区二区三区 | 精品欧美一区二区在线观看视频 | 久久在线精品视频| 美洲精品一卡2卡三卡4卡四卡| 韩国精品久久久999| 综合毛片免费视频| 国产精品天天狠天天看| 欧美一级大片在线视频| 精品一区二区三区免费毛片| 精品国产91| 国产欧美精品aaaaaa片| 久久一区国产| 毛片毛片毛片毛| 99国产精品99久久久久久| jizz日本在线播放| 亚洲一区二区中文在线| 日韩视频在线观看一区| 69堂成人精品免费视频| 人妻无码中文字幕免费视频蜜桃| 国产午夜精品视频| 激情在线视频播放| 国产福利视频一区| 亚洲精品aⅴ| 色999五月色| 伊人久久大香线蕉综合热线 | 中文字幕在线观看视频免费| 337p亚洲精品色噜噜噜| 日韩av高清在线| 欧美另类在线播放| 欧美国产日韩电影| 国产精品一区在线观看| 波多野结衣的一区二区三区| 欧美成人精品免费| 精东粉嫩av免费一区二区三区| 少妇一级淫片免费放播放| 中文字幕一区二区三区在线观看 | 美女视频一区免费观看| 一级片免费在线观看视频| 久久精品一区八戒影视| 国产无码精品在线观看| 欧美精品久久99久久在免费线 | 日韩精品91| 国产免费黄色av| 粉嫩av一区二区三区在线播放| 欧美美女性生活视频| 欧美特黄级在线| 天堂在线资源网| 久久99精品久久久久久青青91| 国产极品嫩模在线观看91精品| 久久人人九九| 欧美色一级片| 三级性生活视频| 国产精品美女久久久久久2018| 国产精品第5页| 日韩的一区二区| 黄色小说在线播放| 99re视频| 欧美日本精品| 久久久久无码精品| 中文字幕中文字幕一区二区| 中文字幕人妻互换av久久 | 国产精品播放| 欧美 亚欧 日韩视频在线| 999在线观看| 国产精品成人免费在线| 中文字幕91爱爱| 在线播放国产一区二区三区| 欧洲一级精品| 欧美日韩综合久久| 久久精品亚洲一区二区| 粉嫩av蜜桃av蜜臀av| 欧美日韩亚洲一区二区三区| 五月激情六月婷婷| 91国产精品91| 综合国产视频| 免费看a级黄色片| 国产日韩v精品一区二区| 天天综合久久综合| 伊人久久久久久久久久| 精品福利在线| 一区二区欧美日韩| 国产在线观看一区二区| www欧美com| 日韩久久免费av| 国产无遮挡裸体视频在线观看| 久久精品人成| 久久一区二区三区四区五区| 欧美aaa级片| 91麻豆精品国产91久久久| 日本天码aⅴ片在线电影网站| 99久久综合狠狠综合久久止| 影音先锋久久久| 中国美女乱淫免费看视频| 在线观看国产日韩| 欧美成人高清在线| 高清免费日韩| 国产午夜精品一区二区三区欧美| 亚洲色成人网站www永久四虎| 在线精品观看国产| a级影片在线| 国产在线精品一区二区三区| 老司机免费视频久久| 日韩亚洲欧美中文字幕| 欧美草草影院在线视频| 日韩激情电影免费看| 日韩欧美一区二区三区四区| 国产在线看一区| 日韩精品一区二区三区国语自制| 亚洲天堂色网站| 色悠久久久久综合先锋影音下载 | 日本免费新一区视频| 中文字幕在线观看成人| 日韩精品在线私人| 9999精品| 精品99在线视频| 国产精品国模大尺度视频| 成人毛片视频免费看| 国产精品va在线| 亚洲视频免费| av电影网站在线观看| 日韩精品一区二区三区在线 | 91精品一区二区三区久久久久久 | 欧美成人日韩| 无码人妻精品一区二区三应用大全 | 日韩三级影视基地| 精品综合久久88少妇激情| 国产三级国产精品国产专区50| 一区二区三区在线视频观看58| 免费在线黄色影片| 亚洲综合国产精品| 日本伊人午夜精品| 五月天婷婷综合网|