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

SpringBoot 如何快速使用 Caffeine 緩存?

存儲(chǔ) 存儲(chǔ)軟件
引入 Caffeine 和 Spring Cache 依賴,使用 SpringCache 注解方法實(shí)現(xiàn)緩存。SpringCache幫我們封裝了Caffeine pom文件引入。

[[433190]]

引言

前面我們有學(xué)習(xí)Caffeine 《本地緩存性能之王Caffeine》,并且也提到SpringBoot默認(rèn)使用的本地緩存也是Caffeine啦,今天我們來看看Caffeine如何與SpringBoot集成的。

集成caffeine

caffeine與SpringBoot集成有兩種方式:

  • 一種是我們直接引入 Caffeine 依賴,然后使用 Caffeine 方法實(shí)現(xiàn)緩存。相當(dāng)于使用原生api
  • 引入 Caffeine 和 Spring Cache 依賴,使用 SpringCache 注解方法實(shí)現(xiàn)緩存。SpringCache幫我們封裝了Caffeine pom文件引入
  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-cache</artifactId> 
  4. </dependency> 
  5. <dependency> 
  6.     <groupId>com.github.ben-manes.caffeine</groupId> 
  7.     <artifactId>caffeine</artifactId> 
  8.     <version>2.6.0</version> 
  9. </dependency> 

第一種方式

