精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产白丝网站精品污在线入口| 伊人久久大香线蕉综合网站 | 国产激情在线观看| 国产成人99久久亚洲综合精品| 91精品国产91久久久久久久久| 久久久久久国产精品无码| jizz免费一区二区三区| 亚洲美女屁股眼交| 欧美在线3区| 999免费视频| 久久狠狠婷婷| 欧美高清视频一区二区| 男女做爰猛烈刺激| 国产精品国产三级在线观看| 亚洲成a人在线观看| 先锋影音亚洲资源| 婷婷av一区二区三区| 激情偷乱视频一区二区三区| 欧美在线视频播放| 久久久.www| 日韩免费一区| 亚洲乱码一区av黑人高潮| 亚洲欧美手机在线| 向日葵视频成人app网址| 一区二区三区不卡在线观看| 日韩三级在线播放| 日韩有码第一页| 国产一区视频导航| 国产精品欧美久久久| 毛片毛片女人毛片毛片| 欧美日韩精品一本二本三本| 色偷偷噜噜噜亚洲男人| xxx在线播放| 欧美理论电影在线精品| 欧美变态凌虐bdsm| 一级片免费在线观看视频| 国精品产品一区| 日本韩国欧美一区二区三区| 老太脱裤子让老头玩xxxxx| 成人a在线视频免费观看| 欧美国产1区2区| 日韩欧美视频一区二区| 蜜桃视频在线观看网站| 99国产精品99久久久久久| 国产欧美一区二区三区另类精品| 国产视频在线观看视频| 久久99久国产精品黄毛片色诱| 国产激情久久久| 国产免费一区二区三区四区五区| 亚洲一区欧美激情| 91av视频在线观看| 欧美a∨亚洲欧美亚洲| 亚洲少妇一区| 欧美在线视频观看| 免费观看日批视频| 日本不卡视频在线| 国产精品久久久久久久久久久久| 波多野结衣爱爱| 日本aⅴ亚洲精品中文乱码| 国产精品高潮呻吟久久av野狼 | 337p亚洲精品色噜噜噜| 网站一区二区三区| 99久久久国产| 日韩欧美国产午夜精品| 永久看看免费大片| 超碰在线一区| 精品亚洲一区二区三区| 精品夜夜澡人妻无码av| 欧洲杯足球赛直播| 日韩小视频在线| 欧美日韩国产精品综合| 最新成人av网站| 欧美最猛性xxxxx亚洲精品| 亚洲国产av一区二区三区| 日产国产欧美视频一区精品| 国产日韩欧美视频| 国产www视频| 99精品久久免费看蜜臀剧情介绍| 久久偷窥视频| 午夜激情视频在线观看| 亚洲麻豆国产自偷在线| 夜夜添无码一区二区三区| 日韩欧美一中文字暮专区| 在线免费观看日韩欧美| 手机在线免费毛片| 免费av一区二区三区四区| 日韩中文理论片| av资源吧首页| 蜜臀久久久久久久| 国产不卡一区二区在线观看| 免费在线视频你懂得| 成人欧美一区二区三区白人| av无码久久久久久不卡网站| 欧美国产大片| 精品国产在天天线2019| 欧美 日本 国产| 99久久久久久中文字幕一区| 97在线观看免费| 伊人久久一区二区| 成人h精品动漫一区二区三区| 日本一区二区三不卡| 视频在线这里都是精品| 欧美亚洲一区三区| 久久久久久久人妻无码中文字幕爆| 嫩草影视亚洲| 久久69精品久久久久久久电影好| 波多野结衣不卡| 成人黄色777网| 一区二区三区偷拍| 精品国产第一福利网站| 欧美成人一区二区三区在线观看 | 一区二区三区日韩在线观看| 999精品网站| 亚洲码欧美码一区二区三区| 伊人亚洲福利一区二区三区| 国产一卡二卡在线| 国产乱国产乱300精品| 欧美亚州在线观看| 国产白浆在线免费观看| 日韩视频在线一区二区| 日本不卡一区视频| 久久青草久久| 精品午夜一区二区| 国产在线拍揄自揄拍视频 | 亚洲免费黄色网| 天堂成人娱乐在线视频免费播放网站| 久久国产精品偷| 一区二区国产欧美| 国产三级欧美三级| 91看片就是不一样| 国产精品午夜av| 久久久久久国产免费| 99国产揄拍国产精品| 国产精品电影一区二区| 免费看污黄网站| 国产成人ay| 清纯唯美亚洲激情| 欧洲一区av| 日韩欧美在线一区| 李宗瑞91在线正在播放| 国产欧美日韩亚洲一区二区三区| 国产成人看片| av在线小说| 亚洲第一av在线| 日韩 欧美 亚洲| www.欧美日韩| 成人免费在线小视频| 任我爽精品视频在线播放| 国语对白做受69| 性xxxx视频播放免费| 欧美视频不卡中文| 国产成人av一区二区三区不卡| 亚洲综合日本| 日韩伦理一区二区三区av在线| 欧美在线va视频| 中文字幕精品在线视频| 亚洲网站免费观看| 亚洲欧美日韩国产一区二区三区| 无套内谢丰满少妇中文字幕| 欧美精品九九| 国产在线精品日韩| 欧美精品日日操| 中文字幕日韩欧美在线| 国产尤物在线观看| 亚洲自拍另类综合| 亚洲国产欧美视频| 秋霞电影一区二区| 婷婷视频在线播放| 91精品尤物| …久久精品99久久香蕉国产| 久久精品蜜桃| 777午夜精品免费视频| 国产一级淫片免费| 久久久国际精品| 中文字幕中文在线| 亚洲性视频h| 欧美在线激情| 成人在线视频国产| 97视频免费在线观看| 国产综合视频一区二区三区免费| 欧美男男青年gay1069videost| 免费中文字幕在线| 久久婷婷国产综合精品青草| 国产精品久久a| 极品尤物久久久av免费看| 欧美人xxxxx| 高清一区二区三区av| 91精品国产高清久久久久久| 色多多视频在线观看| 精品久久国产字幕高潮| 免费视频网站在线观看入口| 亚洲欧美色综合| 在线小视频你懂的| 成人精品一区二区三区中文字幕| 激情网站五月天| 狠狠入ady亚洲精品经典电影| 欧美性bbwbbwbbwhd| 欧美激情精品| 国产精品对白刺激| xxx性欧美| 久久国产一区二区三区| 欧美捆绑视频| 精品久久人人做人人爽| 亚洲系列在线观看| 欧美日韩亚洲高清| 欧美黄色一区二区三区| 中文字幕+乱码+中文字幕一区| 无码国产69精品久久久久网站 | 国产乱淫av麻豆国产免费| 日本欧美一区二区三区| 天堂…中文在线最新版在线| 中文字幕一区二区av| 天堂精品视频| 在线日本制服中文欧美| 国产女主播一区二区三区| 日韩大陆av| 国产精品久久精品| 超碰91在线观看| 欧美激情网友自拍| 99在线播放| 久久精品免费播放| 在线视频婷婷| 在线观看亚洲视频| 狠狠v欧美ⅴ日韩v亚洲v大胸| 精品久久久久一区二区国产| 国产又粗又长视频| 欧美三级电影在线观看| 久久久久久不卡| 欧美日韩国产一区在线| 国产精品suv一区二区| 一区二区三区四区蜜桃| 亚洲 欧美 变态 另类 综合| 国产精品久久久一本精品| 一区二区伦理片| 国产日韩欧美亚洲| 69精品无码成人久久久久久| 久久久亚洲欧洲日产国码αv| 国产精品久久AV无码| 99久久精品国产观看| 在线观看国产三级| 99久久er热在这里只有精品66| 污污免费在线观看| 不卡的av电影| 手机在线成人av| 91片在线免费观看| 熟女俱乐部一区二区| 国产夜色精品一区二区av| 亚洲a v网站| 国产免费成人在线视频| gv天堂gv无码男同在线观看| 国产精品全国免费观看高清| 国产3级在线观看| **欧美大码日韩| 91在线播放观看| 亚洲人吸女人奶水| 欧美日韩一级大片| 亚洲午夜精品网| 中文字幕视频网| 在线一区二区视频| 在线观看日批视频| 欧美一区二区三区日韩| 亚洲欧美另类视频| 日韩精品在线观看一区| 国产人成在线视频| 久久久国产一区二区| 青春草视频在线| 8x拔播拔播x8国产精品| 欧美日韩免费观看视频| 国产日韩欧美视频在线| 日韩一区网站| 免费在线一区二区| 99国产精品免费视频观看| 800av在线免费观看| 亚洲永久免费| 91高清国产视频| 成av人片一区二区| 蜜桃av乱码一区二区三区| 亚洲视频免费在线| 日韩欧美中文字幕一区二区| 日本韩国欧美一区| www.亚洲天堂.com| 亚洲女人被黑人巨大进入| 日本在线视频观看| 午夜精品在线观看| 国产精品成人国产| 国产精品免费在线播放| 欧美熟乱15p| 日本久久久网站| 日韩不卡一区二区| 国产高潮失禁喷水爽到抽搐| 国产婷婷色一区二区三区| 日韩欧美中文字幕视频| 欧美三级欧美成人高清www| 国产又粗又黄又爽| 亚洲精品在线91| 欧美大片黄色| 国产精品爽爽爽| 日本成人7777| 久久亚洲a v| 蜜臀av一区二区在线观看| 亚洲丝袜在线观看| 久久午夜色播影院免费高清| 激情小说中文字幕| 欧美亚洲动漫精品| 香蕉视频免费在线看| 九九精品视频在线| 欧美韩国日本| 欧洲av一区| 99在线精品视频在线观看| 黄色片免费网址| 国产精品色一区二区三区| 啦啦啦免费高清视频在线观看| 日韩一区二区精品在线观看| 97视频在线观看网站| 欧美在线激情视频| 成人在线视频你懂的| 欧美日韩一区二区三区电影| 日本在线不卡一区| xxxxx在线观看| 精品久久香蕉国产线看观看亚洲 | 成年人视频观看| 成人精品高清在线| 色在线观看视频| 欧美精品免费视频| 视频免费一区| 国产精品久久久久久超碰| 中文字幕中文字幕精品| 日本在线xxx| 99视频在线精品| 日本天堂在线视频| 亚洲成人精品久久| heyzo高清中文字幕在线| dy888夜精品国产专区| 亚洲在线久久| 超碰中文字幕在线观看| 亚洲欧美日本在线| 国产欧美久久久| 久久九九国产精品怡红院| 日韩一级特黄| 国产精品无码乱伦| 国产一区福利在线| 在线免费观看亚洲视频| 欧美日本视频在线| 毛片在线播放a| 亚洲一区二区在线| 国产精品99免费看| 欧美一级片黄色| 欧美日韩精品在线观看| 色视频在线观看| 国产精品1234| 欧美高清在线| 夜夜爽久久精品91| 亚洲高清免费观看高清完整版在线观看| 亚洲精品国产片| 91精品国产高清久久久久久久久 | 白白色亚洲国产精品| 日韩在线观看第一页| 亚洲男人的天堂在线播放| 成人看片网页| 色香蕉在线观看| 成人免费看黄yyy456| 久久青青草原亚洲av无码麻豆| 亚洲午夜小视频| 久久久久久爱| 大j8黑人w巨大888a片| 国产日韩一级二级三级| 国产一区二区三区三州| 欧美激情一区二区三区久久久 | 久久国产精品网| 久久久久久免费网| 国产一区二区麻豆| 国外成人在线视频| 日韩精品看片| 亚洲精品成人无码毛片| 一本色道a无线码一区v| 麻豆av免费在线观看| 国产区一区二区三区| 日本va欧美va欧美va精品| 久久久久久国产精品视频 | 国产欧美在线一区二区| 日韩av中文在线观看| 久久久久久久久久网站| 国产丝袜一区二区| 成人国产精品久久| 日本韩国欧美在线观看| 国产精品卡一卡二| 人妻中文字幕一区| 国产精品欧美日韩一区二区| 国产综合欧美| 精品丰满少妇一区二区三区| 日韩午夜在线观看视频| 国产污视频在线播放| 一区二区精品视频| bt7086福利一区国产| 国产免费a视频| 久久999免费视频| 日韩在线不卡| aaaaa级少妇高潮大片免费看| 91精品国产综合久久久久久| 香蕉成人av|