国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

[[332051]]

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

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

依賴

使用 Maven 進(jìn)行項(xiàng)目構(gòu)建時(shí),添加下面的依賴:

  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 進(jìn)行項(xiàng)目構(gòu)建時(shí),添加下面的依賴:

  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. }); 

適用性

緩存有非常廣泛的應(yīng)用場景。比如,你應(yīng)該為那些計(jì)算或者查詢代價(jià)高昂的數(shù)據(jù)使用緩存,或者你需要某個(gè)輸入數(shù)據(jù)很多次的場景。

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

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

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

如果這些都適用于您的應(yīng)用場景,那么 Guava 緩存實(shí)用程序?qū)⒑苓m合您!

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

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

填充

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

使用 CacheLoader

`LoadingCache` 是一個(gè)通過附屬的 `CacheLoader` 構(gòu)建的 `Cache`。創(chuàng)建一個(gè) `CacheLoader` 通常與實(shí)現(xiàn) `V load(K key) throws Exception` 方法一樣。因此,比如,你可以使用下面的代碼創(chuàng)建一個(gè) `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)` 方法。這將返回一個(gè)已經(jīng)緩存的值,或者使用緩存的 `CacheLoader` 原子地將新值加載到緩存中。由于 `CacheLoader` 可能會拋出 `Exception`,因此 `LoadingCache.get(K)` 會拋出 `ExecutionException`。(如果緩存加載器拋出 unchecked 異常,則`get(K)` 會引發(fā)包裝了 `UncheckedExecutionException` 的異常。)您還可以選擇使用 `getUnchecked(K)` 將所有異常包裝在 `UncheckedExecutionException` 中, 但是如果底層的 `CacheLoader` 通常會拋出受檢查異常,這可能會導(dǎo)致令人驚訝的行為。

  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í)行批量查找。默認(rèn)情況下,`getAll` 將為緩存中不存在的每個(gè)鍵單獨(dú)發(fā)出 `CacheLoader.load` 調(diào)用。如果批量檢索比許多單個(gè)查詢更有效,則可以覆蓋 `CacheLoader.loadAll` 來利用這一點(diǎn)。 `getAll(Iterable)` 的性能將相應(yīng)提高。

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

使用 Callable