首先配置一個(gè)Cache,通過構(gòu)造者模式構(gòu)建一個(gè)Cache對象,然后后續(xù)關(guān)于緩存的增刪查都是基于這個(gè)cache對象。

  1. @Configuration 
  2. public class CacheConfig { 
  3.     @Bean 
  4.     public Cache<String, Object> caffeineCache() { 
  5.         return Caffeine.newBuilder() 
  6.                 // 設(shè)置最后一次寫入或訪問后經(jīng)過固定時(shí)間過期 
  7.                 .expireAfterWrite(60, TimeUnit.SECONDS) 
  8.                 // 初始的緩存空間大小 
  9.                 .initialCapacity(100) 
  10.                 // 緩存的最大條數(shù) 
  11.                 .maximumSize(1000) 
  12.                 .build(); 
  13.     } 

第一種方式我們就一一不介紹了,基本上就是使用caffeineCache來根據(jù)你自己的業(yè)務(wù)來操作以下方法

這種方式使用的話是對代碼有侵入性的。

第二種方式

  • 需要在SpingBoot啟動(dòng)類標(biāo)上EnableCaching注解,這個(gè)玩意跟很多框架都一樣,比如我們肴集成dubbo也需要標(biāo)上@EnableDubbole注解等。
  1. @SpringBootApplication 
  2.   @EnableCaching 
  3.   public class DemoApplication { 
  4.       public static void main(String[] args) { 
  5.           SpringApplication.run(DemoApplication.class, args); 
  6.       } 
  • 在application.yml配置我們的使用的緩存類型、過期時(shí)間、緩存策略等。
  1. spring: 
  2.   profiles: 
  3.     active: dev 
  4.   cache: 
  5.     type: CAFFEINE 
  6.     caffeine: 
  7.       spec: maximumSize=500,expireAfterAccess=600s 

如果我們不習(xí)慣使用這種方式的配置,當(dāng)然我們也可以使用JavaConfig的配置方式來代替配置文件。

  1. @Configuration 
  2. public class CacheConfig { 
  3.         @Bean 
  4.         public CacheManager cacheManager() { 
  5.             CaffeineCacheManager cacheManager = new CaffeineCacheManager(); 
  6.             cacheManager.setCaffeine(Caffeine.newBuilder() 
  7.                     // 設(shè)置最后一次寫入或訪問后經(jīng)過固定時(shí)間過期 
  8.                     .expireAfterAccess(600, TimeUnit.SECONDS) 
  9.                     // 初始的緩存空間大小 
  10.                     .initialCapacity(100) 
  11.                     // 緩存的最大條數(shù) 
  12.                     .maximumSize(500)); 
  13.             return cacheManager; 
  14.         } 

接下來就是代碼中如何來使用這個(gè)緩存了。

  1. @Override 
  2. @CachePut(value = "user"key = "#userDTO.id"
  3. public UserDTO save(UserDTO userDTO) { 
  4.     userRepository.save(userDTO); 
  5.     return userDTO; 
  6.  
  7. @Override 
  8. @CacheEvict(value = "user"key = "#id")//2 
  9. public void remove(Long id) { 
  10.     logger.info("刪除了id、key為" + id + "的數(shù)據(jù)緩存"); 
  11.  
  12. @Override 
  13. @Cacheable(value = "user",key = "#id"
  14. public UserDTO getUserById(Long id) { 
  15.     return userRepository.findOne(id); 

上述代碼中我們可以看到有幾個(gè)注解@CachePut、@CacheEvict、@Cacheable我們只需要在方法上標(biāo)上這幾個(gè)注解,我們就能夠使用緩存了,我們分別來介紹下這幾個(gè)注解。

@Cacheable

@Cacheable它是既可以標(biāo)注在類上也可以標(biāo)注在方法上,當(dāng)它標(biāo)記在類上的時(shí)候它表述這個(gè)類上面的所有方法都會(huì)支持緩存,同樣的 當(dāng)它作用在法上面時(shí)候它表示這個(gè)方法是支持緩存的。比如上面我們代碼中的getUserById這個(gè)方法第一次緩存里面沒有數(shù)據(jù),我們會(huì)去查詢DB,但是第二次來查詢的時(shí)候就不會(huì)走DB查詢了,而是直接從緩存里面拿到結(jié)果就返回了。

value 屬性

  • @Cacheable的value屬性是必須指定的,其表示當(dāng)前方法的返回值是會(huì)被緩存在哪個(gè)Cache上的,對應(yīng)Cache的名稱。

key

  • @Cacheable的key 有兩種方式一種是我們自己顯示的去指定我們的key,還有一種默認(rèn)的生成策略,默認(rèn)的生成策略是SimpleKeyGenerator這個(gè)類,這個(gè)生成key的方式也比較簡單我們可以看下它的源碼:
  1. public static Object generateKey(Object... params) { 
  2.         // 如果方法沒有參數(shù) key就是一個(gè) new SimpleKey() 
  3.   if (params.length == 0) { 
  4.    return SimpleKey.EMPTY; 
  5.   } 
  6.   // 如果方法只有一個(gè)參數(shù) key就是當(dāng)前參數(shù) 
  7.   if (params.length == 1) { 
  8.    Object param = params[0]; 
  9.    if (param != null && !param.getClass().isArray()) { 
  10.     return param; 
  11.    } 
  12.   } 
  13.   // 如果key是多個(gè)參數(shù),key就是new SimpleKey ,不過這個(gè)SimpleKey對象的hashCode 和Equals方法是根據(jù)方法傳入的參數(shù)重寫的。 
  14.   return new SimpleKey(params); 
  15.  } 

上述代碼還是非常好理解的分為三種情況:

  • 方法沒有參數(shù),那就new使用一個(gè)全局空的SimpleKey對象來作為key。
  • 方法就一個(gè)參數(shù),就使用當(dāng)前參數(shù)來作為key
  • 方法參數(shù)大于1個(gè),就new一個(gè)SimpleKey對象來作為key,new 這個(gè)SimpleKey的時(shí)候用傳入的參數(shù)重寫了SimpleKey的hashCode和equals方法, 至于為啥需要重寫的原因話,就跟Map用自定義對象來作為key的時(shí)候必須要重寫hashCode和equals方法原理是一樣的,因?yàn)閏affein也是借助了ConcurrentHashMap來實(shí)現(xiàn),

小結(jié)

上述代碼我們可以發(fā)現(xiàn)默認(rèn)生成key只跟我們傳入的參數(shù)有關(guān)系,如果我們有一個(gè)類里面如果存在多個(gè)沒有參數(shù)的方法,然后我們使用了默認(rèn)的緩存生成策略的話,就會(huì)造成緩存丟失。或者緩存相互覆蓋,或者還有可能會(huì)發(fā)生ClassCastException 因?yàn)槎际鞘褂猛粋€(gè)key。比如下面這代碼就會(huì)發(fā)生異常(ClassCastException)。

  1. @Cacheable(value = "user"
  2.   public UserDTO getUser() { 
  3.       UserDTO userDTO = new UserDTO(); 
  4.       userDTO.setUserName("Java金融"); 
  5.       return userDTO; 
  6.   } 
  7.   @Cacheable(value = "user"
  8.   public UserDTO2 getUser1() { 
  9.       UserDTO2 userDTO2 = new UserDTO2(); 
  10.       userDTO2.setUserName2("javajr.cn"); 
  11.       return userDTO2; 
  12.   } 

所以一般不怎么推薦使用默認(rèn)的緩存生成key的策略。如果非要用的話我們最好自己重寫一下,帶上方法名字等。類似于如下代碼:

  1. @Component 
  2. public class MyKeyGenerator extends SimpleKeyGenerator { 
  3.  
  4.     @Override 
  5.     public Object generate(Object target, Method method, Object... params) { 
  6.         Object generate = super.generate(target, method, params); 
  7.         String format = MessageFormat.format("{0}{1}{2}", method.toGenericString(), generate); 
  8.         return format; 
  9.     } 

自定義key

我們可以通過Spring的EL表達(dá)式來指定我們的key。這里的EL表達(dá)式可以使用方法參數(shù)及它們對應(yīng)的屬性。使用方法參數(shù)時(shí)我們可以直接使用“#參數(shù)名”或者“#p參數(shù)index”這也是我們比較推薦的做法:

  1. @Cacheable(value="user"key="#id"
  2.  public UserDTO getUserById(Long id) { 
  3.      UserDTO userDTO = new UserDTO(); 
  4.      userDTO.setUserName("java金融"); 
  5.      return userDTO; 
  6.  } 
  7.  @Cacheable(value="user"key="#p0"
  8.  public UserDTO getUserById1(Long id) { 
  9.      return null
  10.  } 
  11.  @Cacheable(value="user"key="#userDTO.id"
  12.  public UserDTO getUserById2(UserDTO userDTO) { 
  13.      return null
  14.  } 
  15.  @Cacheable(value="user"key="#p0.id"
  16.  public UserDTO getUserById3(UserDTO userDTO) { 
  17.      return null
  18.  } 

@CachePut

@CachePut指定的屬性是和@Cacheable一樣的,但是它們兩個(gè)是有區(qū)別的,@CachePut標(biāo)注的方法不會(huì)先去查詢緩存是否有值,而是每次都會(huì)先去執(zhí)行該方法,然后把結(jié)果返回,并且結(jié)果也會(huì)緩存起來。

為什么是這樣的一個(gè)流程我們可以去看看它的源碼關(guān)鍵代碼就是這一行,

  1. Cache.ValueWrapper cacheHit = findCachedItem(contexts.get(CacheableOperation.class)); 

當(dāng)我們使用方法上有@Cacheable注解的時(shí)候再contexts里面會(huì)把CacheableOperation加入進(jìn)去,只有contexts.get(CacheableOperation.class)取到的內(nèi)容不為空的話,才會(huì)去從緩存里面取內(nèi)容,否則的話cacheHit會(huì)直接返回null。至于contexts什么時(shí)候加入CacheableOperation的話我們看下SpringCacheAnnotationParser#parseCacheAnnotations這個(gè)方法就會(huì)明白的。具體的源碼就不展示了,感興趣的可以自己去翻。

@CacheEvict

把緩存中數(shù)據(jù)刪除,用法跟前面兩個(gè)注解差不多有value和key屬性,需要注意一點(diǎn)的是它多了一個(gè)屬性beforeInvocation

  • beforeInvocation 這個(gè)屬性需要注意下它的默認(rèn)值是false,false代表的意思是再執(zhí)調(diào)用方法之前不刪除緩存,只有方法執(zhí)行成功之后才會(huì)去刪除緩存。設(shè)置為true的話調(diào)用方法之前會(huì)去刪除一下緩存,方法執(zhí)行成功之后還會(huì)去調(diào)用刪除緩存這樣就是雙刪了。如果方法執(zhí)行異常的話就不會(huì)去刪除緩存。
  • allEntrie 是否清空所有緩存內(nèi)容,默認(rèn)值為 false,如果指定為 true,則方法調(diào)用后將立即清空所有緩存

@Caching

這是一個(gè)組合注解集成了上面三個(gè)注解,有三個(gè)屬性:cacheable、put和evict,分別用于來指定@Cacheable、@CachePut和@CacheEvict。

小結(jié)

第二種方式是侵入式的,它的實(shí)現(xiàn)原理也比較簡單就是通過切面的方法攔截器來實(shí)現(xiàn),攔截所有的方法,它的核心代碼如下:看起來就跟我們的業(yè)務(wù)代碼差不了多少,感興趣的也可以去瞅一瞅。

  1. if (contexts.isSynchronized()) { 
  2.    CacheOperationContext context = contexts.get(CacheableOperation.class).iterator().next(); 
  3.    if (isConditionPassing(context, CacheOperationExpressionEvaluator.NO_RESULT)) { 
  4.     Object key = generateKey(context, CacheOperationExpressionEvaluator.NO_RESULT); 
  5.     Cache cache = context.getCaches().iterator().next(); 
  6.     try { 
  7.      return wrapCacheValue(method, cache.get(key, () -> unwrapReturnValue(invokeOperation(invoker)))); 
  8.     } 
  9.     catch (Cache.ValueRetrievalException ex) { 
  10.      // The invoker wraps any Throwable in a ThrowableWrapper instance so we 
  11.      // can just make sure that one bubbles up the stack. 
  12.      throw (CacheOperationInvoker.ThrowableWrapper) ex.getCause(); 
  13.     } 
  14.    } 
  15.    else { 
  16.     // No caching required, only call the underlying method 
  17.     return invokeOperation(invoker); 
  18.    } 
  19.   } 
  20.  
  21.  
  22.   // Process any early evictions 
  23.   // beforeInvocation 屬性是否為true,如果是true就刪除緩存 
  24.   processCacheEvicts(contexts.get(CacheEvictOperation.class), true
  25.     CacheOperationExpressionEvaluator.NO_RESULT); 
  26.  
  27.   // Check if we have a cached item matching the conditions 
  28.   Cache.ValueWrapper cacheHit = findCachedItem(contexts.get(CacheableOperation.class)); 
  29.  
  30.   // Collect puts from any @Cacheable miss, if no cached item is found 
  31.   List<CachePutRequest> cachePutRequests = new LinkedList<>(); 
  32.   if (cacheHit == null) { 
  33.    collectPutRequests(contexts.get(CacheableOperation.class), 
  34.      CacheOperationExpressionEvaluator.NO_RESULT, cachePutRequests); 
  35.   } 
  36.  
  37.   Object cacheValue; 
  38.   Object returnValue; 
  39.  
  40.   if (cacheHit != null && !hasCachePut(contexts)) { 
  41.    // If there are no put requests, just use the cache hit 
  42.    cacheValue = cacheHit.get(); 
  43.    returnValue = wrapCacheValue(method, cacheValue); 
  44.   } 
  45.   else { 
  46.    // Invoke the method if we don't have a cache hit 
  47.    returnValue = invokeOperation(invoker); 
  48.    cacheValue = unwrapReturnValue(returnValue); 
  49.   } 
  50.  
  51.   // Collect any explicit @CachePuts 
  52.   collectPutRequests(contexts.get(CachePutOperation.class), cacheValue, cachePutRequests); 
  53.  
  54.   // Process any collected put requests, either from @CachePut or a @Cacheable miss 
  55.   for (CachePutRequest cachePutRequest : cachePutRequests) { 
  56.    cachePutRequest.apply(cacheValue); 
  57.   } 
  58.  
  59.   // Process any late evictions 
  60.   processCacheEvicts(contexts.get(CacheEvictOperation.class), false, cacheValue); 
  61.  
  62.   return returnValue; 
  63.  } 

結(jié)束

由于自己才疏學(xué)淺,難免會(huì)有紕漏,假如你發(fā)現(xiàn)了錯(cuò)誤的地方,還望留言給我指出來,我會(huì)對其加以修正。

感謝您的閱讀,十分歡迎并感謝您的關(guān)注。 

站在巨人的肩膀上摘蘋果: https://www.cnblogs.com/fashflying/p/6908028.html#!comments

責(zé)任編輯:武曉燕 來源: java金融
相關(guān)推薦

2021-07-11 18:06:18

緩存過期淘汰

2024-12-03 14:38:07

CaffeineRedis二級緩存

2024-12-18 17:20:07

緩存預(yù)熱緩存系統(tǒng)Spring

2024-10-28 07:15:00

SpringBoot緩存預(yù)熱數(shù)據(jù)加載

2024-12-06 10:02:46

2022-03-15 08:22:31

Ehcachespring緩存

2025-03-26 03:25:00

SpringGuavaCaffeine

2024-07-25 14:04:16

2022-03-31 13:58:37

分布式SpringRedis

2012-02-08 11:01:53

HibernateJava

2024-01-19 14:03:59

Redis緩存系統(tǒng)Spring

2025-03-20 10:50:08

RedisCaffeine緩存監(jiān)控

2023-05-05 18:38:33

多級緩存Caffeine開發(fā)

2025-08-04 02:25:00

2022-03-18 13:59:46

緩存RedisCaffeine

2018-09-12 19:46:53

數(shù)據(jù)庫MySQLRedis

2025-09-01 08:28:41

2017-03-22 10:06:40

ubuntuceph集群

2025-03-12 08:42:28

2024-01-03 21:50:32

緩存機(jī)制請求
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美日韩色图| 波多野结衣中文在线| 青青草成人在线观看| 久久深夜福利免费观看| 扒开伸进免费视频| 成人私拍视频| 亚洲人成网站精品片在线观看| 国产精品一区视频| 中文字幕在线观看欧美| 亚洲香蕉网站| 夜夜嗨av一区二区三区四区| 亚洲精品久久久久久| 伊人久久av| 亚洲精品国产无套在线观| 久久久久久久久一区二区| 国产露脸91国语对白| 久久婷婷av| 国产做受69高潮| 影音先锋男人资源在线观看| 欧美精品密入口播放| 91精品国产麻豆| 日本www高清视频| 密臀av在线| 亚洲欧洲精品一区二区精品久久久| 麻豆91蜜桃| 亚洲av无码国产精品永久一区| 奇米色777欧美一区二区| 国内精品400部情侣激情| 欧美日韩黄色网| 精品国精品国产自在久国产应用| 精品粉嫩超白一线天av| 三年中文在线观看免费大全中国| 免费成人美女女| 午夜视频一区在线观看| 欧美激情亚洲天堂| 国产丝袜在线| 亚洲欧洲成人av每日更新| 日韩精品久久一区二区三区| 天堂成人在线| 91麻豆精品秘密| 国产日韩一区二区| 亚洲欧美强伦一区二区| 国产sm精品调教视频网站| 成人免费视频97| 伊人久久成人网| 日本成人在线视频网站| 国产精品久久久亚洲| 青青视频在线免费观看| 亚洲一区日韩| 91高清视频免费观看| 永久免费看片在线播放| 在线午夜精品| 人人爽久久涩噜噜噜网站| 国产福利拍拍拍| 亚洲欧美日韩精品一区二区| 午夜精品免费视频| 国产一国产二国产三| 亚洲国产综合在线看不卡| 欧美丰满少妇xxxxx| 九九免费精品视频| 亚洲二区在线| 欧美一级免费看| 岛国av中文字幕| 日本欧洲一区二区| 国产噜噜噜噜噜久久久久久久久| 一级黄色短视频| 国产老妇另类xxxxx| 成人动漫视频在线观看完整版| 国产黄色高清视频| 不卡一区二区在线| 欧美日韩成人一区二区三区| 国产日产精品久久久久久婷婷| 国产精品无遮挡| 中文字幕免费高| 成人免费高清观看| 日韩欧美中文字幕在线观看| 亚洲视频在线观看一区二区三区| 色噜噜成人av在线| 精品国产凹凸成av人导航| 亚洲色图14p| 欧美日韩精品在线一区| 欧美成人在线免费视频| 国产无码精品视频| 丝瓜av网站精品一区二区| 国产在线高清精品| 成人午夜免费福利| 国产欧美日韩激情| 成人在线观看毛片| 中文字幕成在线观看| 欧美日韩国产另类不卡| 日批免费观看视频| 国产99精品一区| 久久综合九色九九| 日本学生初尝黑人巨免费视频| 视频一区视频二区在线观看| 亚洲一区二区久久久久久| 午夜国产在线视频| 亚洲欧洲性图库| 国产男女在线观看| 日韩一区二区三区在线看| 亚洲开心激情网| 污软件在线观看| 久久激情一区| 99视频在线| 成av人电影在线观看| 亚洲午夜久久久久| 色噜噜狠狠一区二区| 久久激情av| 久久精品免费播放| 久久久精品视频网站| 从欧美一区二区三区| 亚洲成人午夜在线| 色在线免费观看| 欧美tk丨vk视频| 日本视频在线免费| 久久动漫亚洲| 国产精品一区二区欧美黑人喷潮水| av在线播放av| 色欲综合视频天天天| 天天躁日日躁狠狠躁av| 久久一本综合| 国产精品白丝jk喷水视频一区| 蜜桃视频污在线观看| 一区免费观看视频| www.99在线| 蜜臀av免费一区二区三区| 欧美激情精品久久久久久大尺度 | 男人操女人下面视频| 日本一区二区免费高清| 日本精品视频在线| 日本免费一区视频| 亚洲国产日日夜夜| 人妻互换一二三区激情视频| 欧美一区不卡| 91久色国产| 影音先锋在线视频| 日韩一区二区在线观看视频| av资源一区二区| 影音先锋男人看片资源| 亚洲综合精品四区| 国产麻豆乱码精品一区二区三区 | 久久中文久久字幕| 姑娘第5集在线观看免费好剧| 久久综合色天天久久综合图片| 日韩精品在线中文字幕| 综合视频一区| 久久噜噜噜精品国产亚洲综合| 99久久国产热无码精品免费| 日韩美女久久久| 波多野结衣中文字幕在线播放| 在线精品视频在线观看高清| 3d动漫精品啪啪一区二区三区免费| av在线看片| 欧美不卡激情三级在线观看| 久久久久亚洲天堂| 国产精品一区不卡| 免费一级淫片aaa片毛片a级| 精品久久ai电影| 91高清在线免费观看| 午夜成人鲁丝片午夜精品| 丰满岳妇乱一区二区三区| 我和岳m愉情xxxⅹ视频| 日本午夜精品一区二区三区电影| 亚洲.欧美.日本.国产综合在线| 成人日韩av| 久久亚洲一区二区三区四区五区高 | 性欧美高清come| 日韩一区二区三区在线| 精品无码人妻一区二区三区品| 成人免费毛片app| www黄色日本| 精品毛片免费观看| 91在线视频成人| gogo高清午夜人体在线| 亚洲欧美精品一区| 影音先锋黄色网址| 一区二区三区日韩精品视频| 草草地址线路①屁屁影院成人| 丝袜美腿亚洲综合| 91大学生片黄在线观看| 日韩美女国产精品| 国产免费一区二区三区在线观看| 丝袜美腿av在线| 亚洲欧美日韩直播| h片在线免费看| 欧美性色视频在线| 麻豆精品国产免费| 26uuu欧美| 欧美精品 - 色网| 中文亚洲免费| 91制片厂免费观看| 亚洲福利网站| 91久久爱成人| 高清成人在线| 久久久免费电影| 亚洲成人三级| 亚洲国产一区自拍| 国产视频在线观看视频| 一本色道久久综合亚洲精品按摩| 欧洲猛交xxxx乱大交3| 久久久久久亚洲综合影院红桃| 亚洲热在线视频| 日韩国产一区二| 成人一区二区免费视频| 91综合久久一区二区| 欧美日韩免费观看一区| 97超碰成人| 成人中文字幕在线观看 | 亚洲一区二区三区在线视频 | 欧美群妇大交群的观看方式| 日本少妇做爰全过程毛片| 国产精品不卡一区| 在线免费观看麻豆| 成人精品在线视频观看| 91在线第一页| 麻豆精品在线看| 无码人妻丰满熟妇区毛片| 激情久久婷婷| 黄色污污在线观看| 久久成人综合| 日韩精品电影网站| 久久99视频| 欧美xxxx黑人又粗又长精品| 成人台湾亚洲精品一区二区| 91高跟黑色丝袜呻吟在线观看| 亚洲成人1区| 国产精品aaaa| 亚洲日本网址| 国产极品jizzhd欧美| 亚洲精品成人图区| 欧美中在线观看| 牛牛精品一区二区| 97视频免费在线观看| 俺来俺也去www色在线观看| 欧美成人久久久| 黄色在线免费| 久久激情视频免费观看| 麻豆网在线观看| 最新国产成人av网站网址麻豆| 成人在线观看免费| 中日韩美女免费视频网站在线观看| 韩国福利在线| 在线日韩日本国产亚洲| av小片在线| 日韩在线免费视频| 麻豆影视在线观看_| 乱亲女秽乱长久久久| 成人av免费| 欧美日韩高清在线观看| 国产在线xxx| 国内精品小视频| 一区二区精品伦理...| 欧美有码在线观看| 欧美日韩国产v| 国产精品视频xxxx| 伊人亚洲精品| www日韩av| 欧美自拍视频| 日韩电影大全在线观看| 91嫩草亚洲精品| 亚洲高潮无码久久| 日韩亚洲国产欧美| 国产福利视频在线播放| 蜜桃视频在线观看一区二区| 欧美视频国产视频| 国产盗摄一区二区三区| 最近中文字幕无免费| 久久精品亚洲乱码伦伦中文| 黄色一级片一级片| 一区二区国产视频| 国产成人无码一区二区在线播放| 欧洲生活片亚洲生活在线观看| 国产尤物视频在线观看| 精品国产一区二区亚洲人成毛片| 手机福利小视频在线播放| 尤物九九久久国产精品的特点| 国产一区久久精品| 欧美亚洲国产视频小说| 一区二区三区| 国内精品久久国产| 精品国内自产拍在线观看视频 | 日韩电影免费看| 91精品久久久久久久久久另类 | 香蕉视频免费版| 99精品国产在热久久婷婷| 成年网站在线播放| 成人精品视频一区二区三区| 日本一区二区视频在线播放| 一区二区三区四区视频精品免费| 人人草在线观看| 日韩免费电影一区| 成在在线免费视频| 97久久精品在线| 亚洲综合资源| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 亚洲毛茸茸少妇高潮呻吟| 神宫寺奈绪一区二区三区| 亚洲欧美在线一区二区| 黄视频网站在线| 欧美在线观看网址综合| 亚洲高清国产拍精品26u| 国产精品制服诱惑| 日本电影一区二区| 少妇人妻无码专区视频| 韩国精品一区二区| 亚洲熟妇一区二区三区| 亚洲制服丝袜av| 亚洲综合精品国产一区二区三区 | 天堂av在线免费观看| 久久精品视频99| 欧美美女日韩| 国产在线视频欧美一区二区三区| 亚洲午夜精品一区 二区 三区| 免费激情视频在线观看| 成人h动漫精品一区二区 | 精品国产成人在线| 国产夫妻自拍av| 色午夜这里只有精品| 欧美最新精品| 久久久婷婷一区二区三区不卡| 欧美日韩亚洲一区| 中文字幕12页| 国产精品久久久久久户外露出| 一级黄色av片| 日韩精品在线观看网站| 高清精品在线| 国产日韩久久| 亚洲国产一区二区三区a毛片| 国产麻豆剧传媒精品国产| 成人免费视频在线观看| 亚洲一级片免费看| 中文字幕日韩欧美在线视频| 三级成人在线| 日韩av电影在线观看| 蜜桃久久av| 国产手机在线观看| 日韩欧美国产成人| 欧美69xxxxx| 日韩av成人在线| 色婷婷狠狠五月综合天色拍 | 欧美日韩在线精品一区二区三区激情综合 | 蜜臀av午夜精品| 国产69精品久久久久99| 精品网站aaa| 国产成人无码精品久久久性色| 91在线视频播放地址| 亚洲伊人成人网| 亚洲欧美在线一区二区| 免费在线成人激情电影| 五月天亚洲综合情| 日韩精品免费视频人成| 一级二级黄色片| 91精品婷婷国产综合久久性色| 99在线视频观看| 国产偷久久久精品专区| 亚洲欧美日韩国产| 调教驯服丰满美艳麻麻在线视频| 精品视频免费在线| 91精品久久| 国产精品制服诱惑| 久久久久国产一区二区| 国产麻豆a毛片| 日韩精品一区国产麻豆| 国产h片在线观看| 日本高清一区| 精品在线亚洲视频| 国产精品111| 亚洲日本中文字幕| 色综合一区二区日本韩国亚洲 | 日韩激情在线观看| 成人自拍小视频| 精品国产乱码久久久久久牛牛| 中老年在线免费视频| 午夜一区二区三区| 国产高清精品网站| 天堂а√在线中文在线新版 | 澳门av一区二区三区| 亚洲天堂第一区| 91麻豆.com| 一区二区三区黄| 97香蕉超级碰碰久久免费的优势| 成人婷婷网色偷偷亚洲男人的天堂| 手机在线观看日韩av| 岛国av一区二区三区| 欧美三级黄网| 韩国成人动漫在线观看| 日本亚洲免费观看| 99免费在线观看| 最新日韩中文字幕| 牛牛精品成人免费视频| 五月天婷婷亚洲| 精品福利免费观看| 免费黄色在线看| 免费成人深夜夜行视频| 韩国精品一区二区| 男人的天堂av网站| 久久久久一本一区二区青青蜜月| 日韩欧美高清| 国产精品无码一区二区三区免费| 欧美一级在线免费|