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

Java 類庫中的瑞士軍刀:Google Guava 緩存

新聞 后端
Google Guava 被譽為是JAVA類庫中的瑞士軍刀。能顯著簡化代碼,讓代碼易寫、易讀、易于維護。同時可以大幅提高程序員的工作效率,讓我們從大量重復的底層代碼中脫身。

[[332051]]

 Google Guava 被譽為是JAVA類庫中的瑞士軍刀。能顯著簡化代碼,讓代碼易寫、易讀、易于維護。同時可以大幅提高程序員的工作效率,讓我們從大量重復的底層代碼中脫身。

由于 Google Guava 類庫包含大量非常有用的特性,無法在一篇文章中盡述。本篇僅簡單介紹 Google Guava 中的緩存工具的使用。

依賴

使用 Maven 進行項目構建時,添加下面的依賴:

  1. <dependency> 
  2.  
  3. <groupId>com.google.guava</groupId> 
  4.  
  5. <artifactId>guava</artifactId> 
  6.  
  7. <version>29.0-jre</version> 
  8.  
  9. <!-- or, for Android: --> 
  10.  
  11. <version>29.0-android</version> 
  12.  
  13. </dependency> 

使用 Gradle 進行項目構建時,添加下面的依賴:

  1. dependencies { 
  2.  
  3. // Pick one: 
  4.  
  5. // 1. Use Guava in your implementation only: 
  6.  
  7. implementation("com.google.guava:guava:29.0-jre"
  8.  
  9. // 2. Use Guava types in your public API: 
  10.  
  11. api("com.google.guava:guava:29.0-jre"
  12.  
  13. // 3. Android - Use Guava in your implementation only: 
  14.  
  15. implementation("com.google.guava:guava:29.0-android"
  16.  
  17. // 4. Android - Use Guava types in your public API: 
  18.  
  19. api("com.google.guava:guava:29.0-android"
  20.  

示例

  1. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
  2.  
  3. .maximumSize(1000
  4.  
  5. .expireAfterWrite(10, TimeUnit.MINUTES) 
  6.  
  7. .removalListener(MY_LISTENER) 
  8.  
  9. .build( 
  10.  
  11. new CacheLoader<Key, Graph>() { 
  12.  
  13. @Override 
  14.  
  15. public Graph load(Key key) throws AnyException { 
  16.  
  17. return createExpensiveGraph(key); 
  18.  
  19.  
  20. }); 

適用性

緩存有非常廣泛的應用場景。比如,你應該為那些計算或者查詢代價高昂的數據使用緩存,或者你需要某個輸入數據很多次的場景。

一個 `Cache` 類似于 `ConcurrentMap`,不過并不完全相同。基本的差異在于, `ConcurrentMap` 持久化所有添加進來的元素直到它們被顯式刪除。另一方面,通常將 `Cache` 配置為自動淘汰條目,以限制其內存占用量。在某些情況下, `LoadingCache` 會很有用,雖然它不淘汰條目,但是可以自動加載緩存。

通常,Guava 緩存工具可以適用于下列場景:

  • 你希望使用一些內存空間來改善速度。
  • 您希望多次查詢某些鍵。
  • 您的緩存將不需要存儲超出 RAM 容量的數據。(Guava 緩存的作用范圍局限于在應用程序的一次運行中。它們不將數據存儲在文件中或外部服務器上。如果這不符合您的需求,請考慮使 Memcached)

如果這些都適用于您的應用場景,那么 Guava 緩存實用程序將很適合您!

如上面的示例代碼所示,使用 `CacheBuilder` 生成器模式可以獲取 `Cache`,但是自定義緩存是有趣的部分。

注意:如果不需要 `Cache` 的功能,則 `ConcurrentHashMap` 的內存使用效率更高——但是很難用任何舊的 `ConcurrentMap`來復制大多數 `Cache` 的功能。

填充

你需要問自己有關緩存的第一個問題是:是否有一些合理的默認函數來加載或計算與鍵關聯的值?如果是這樣,您應該使用 `CacheLoader`。如果不是這樣,或者如果您需要覆蓋默認值,但是仍然需要原子的 "get-if-absent-compute" 語義,則應該將 `Callable` 傳遞給 `get` 調用。可以使用 `Cache.put` 直接插入元素,但是首選自動加載緩存,因為這樣可以更輕松地推斷所有緩存內容的一致性。

使用 CacheLoader

`LoadingCache` 是一個通過附屬的 `CacheLoader` 構建的 `Cache`。創(chuàng)建一個 `CacheLoader` 通常與實現 `V load(K key) throws Exception` 方法一樣。因此,比如,你可以使用下面的代碼創(chuàng)建一個 `LoadingCache` :

  1. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
  2.  
  3. .maximumSize(1000
  4.  
  5. .build( 
  6.  
  7. new CacheLoader<Key, Graph>() { 
  8.  
  9. public Graph load(Key key) throws AnyException { 
  10.  
  11. return createExpensiveGraph(key); 
  12.  
  13.  
  14. }); 
  15.  
  16. ... 
  17.  
  18. try { 
  19.  
  20. return graphs.get(key); 
  21.  
  22. catch (ExecutionException e) { 
  23.  
  24. throw new OtherException(e.getCause()); 
  25.  

查詢 `LoadingCache` 的規(guī)范方法是使用 `get(K)` 方法。這將返回一個已經緩存的值,或者使用緩存的 `CacheLoader` 原子地將新值加載到緩存中。由于 `CacheLoader` 可能會拋出 `Exception`,因此 `LoadingCache.get(K)` 會拋出 `ExecutionException`。(如果緩存加載器拋出 unchecked 異常,則`get(K)` 會引發(fā)包裝了 `UncheckedExecutionException` 的異常。)您還可以選擇使用 `getUnchecked(K)` 將所有異常包裝在 `UncheckedExecutionException` 中, 但是如果底層的 `CacheLoader` 通常會拋出受檢查異常,這可能會導致令人驚訝的行為。

  1. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
  2.  
  3. .expireAfterAccess(10, TimeUnit.MINUTES) 
  4.  
  5. .build( 
  6.  
  7. new CacheLoader<Key, Graph>() { 
  8.  
  9. public Graph load(Key key) { // no checked exception 
  10.  
  11. return createExpensiveGraph(key); 
  12.  
  13.  
  14. }); 
  15.  
  16. ... 
  17.  
  18. return graphs.getUnchecked(key); 

可以使用 `getAll(Iterable<? extends K>)` 方法執(zhí)行批量查找。默認情況下,`getAll` 將為緩存中不存在的每個鍵單獨發(fā)出 `CacheLoader.load` 調用。如果批量檢索比許多單個查詢更有效,則可以覆蓋 `CacheLoader.loadAll` 來利用這一點。 `getAll(Iterable)` 的性能將相應提高。

請注意,您可以編寫一個 `CacheLoader.loadAll` 實現,該實現加載未明確要求的鍵的值。例如,如果計算某個組中任何鍵的值給您該組中所有鍵的值,則 `loadAll` 可能會同時加載其余組。

使用 Callable

所有 Guava 緩存(無論是否加載)均支持方法 `get(K, Callable)`。此方法返回與緩存中的鍵關聯的值,或從指定的 `Callable` 中計算出該值并將其添加到緩存中。在加載完成之前,不會修改與此緩存關聯的可觀察狀態(tài)。此方法為常規(guī)的“如果已緩存,則返回;否則創(chuàng)建,緩存并返回”模式提供了簡單的替代方法。

  1. Cache<Key, Value> cache = CacheBuilder.newBuilder() 
  2.  
  3. .maximumSize(1000
  4.  
  5. .build(); // look Ma, no CacheLoader 
  6.  
  7. ... 
  8.  
  9. try { 
  10.  
  11. // If the key wasn't in the "easy to compute" group, we need to 
  12.  
  13. // do things the hard way. 
  14.  
  15. cache.get(key, new Callable<Value>() { 
  16.  
  17. @Override 
  18.  
  19. public Value call() throws AnyException { 
  20.  
  21. return doThingsTheHardWay(key); 
  22.  
  23.  
  24. }); 
  25.  
  26. catch (ExecutionException e) { 
  27.  
  28. throw new OtherException(e.getCause()); 
  29.  

直接插入

可以直接使用 `cache.put(key, value)` 。這將覆蓋高速緩存中指定鍵的任何先前條目。也可以使用 `Cache.asMap()` 視圖公開的任何 `ConcurrentMap` 方法對緩存進行更改。注意,`asMap` 視圖上的任何方法都不會導致條目自動加載到緩存中。此外,該視圖上的原子操作在自動緩存加載范圍之外運行,因此在使用 `CacheLoader` 或 `Callable` 加載值的緩存中,始終應優(yōu)先選擇 `Cache.get(K, Callable<V>)` 而不是 `Cache.asMap().putIfAbsent` 。

驅逐

冷酷的現實是,我們幾乎肯定沒有足夠的內存來緩存我們可以緩存的所有內容。您必須決定:什么時候不值得保留緩存條目?Guava 提供三種基本的驅逐類型:基于大小的驅逐,基于時間的驅逐和基于引用的驅逐。

基于大小的驅逐

如果你的緩存在達到某個大小之后就不應該繼續(xù)增長,可以使用 `CacheBuilder.maximumSize(long)`。緩存將會嘗試驅逐最近最少使用的緩存數據實體。

警告:緩存可能會在大小達到限制之前驅逐實體——通常是在緩存大小接近限制時。

另外,如果不同的緩存實體具有不同的“權重”——比如,如果你的緩存值具有不同的內存空間占用——你可以使用 `CacheBuilder.weigher(Weigher)` 指定權重函數,同時使用 `CacheBuilder.maximumWeight(long)` 指定最大緩存權重。除了需要與 `maximumSize` 相同的限制外,請注意,權重是在條目創(chuàng)建時計算的,此后是靜態(tài)的。

  1. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
  2.  
  3. .maximumWeight(100000
  4.  
  5. .weigher(new Weigher<Key, Graph>() { 
  6.  
  7. public int weigh(Key k, Graph g) { 
  8.  
  9. return g.vertices().size(); 
  10.  
  11.  
  12. }) 
  13.  
  14. .build( 
  15.  
  16. new CacheLoader<Key, Graph>() { 
  17.  
  18. public Graph load(Key key) { // no checked exception 
  19.  
  20. return createExpensiveGraph(key); 
  21.  
  22.  
  23. }); 

基于時間的驅逐

  • `CacheBuilder` 提供了兩種基于時間的驅逐方法:
  • `expireAfterAccess(long, TimeUnit)` 僅在自從上次通過讀取或寫入訪問條目以來經過指定的持續(xù)時間后,條目才到期。請注意,驅逐條目的順序將類似于基于大小的驅逐。
  • `expireAfterWrite(long, TimeUnit)` 自創(chuàng)建條目以來經過指定的時間或該值的最新替換之后,使條目過期。如果經過一定時間后緩存的數據持續(xù)增長,則可能需要這樣做。

定時到期是在寫入過程中進行定期維護的,偶爾在讀取過程中進行維護,如下所述。

基于引用的驅逐

Guava 允許你設置你的緩存以允許數據實體的垃圾收集,通過對鍵或者值使用的 weak references ,或者對值使用的 soft references 進行設置。

  • `CacheBuilder.weakKeys()` 使用弱引用存儲鍵。這允許實體在沒有其他引用(強引用或者軟引用)指向其鍵時被垃圾收集。由于垃圾收集基于 id 相等規(guī)則,這就導致整個緩存多需要使用 id (`==`)相等來比較鍵,而不是使用 `equals()`。
  • `CacheBuilder.weakValues()` 使用弱引用存儲值。這允許實體在沒有其他引用(強引用或者軟引用)指向其值時被垃圾收集。由于垃圾收集基于 id 相等規(guī)則,這就導致整個緩存多需要使用 id (`==`)相等來比較值,而不是使用 `equals()`。
  • `CacheBuilder.softValues()` 將值包裝進入軟引用。軟引用對象以全局最近最少使用規(guī)則進行垃圾收集,以響應內存需求。由于使用軟引用可能會有些性能問題,我們通常推薦使用更加容易預測的 maximum cache size 替代。使用 `softValues()` 將導致值被通過 id (`==`) 相等比較,而不是使用 `equals()`。

顯式刪除

任何時刻,你都可以顯式廢除緩存實體,而不需要等待實體被驅逐。可以通過以下方法:

  • 單個廢除,使用 `Cache.invalidate(key)`
  • 批量廢除,使用 `Cache.invalidateAll(keys)`
  • 全部廢除,使用 `Cache.invalidateAll()`

清理何時發(fā)生?

用 `CacheBuilder` 構建的緩存不會“自動”或在值過期后立即執(zhí)行清除和逐出值,或類似的任何操作。取而代之的是,它在寫操作期間或偶爾進行的讀操作(如果很少進行寫操作)中執(zhí)行少量維護。

這樣做的原因如下:如果我們要連續(xù)執(zhí)行 `Cache` 維護,則需要創(chuàng)建一個線程,并且該線程的操作將與用戶操作競爭共享鎖。另外,某些環(huán)境限制了線程的創(chuàng)建,這會使 `CacheBuilder` 在該環(huán)境中無法使用。

相反,我們會將選擇權交給您。如果您的緩存是高吞吐量的,那么您不必擔心執(zhí)行緩存維護以清理過期的條目等。 如果您的緩存確實很少寫入,并且您不想清理來阻止緩存讀取,則您可能希望創(chuàng)建自己的維護線程,該線程定期調用 `Cache.cleanUp()`。

如果要為很少寫入的緩存安排定期的緩存維護,只需使用 `ScheduledExecutorService` 調度維護操作。

刷新

刷新與驅逐并不完全相同。如 `LoadingCache.refresh(K)` 所述,刷新鍵可能會異步加載該鍵的新值。與驅逐相反,舊鍵(如果有的話)在刷新鍵時仍會返回,這迫使檢索要等到重新加載該值。

如果刷新時引發(fā)異常,則將保留舊值,并記錄并吞下該異常。

`CacheLoader` 可以通過覆蓋 `CacheLoader.reload(K, V)` 指定某些將要在刷新時執(zhí)行的明智行為,它允許您在計算新值時使用舊值。

  1. // Some keys don't need refreshing, and we want refreshes to be done asynchronously. 
  2.  
  3. LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder() 
  4.  
  5. .maximumSize(1000
  6.  
  7. .refreshAfterWrite(1, TimeUnit.MINUTES) 
  8.  
  9. .build( 
  10.  
  11. new CacheLoader<Key, Graph>() { 
  12.  
  13. public Graph load(Key key) { // no checked exception 
  14.  
  15. return getGraphFromDatabase(key); 
  16.  
  17.  
  18. public ListenableFuture<Graph> reload(final Key key, Graph prevGraph) { 
  19.  
  20. if (neverNeedsRefresh(key)) { 
  21.  
  22. return Futures.immediateFuture(prevGraph); 
  23.  
  24. else { 
  25.  
  26. // asynchronous! 
  27.  
  28. ListenableFutureTask<Graph> task = ListenableFutureTask.create(new Callable<Graph>() { 
  29.  
  30. public Graph call() { 
  31.  
  32. return getGraphFromDatabase(key); 
  33.  
  34.  
  35. }); 
  36.  
  37. executor.execute(task); 
  38.  
  39. return task; 
  40.  
  41.  
  42.  
  43. }); 

可以使用 `CacheBuilder.refreshAfterWrite(long, TimeUnit)` 將自動定時刷新添加到緩存中。與 `expireAfterWrite` 相比,`refreshAfterWrite` 在指定的持續(xù)時間后將使鍵“具有資格”進行刷新,但實際上僅在查詢條目時才會啟動刷新。(如果將 `CacheLoader.reload` 實現為異步,則刷新不會降低查詢的速度。)因此,例如,您可以在同一緩存上同時指定 `refreshAfterWrite` 和 `expireAfterWrite`,以便只要條目符合刷新資格,就不會盲目地重置條目的過期計時器,因此,如果在符合刷新資格后不查詢條目,則允許它過期。

 

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

2014-09-26 14:30:41

2010-12-01 12:31:23

NetCat掃描端口

2009-07-21 14:16:18

Scalafor表達式

2013-04-11 10:51:27

2014-05-29 14:44:06

瑞士軍刀綜合征開發(fā)者

2017-05-03 14:45:45

MySQL數據恢復

2013-06-08 10:36:47

Linux命令行

2019-06-24 09:57:39

網絡工具調試

2023-12-25 12:03:42

2011-10-18 14:11:17

Web開發(fā)

2022-02-15 10:15:13

Web網絡程序員

2019-06-27 17:00:09

nc命令 Linux

2021-09-05 18:30:59

Alpine容器Busybox

2011-08-01 09:43:08

PhoneGap 1.PhoneGap

2023-04-27 07:06:09

Categraf夜鶯

2015-09-28 09:46:31

ZooKeeper分布式系統瑞士軍刀

2017-04-21 09:42:18

4G5G物聯網

2021-12-28 09:55:40

UbuntuRescuezillaLinux

2020-11-07 16:30:27

Python開發(fā)程序員

2009-09-09 12:10:40

點贊
收藏

51CTO技術棧公眾號

神马午夜精品91| 日本va中文字幕| 亚洲成a人片在线| 亚洲二区免费| 亚洲精品一区二区在线| 国产天堂在线播放| 动漫一区在线| 成人一区二区三区中文字幕| 欧美一二三视频| 欧美另类69xxxx| 免费观看亚洲天堂| 日韩欧美国产视频| 中文字幕一区二区三区5566| 黄色aaa毛片| 久久蜜桃精品| 久久亚洲国产精品| 三级黄色片网站| 国外成人福利视频| 亚洲成人免费电影| 亚洲高清乱码| 黄色片一区二区三区| 日韩精品亚洲专区| 欧美激情啊啊啊| 韩国三级hd中文字幕| 日韩精品成人在线观看| 色哟哟国产精品| 日本大片免费看| 狠狠狠综合7777久夜色撩人| 国产传媒一区在线| 国产精品嫩草影院久久久| 国产精品第二十页| 97精品中文字幕| 日韩精品在线视频观看| 妖精视频在线观看| 激情欧美一区二区三区黑长吊| 亚洲永久免费av| 亚洲高清视频一区| 日本在线视频1区| 国产99精品视频| 国产精品一区二区久久国产| 天天干在线播放| 你懂的国产精品永久在线| 一区二区三区亚洲| 国产ts丝袜人妖系列视频| 午夜电影一区| 欧美二区在线观看| 久久黄色片网站| 天天综合网天天| 欧美日韩中文字幕日韩欧美| 日韩精品免费一区| av免费在线观| 中文字幕制服丝袜一区二区三区| 欧美性色黄大片人与善| 色视频在线观看| 国产91丝袜在线播放九色| 成人免费自拍视频| 国产精品伦理一区| 激情五月播播久久久精品| 国产精品伦子伦免费视频| 在线观看免费av片| 亚洲专区在线| 91成人免费观看网站| 亚洲国产精品成人无久久精品| 亚洲人metart人体| 久久视频在线观看免费| 日韩欧美在线视频播放| 久久中文字幕av| 中文字幕日韩有码| 人人澡人人澡人人看| 99久久这里只有精品| 久久久成人的性感天堂| 我要看黄色一级片| 黄色亚洲大片免费在线观看| 欧美国产视频日韩| 五月天婷婷丁香| 亚洲免费黄色| 欧美在线视频一区二区| jizz国产在线| 美女一区二区久久| 91麻豆国产精品| 不卡视频在线播放| 成人免费视频免费观看| 久久久久se| 成年人在线观看网站| 国产精品卡一卡二| 国产高清不卡无码视频| 波多野结衣乳巨码无在线观看| 性久久久久久久久| aa免费在线观看| 99只有精品| 日韩一级片网址| 亚洲欧美综合视频| 欧美人与牛zoz0性行为| 中文字幕在线看视频国产欧美在线看完整 | 99re6在线精品视频免费播放| 亚洲国产成人高清精品| 日本在线观看a| 久久青草免费| 精品国产一区二区三区不卡| 国产精品无码一区二区三区| 99精品综合| 久久久爽爽爽美女图片| 成人h动漫精品一区二区下载| 美女视频一区二区| 国产精品国产三级国产专区53| 牛牛澡牛牛爽一区二区| 亚洲欧美一区二区视频| 日本日本19xxxⅹhd乱影响| 九色成人搞黄网站| 精品国产亚洲在线| 公肉吊粗大爽色翁浪妇视频| 欧美成人69av| 日韩av大片在线| 99热这里只有精品在线观看| 91麻豆精品视频| 天天成人综合网| 欧美a级在线观看| 7777精品伊人久久久大香线蕉的 | 日韩欧美国产成人| 男插女视频网站| 国产成人久久| 欧美激情极品视频| 中文字幕视频在线播放| 9色porny自拍视频一区二区| 一级做a爰片久久| 国产在线天堂www网在线观看| 欧美日韩国产高清一区二区| 亚洲最大的黄色网| 中文在线日韩| 国产精品久久电影观看| 人妻夜夜爽天天爽| ●精品国产综合乱码久久久久| 人妻少妇被粗大爽9797pw| 日韩在线网址| 日韩中文字幕在线精品| 日韩电影在线观看一区二区| 成人激情校园春色| 成人免费看片视频在线观看| 国产精品久久久久久久久免费高清 | 精品1区2区| 污污的网站在线免费观看| 欧美色综合久久| 在线观看福利片| 亚洲一区二区三区免费在线观看| 7777精品伊久久久大香线蕉语言 | 黄视频网站在线| 91国产精品成人| 亚洲一级中文字幕| 日本中文字幕高清| 精品中文在线| 色偷偷偷亚洲综合网另类| 无码人妻丰满熟妇精品| 91香蕉视频在线| 久久99中文字幕| 91亚洲无吗| 欧美极品在线视频| www.蜜桃av.com| 亚洲三级电影全部在线观看高清| 欧美在线aaa| 成人情趣视频| 国产精品免费久久久久影院| yjizz视频网站在线播放| 色视频欧美一区二区三区| 深爱五月激情网| 国产精品日韩久久久| 精品亚洲欧美日韩| 都市激情亚洲一区| 亚洲午夜精品久久久久久性色 | 色诱视频在线观看| 国产欧美日韩| 国产九九精品视频| 国产精品剧情一区二区在线观看| 欧美一区二区三区视频免费| 欧美极品视频在线观看| 成人手机在线视频| 日本日本19xxxⅹhd乱影响| 亚洲精品蜜桃乱晃| 国产精品成人一区二区三区吃奶| 91欧美在线视频| 欧美美女直播网站| 久久久久久久久99| 91免费精品国自产拍在线不卡| 久久精品.com| 成人免费看片39| 91日本视频在线| 青春草视频在线| 日韩国产一区三区| 波多野结衣视频在线观看| 国产精品第五页| 永久av免费在线观看| 影院欧美亚洲| 欧美日韩精品久久久免费观看| 欧美va视频| 久久久99久久精品女同性| 六月婷婷综合网| 一本色道久久加勒比精品| 国产主播av在线| 成人一二三区视频| 手机在线免费观看毛片| 欧美成人久久| 欧美污视频久久久| 亚洲国产视频二区| 国产999精品| 超碰人人在线| 精品偷拍一区二区三区在线看| 亚洲视频久久久| 亚洲午夜在线观看视频在线| 国产三级短视频| 成人免费黄色在线| 特级丰满少妇一级| 亚洲精品一二| 在线不卡视频一区二区| 欧美a级网站| 成人免费观看网址| 成人性生活av| 美女视频久久黄| 国产私拍精品| 日韩精品在线网站| 在线观看国产成人| 精品久久久久久久久久久久久久| 亚洲色偷偷综合亚洲av伊人| 91丨九色porny丨蝌蚪| 久久久久久久久久久久久久久国产 | 亚洲综合精品伊人久久| 欧美精品日日操| 欧美精品成人91久久久久久久| 成人在线播放视频| 亚洲精品国产精品国自产在线 | 国产欧美日韩综合| 真人bbbbbbbbb毛片| 国产精品影音先锋| 国产一二三区av| 午夜综合激情| 2019日韩中文字幕mv| 91精品国偷自产在线电影 | 成人免费一级视频| 在线不卡中文字幕| 在线免费一级片| 在线中文字幕一区二区| 在线观看免费国产视频| 亚洲一区二区三区在线看| 国产麻豆视频在线观看| 中文字幕精品一区二区三区精品| www.av欧美| 91蜜桃婷婷狠狠久久综合9色| 国产精品偷伦视频免费观看了| 精品一区二区三区日韩| 男人添女人下面免费视频| 久久一日本道色综合久久| 九色在线视频观看| 亚洲激情另类| 妺妺窝人体色777777| 欧美午夜免费影院| 欧美激情亚洲天堂| 亚洲午夜激情在线| 国产 欧美 日韩 一区| 欧美精品大片| 欧美精品在欧美一区二区| 欧美黄色大片网站| 日韩小视频网站| 伊人精品成人久久综合软件| 亚洲精品蜜桃久久久久久| 狠狠久久婷婷| 男人插女人视频在线观看| 亚洲国产免费| 国产精品久久中文字幕| 一本色道久久综合一区 | 久久综合久久色| 欧美性受ⅹ╳╳╳黑人a性爽| 美日韩在线视频| 日皮视频在线观看| 久久久欧美一区二区| 99re6在线精品视频免费播放| 91精品国产色综合久久不卡98| 日本在线影院| 国产盗摄xxxx视频xxx69| 四虎4545www精品视频| 国产欧美亚洲视频| 日本一区二区三区播放| 国产精品一级久久久| 天天躁日日躁成人字幕aⅴ| 欧美在线播放一区| 亚洲九九视频| 久久精品国产sm调教网站演员| 亚洲欧美高清| 污色网站在线观看| 大尺度一区二区| 亚洲国产无码精品| 中文字幕亚洲一区二区va在线| 欧美毛片在线观看| 狠狠色噜噜狠狠狠狠97| 夜夜嗨aⅴ一区二区三区| 精品剧情在线观看| 免费在线黄色网址| 久久精品视频免费播放| av免费在线视| 国产精品久久在线观看| julia中文字幕一区二区99在线| 乱一区二区三区在线播放| 欧美一区二区三| 国产成人亚洲综合无码| 日韩vs国产vs欧美| 中文字幕在线播放一区二区| 久久女同精品一区二区| 九九精品视频免费| 懂色aⅴ精品一区二区三区蜜月| 91麻豆国产在线| 亚洲激情在线观看| 日韩专区在线| 性色av一区二区三区免费 | 国产精品欧美日韩| 99精品中文字幕在线不卡| 午夜精品福利一区二区| 黄色另类av| 中文字幕第100页| 99久久精品99国产精品| 国产三级精品三级观看| 欧美日韩亚洲国产一区| 国产三级视频在线播放| 亚洲天堂av在线免费| 日韩精品分区| 国产精品久久久久久五月尺| 人妖一区二区三区| 日本人妻伦在线中文字幕| 麻豆91在线观看| 在线观看福利片| 亚洲一区在线观看网站| 国产精品无码在线播放| 亚洲色图第一页| 国产夫妻在线| av成人观看| 国产大片一区| 三级a在线观看| 久久久久久久久久久久久女国产乱| 久久久久无码国产精品| 6080国产精品一区二区| 超碰国产在线| 日韩美女写真福利在线观看| 精品三级av在线导航| 成人免费a级片| 国产一区二区影院| 极品美妇后花庭翘臀娇吟小说| 91国偷自产一区二区三区观看| 五月婷婷狠狠干| 性视频1819p久久| 欧美老熟妇乱大交xxxxx| 国产午夜三级一区二区三| 久久久久久久黄色片| 精品国产乱子伦一区| 青草av在线| 亚洲综合精品伊人久久| 一本一道久久综合狠狠老| 日本在线播放一区二区| 中文字幕一区免费在线观看| 伊人久久亚洲综合| 自拍偷拍亚洲精品| 久久久加勒比| 一区二区不卡视频| 激情六月婷婷久久| 91高清免费观看| 91精品国产麻豆| 性xxxfreexxxx性欧美| 国产福利不卡| 日韩视频一区| 欧美性猛交乱大交| 亚洲一区在线观看免费| 熟妇人妻系列aⅴ无码专区友真希| 91精品国产91| 国产99精品| 人人干人人视频| 国产精品美女久久久久av爽李琼 | 日本韩国欧美超级黄在线观看| 人妻久久久一区二区三区| 91玉足脚交白嫩脚丫在线播放| 午夜免费久久看| 吴梦梦av在线| 先锋影音久久| 波多野结衣片子| 欧美日韩日日摸| а√天堂在线官网| 俄罗斯精品一区二区三区| 伊人狠狠色j香婷婷综合| 亚洲天堂网一区二区| 在线影院国内精品| 激情在线小视频| 97在线电影| 亚洲永久视频| 色www亚洲国产阿娇yao| 日本韩国精品在线| 日本中文字幕在线视频| 国产a级全部精品| 精品国产乱码久久久久久蜜坠欲下| 97av视频在线观看| 国产精品美女久久久久av爽李琼| 精品人妻一区二区三区浪潮在线| 最近中文字幕2019免费| 中文字幕一区图| 色婷婷综合久久久久中文字幕 | 激情欧美一区二区三区| 亚洲区自拍偷拍|