所有 Guava 緩存(無論是否加載)均支持方法 `get(K, Callable)`。此方法返回與緩存中的鍵關(guān)聯(lián)的值,或從指定的 `Callable` 中計(jì)算出該值并將其添加到緩存中。在加載完成之前,不會修改與此緩存關(guān)聯(lián)的可觀察狀態(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` 方法對緩存進(jìn)行更改。注意,`asMap` 視圖上的任何方法都不會導(dǎo)致條目自動加載到緩存中。此外,該視圖上的原子操作在自動緩存加載范圍之外運(yùn)行,因此在使用 `CacheLoader` 或 `Callable` 加載值的緩存中,始終應(yīng)優(yōu)先選擇 `Cache.get(K, Callable<V>)` 而不是 `Cache.asMap().putIfAbsent` 。

驅(qū)逐

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

基于大小的驅(qū)逐

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

警告:緩存可能會在大小達(dá)到限制之前驅(qū)逐實(shí)體——通常是在緩存大小接近限制時(shí)。

另外,如果不同的緩存實(shí)體具有不同的“權(quán)重”——比如,如果你的緩存值具有不同的內(nèi)存空間占用——你可以使用 `CacheBuilder.weigher(Weigher)` 指定權(quán)重函數(shù),同時(shí)使用 `CacheBuilder.maximumWeight(long)` 指定最大緩存權(quán)重。除了需要與 `maximumSize` 相同的限制外,請注意,權(quán)重是在條目創(chuàng)建時(shí)計(jì)算的,此后是靜態(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. }); 

基于時(shí)間的驅(qū)逐

  • `CacheBuilder` 提供了兩種基于時(shí)間的驅(qū)逐方法:
  • `expireAfterAccess(long, TimeUnit)` 僅在自從上次通過讀取或?qū)懭朐L問條目以來經(jīng)過指定的持續(xù)時(shí)間后,條目才到期。請注意,驅(qū)逐條目的順序?qū)㈩愃朴诨诖笮〉尿?qū)逐。
  • `expireAfterWrite(long, TimeUnit)` 自創(chuàng)建條目以來經(jīng)過指定的時(shí)間或該值的最新替換之后,使條目過期。如果經(jīng)過一定時(shí)間后緩存的數(shù)據(jù)持續(xù)增長,則可能需要這樣做。

定時(shí)到期是在寫入過程中進(jìn)行定期維護(hù)的,偶爾在讀取過程中進(jìn)行維護(hù),如下所述。

基于引用的驅(qū)逐

Guava 允許你設(shè)置你的緩存以允許數(shù)據(jù)實(shí)體的垃圾收集,通過對鍵或者值使用的 weak references ,或者對值使用的 soft references 進(jìn)行設(shè)置。

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

顯式刪除

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

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

清理何時(shí)發(fā)生?

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

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

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

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

刷新

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

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

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

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

 

責(zé)任編輯:張燕妮 來源: 今日頭條
相關(guān)推薦

2014-09-26 14:30:41

2010-12-01 12:31:23

NetCat掃描端口

2009-07-21 14:16:18

Scalafor表達(dá)式

2013-04-11 10:51:27

2014-05-29 14:44:06

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

2013-06-08 10:36:47

Linux命令行

2017-05-03 14:45:45

MySQL數(shù)據(jù)恢復(fù)

2019-06-24 09:57:39

網(wǎng)絡(luò)工具調(diào)試

2023-12-25 12:03:42

2019-06-27 17:00:09

nc命令 Linux

2011-10-18 14:11:17

Web開發(fā)

2022-02-15 10:15:13

Web網(wǎng)絡(luò)程序員

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分布式系統(tǒng)瑞士軍刀

2017-04-21 09:42:18

4G5G物聯(lián)網(wǎng)

2021-12-28 09:55:40

UbuntuRescuezillaLinux

2020-11-07 16:30:27

Python開發(fā)程序員

2009-09-09 12:10:40

點(diǎn)贊
收藏

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

亚洲女人初尝黑人巨大| 蜜臀久久久久久久| 欧美日韩国产一区二区在线观看| 直接在线观看的三级网址| 91国偷自产一区二区三区观看| 久久艳片www.17c.com| 成人激情视频| 国产精品va视频| 91蜜桃视频在线| 亚洲电影免费观看高清完整版在线| 精品亚洲一区二区三区在线观看| 日本视频久久久| 免费日韩电影在线观看| 91麻豆国产在线观看| 国产精品视频入口| 美女写真久久影院| 亚洲精品国产电影| 综合中文字幕| 亚洲欧美日韩小说| 欧美亚洲免费| 欧美成人一区二区在线| 高清毛片在线观看| 国产youjizz在线| 国产精品资源在线| 成人一区二区三| 经典一区二区| 最近2019中文字幕第三页视频 | 亚洲一区二区三区sesese| 中文字幕一区久| 青草国产精品久久久久久| 欧美另类老女人| 99精品欧美| 最近2019年中文视频免费在线观看 | 欧美伦理视频在线观看| 国产欧美在线一区| 亚洲精品ww久久久久久p站| 导航福利在线| 26uuu国产一区二区三区| 无码毛片aaa在线| 麻豆国产欧美日韩综合精品二区| 国产午夜精品在线| 亚洲视频久久| aa成人免费视频| 欧美jjzz| 成人在线观看av| 亚洲激情欧美| 淫片在线观看| 天天射综合影视| 国产又黄又猛视频| 国产精品免费一区二区三区观看| 欧美午夜寂寞| 欧美激情视频一区二区三区不卡| 伦一区二区三区中文字幕v亚洲| 亚洲人高潮女人毛茸茸| 一区二区视频免费完整版观看| 欧美精品一区二区三区视频| 91九色国产在线播放| 精品亚洲夜色av98在线观看| av一区在线| 美女久久久久久久久久久| www.成人| 久久青草精品视频免费观看| 夜夜春成人影院| 国产香蕉视频在线观看| 色婷婷久久久综合中文字幕| 日韩精品一区二区在线| 影音先锋在线播放| 91亚洲男人天堂| 日本免费在线一区| 亚洲美女中文字幕| 欧美激情图区| 欧美性xxxxhd| 欧美性天天影视| 亚洲国产精品va在线观看黑人| 黑人玩欧美人三根一起进| 欧美在线性爱视频| 国产精品wwwwww| 国产一区二区成人久久免费影院| 一区二区三区四区| 曰韩少妇与小伙激情| 中文字幕巨乱亚洲| 四虎在线免费观看| 欧美最顶级丰满的aⅴ艳星| av伊人久久| 疯狂做受xxxⅹ高潮视频免费| 韩国三级在线一区| 136国产福利精品导航网址应用| 国产精品久久精品国产| 热久久久久久久| 郴州新闻综合频道在线直播| 日韩免费在线播放| 日本欧美一区二区| 亚洲精品一区二| 国产成人精品影视| 亚洲91中文字幕无线码三区| 蜜桃在线一区二区三区精品| 亚洲欧美国产va在线影院| 韩日精品一区| 亚洲人成电影网站色…| 色女孩综合影院| 中文精品久久| av小说在线| 欧美电影影音先锋| xxxx一级片| 色综合中文字幕国产| 欧美亚洲日本精品| 欧美亚洲国产日本| 日韩主播视频在线| 国产xxxxx| 亚洲国产成人久久| 琪琪久久久久日韩精品| 视频一区视频二区视频三区视频四区国产 | 四季av一区二区凹凸精品| 国产电影一区二区三区| 蜜桃视频成人| 亚洲欧洲另类| 国产在线精品一区免费香蕉| 欧美中文一区二区| 翡翠波斯猫1977年美国| 国产婷婷精品| 日韩精品一区二区三区四区五区 | 粉嫩高清一区二区三区精品视频| 国产美女一区二区三区| 九九热在线免费| 亚洲毛片av在线| 你懂的视频欧美| 日本在线观看免费| 尤物视频在线观看| 欧美一区二区三区的| 日本天堂一区| 亚洲国产欧洲综合997久久| 亚洲午夜视频在线| 精品国产第一国产综合精品| 国产日产精品一区二区三区四区| 国产精品久久国产精麻豆99网站| 成人在线观看网站| 欧美在线一区二区三区四| 国产老女人精品毛片久久| 校园春色影音先锋| 亚洲国产小视频| 影音先锋久久资源网| 粉嫩av一区二区三区天美传媒| 激情懂色av一区av二区av| 男人亚洲天堂| 欧美少妇一区二区三区| 欧美久久久久免费| 亚洲成av人片乱码色午夜| 不卡av免费在线| 亚洲欧美激情视频| 激情久久久久久| 成人在线观看a| 亚洲国产精品va| 午夜久久久久| 最近最好的中文字幕2019免费 | 欧美激情免费看| 经典三级在线一区| av在线free| 蜜桃999成人看片在线观看| 色综合天天综合狠狠| 日韩精品2区| 国产91久久久久蜜臀青青天草二| 91av视频在线观看| 国产精品另类一区| 欧美激情99| 成人短剧在线观看| 97超碰蝌蚪网人人做人人爽| 久久综合久久99| 国产精品99| 成人免费播放器| 这里精品视频免费| 国产美女在线观看一区| 在线观看黄av| 成人免费视频网| 亚洲精品国产视频| 久久av免费| 在线播放网站| 粉嫩av免费一区二区三区| 欧美性淫爽ww久久久久无| 一本久道久久综合狠狠爱| 国内精品久久久久久野外| 日本亚洲导航| 日韩av在线免费观看| 国产一区二区0| 亚洲国产中文在线二区三区免| 天天爱天天操天天干| 91国产高清在线| 一级女性全黄久久生活片免费| 日韩啪啪电影网| 中国日本在线视频中文字幕| 国产精品二区二区三区| 欧美图区在线视频| 亚洲精选91| 国产粉嫩在线观看| 妞干网在线观看视频| 国自产精品手机在线观看视频| 亚洲在线观看免费| 欧美日韩亚洲国产精品| 在线视频超级| 国产乱妇乱子| 国产欧美日韩最新|