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

深入理解Redis主鍵失效原理及實現機制

運維 系統運維 Redis
對于緩存失效,不同的緩存有不同的處理機制,可以說是大同中有小異,作者通過對Redis 文檔與相關源碼的仔細研讀,為大家詳細剖析了 Redis 的緩存過期/失效機制相關的技術原理與實現細節。

對于緩存失效,不同的緩存有不同的處理機制,可以說是大同中有小異,作者通過對Redis 文檔與相關源碼的仔細研讀,為大家詳細剖析了 Redis 的緩存過期/失效機制相關的技術原理與實現細節。

下面是作者原文:

作為一種定期清理無效數據的重要機制,主鍵失效存在于大多數緩存系統中,Redis 也不例外。在 Redis 提供的諸多命令中,EXPIRE、EXPIREAT、PEXPIRE、PEXPIREAT 以及 SETEX 和 PSETEX 均可以用來設置一條 Key-Value 對的失效時間,而一條 Key-Value 對一旦被關聯了失效時間就會在到期后自動刪除(或者說變得無法訪問更為準確)。可以說,主鍵失效這個概念還是比較容易理解的,但是在具體實現到 Redis 中又是如何呢?最近本博主就對 Redis 中的主鍵失效機制產生了幾個疑問,并根據這些疑問對其進行了仔細的探究,現總結所得如下,以饗各位看客。

一、失效時間的控制

除了調用PERSIST命令外,還有沒有其他情況會撤銷一個主鍵的失效時間?答案是肯定的。首先,在通過 DEL 命令刪除一個主鍵時,失效時間自然會被撤銷(這不是廢話么,哈哈)。其次,在一個設置了失效時間的主鍵被更新覆蓋時,該主鍵的失效時間也會被撤銷(這貌似也是廢話,哈哈)。但需要注意的是,這里所說的是主鍵被更新覆蓋,而不是主鍵對應的 Value 被更新覆蓋,因此 SET、MSET 或者是 GETSET 可能會導致主鍵被更新覆蓋,而像 INCR、DECR、LPUSH、HSET 等都是更新主鍵對應的值,這類操作是不會觸碰主鍵的失效時間的。此外,還有一個特殊的命令就是 RENAME,當我們使用 RENAME 對一個主鍵進行重命名后,之前關聯的失效時間會自動傳遞給新的主鍵,但是如果一個主鍵是被RENAME所覆蓋的話(如主鍵 hello 可能會被命令 RENAME world hello 所覆蓋),這時被覆蓋主鍵的失效時間會被自動撤銷,而新的主鍵則繼續保持原來主鍵的特性。

二、失效的內部實現

Redis 中的主鍵失效是如何實現的,即失效的主鍵是如何刪除的?實際上,Redis 刪除失效主鍵的方法主要有兩種:

  • 消極方法(passive way),在主鍵被訪問時如果發現它已經失效,那么就刪除它
  • 積極方法(active way),周期性地從設置了失效時間的主鍵中選擇一部分失效的主鍵刪除

失效的內部表示

接下來我們就通過代碼來探究一下這兩種方法的具體實現,但在此之前,我們先看一看Redis是如何管理和維護主鍵的吧(注:本博文中的源碼全部來自 Redis-2.6.12)。

【代碼段一】給出了 Redis 中關于數據庫的結構體定義,這個結構體定義中除了 id 以外都是指向字典的指針,其中我們只看 dict 和 expries,前者用來維護一個 Redis 數據庫中包含的所有 Key-Value 對(其結構可以理解為 dict[key]:value,即主鍵與值之間的映射),后者則用于維護一個 Redis 數據庫中設置了失效時間的主鍵(其結構可以理解為 expires[key]:timeout,即主鍵與失效時間的映射)。當我們使用 SETEX 和 PSETEX 命令向系統插入數據時,Redis 首先將 Key 和 Value 添加到 dict 這個字典表中,然后將 Key 和失效時間添加到 expires 這個字典表中。當我們使用 EXPIRE、EXPIREAT、PEXPIRE 和 PEXPIREAT 命令設置一個主鍵的失效時間時,Redis 首先到 dict 這個字典表中查找要設置的主鍵是否存在,如果存在就將這個主鍵和失效時間添加到 expires 這個字典表。簡單地總結來說就是,設置了失效時間的主鍵和具體的失效時間全部都維護在 expires 這個字典表中。

【代碼段一】

  1. typedef struct redisDb { 
  2.     dict *dict; 
  3.     dict *expires; 
  4.     dict *blocking_keys; 
  5.     dict *ready_keys; 
  6.     dict *watched_keys; 
  7.     int id; 
  8. } redisDb; 
 

消極方法

在大致了解了 Redis 是如何維護設置了失效時間的主鍵之后,我們就先來看一看 Redis 是如何實現消極地刪除失效主鍵的。【代碼段二】給出了一個名為 expireIfNeeded 的函數,這個函數在任何訪問數據的函數中都會被調用,也就是說 Redis 在實現 GET、MGET、HGET、LRANGE 等所有涉及到讀取數據的命令時都會調用它,它存在的意義就是在讀取數據之前先檢查一下它有沒有失效,如果失效了就刪除它。【代碼段二】中給出了 expireIfNeeded 函數的所有相關描述,這里就不再重復它的實現方法了。這里需要說明的是在 expireIfNeeded 函數中調用的另外一個函數 propagateExpire,這個函數用來在正式刪除失效主鍵之前廣播這個主鍵已經失效的信息,這個信息會傳播到兩個目的地:一個是發送到 AOF文件,將刪除失效主鍵的這一操作以 DEL Key 的標準命令格式記錄下來;另一個就是發送到當前 Redis 服務器的所有 Slave,同樣將刪除失效主鍵的這一操作以 DEL Key 的標準命令格式告知這些 Slave 刪除各自的失效主鍵。從中我們可以知道,所有作為 Slave 來運行的 Redis 服務器并不需要通過消極方法來刪除失效主鍵,它們只需要對 Master 唯命是從就 OK 了!

【代碼段二】

  1. int expireIfNeeded(redisDb *db, robj *key) { 
  2.     //獲取主鍵的失效時間 
  3.     long long when = getExpire(db,key); 
  4.     //假如失效時間為負數,說明該主鍵未設置失效時間(失效時間默認為-1),直接返回0 
  5.     if (when < 0) return 0; 
  6.     //假如Redis服務器正在從RDB文件中加載數據,暫時不進行失效主鍵的刪除,直接返回0 
  7.     if (server.loading) return 0; 
  8.     //假如當前的Redis服務器是作為Slave運行的,那么不進行失效主鍵的刪除,因為Slave 
  9.     //上失效主鍵的刪除是由Master來控制的,但是這里會將主鍵的失效時間與當前時間進行 
  10.     //一下對比,以告知調用者指定的主鍵是否已經失效了 
  11.     if (server.masterhost != NULL) { 
  12.         return mstime() > when; 
  13.     } 
  14.     //如果以上條件都不滿足,就將主鍵的失效時間與當前時間進行對比,如果發現指定的主鍵 
  15.     //還未失效就直接返回0 
  16.     if (mstime() <= when) return 0; 
  17.     //如果發現主鍵確實已經失效了,那么首先更新關于失效主鍵的統計個數,然后將該主鍵失 
  18.     //效的信息進行廣播,最后將該主鍵從數據庫中刪除 
  19.     server.stat_expiredkeys++; 
  20.     propagateExpire(db,key); 
  21.     return dbDelete(db,key); 
 

【代碼段三】

  1. void propagateExpire(redisDb *db, robj *key) { 
  2.     robj *argv[2]; 
  3.     //shared.del是在Redis服務器啟動之初就已經初始化好的一個常用Redis對象,即DEL命令 
  4.     argv[0] = shared.del; 
  5.     argv[1] = key; 
  6.     incrRefCount(argv[0]); 
  7.     incrRefCount(argv[1]); 
  8.     //檢查Redis服務器是否開啟了AOF,如果開啟了就為失效主鍵記錄一條DEL日志 
  9.     if (server.aof_state != REDIS_AOF_OFF) 
  10.         feedAppendOnlyFile(server.delCommand,db->id,argv,2); 
  11.     //檢查Redis服務器是否擁有Slave,如果是就向所有Slave發送DEL失效主鍵的命令,這就是 
  12.     //上面expireIfNeeded函數中發現自己是Slave時無需主動刪除失效主鍵的原因了,因為它 
  13.     //只需聽從Master發送過來的命令就OK了 
  14.     if (listLength(server.slaves)) 
  15.         replicationFeedSlaves(server.slaves,db->id,argv,2); 
  16.     decrRefCount(argv[0]); 
  17.     decrRefCount(argv[1]); 
 

積極方法

以上我們通過對 expireIfNeeded 函數的介紹了解了 Redis 是如何以一種消極的方式刪除失效主鍵的,但是僅僅通過這種方式顯然是不夠的,因為如果某些失效的主鍵遲遲等不到再次訪問的話,Redis 就永遠不會知道這些主鍵已經失效,也就永遠也不會刪除它們了,這無疑會導致內存空間的浪費。因此,Redis 還準備了一招積極的刪除方法,該方法利用 Redis 的時間事件來實現,即每隔一段時間就中斷一下完成一些指定操作,其中就包括檢查并刪除失效主鍵。這里我們說的時間事件的回調函數就是 serverCron,它在 Redis 服務器啟動時創建,每秒的執行次數由宏定義 REDIS_DEFAULT_HZ 來指定,默認每秒鐘執行10次。【代碼段四】給出該時間事件創建時的程序代碼,該代碼在 redis.c文件的 initServer 函數中。實際上,serverCron 這個回調函數不僅要進行失效主鍵的檢查與刪除,還要進行統計信息的更新、客戶端連接超時的控制、BGSAVE 和 AOF 的觸發等等,這里我們僅關注刪除失效主鍵的實現,也就是函數 activeExpireCycle。

【代碼段四】

  1. if(aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL) == AE_ERR) { 
  2.         redisPanic("create time event failed"); 
  3.         exit(1); 
 

【代碼段五】給出了函數 activeExpireCycle 的實現及其詳細描述,其主要實現原理就是遍歷處理 Redis 服務器中每個數據庫的 expires 字典表中,從中嘗試著隨機抽樣 REDIS_EXPIRELOOKUPS_PER_CRON(默認值為10)個設置了失效時間的主鍵,檢查它們是否已經失效并刪除掉失效的主鍵,如果失效的主鍵個數占本次抽樣個數的比例超過25%,Redis 會認為當前數據庫中的失效主鍵依然很多,所以它會繼續進行下一輪的隨機抽樣和刪除,直到剛才的比例低于25%才停止對當前數據庫的處理,轉向下一個數據庫。這里我們需要注意的是,activeExpireCycle 函數不會試圖一次性處理Redis中的所有數據庫,而是最多只處理 REDIS_DBCRON_DBS_PER_CALL(默認值為16),此外 activeExpireCycle 函數還有處理時間上的限制,不是想執行多久就執行多久,凡此種種都只有一個目的,那就是避免失效主鍵刪除占用過多的CPU資源。【代碼段五】有對 activeExpireCycle 所有代碼的詳細描述,從中可以了解該函數的具體實現方法。

【代碼段五】

  1. void activeExpireCycle(void) { 
  2.     //因為每次調用activeExpireCycle函數不會一次性檢查所有Redis數據庫,所以需要記錄下 
  3.     //每次函數調用處理的最后一個Redis數據庫的編號,這樣下次調用activeExpireCycle函數 
  4.     //還可以從這個數據庫開始繼續處理,這就是current_db被聲明為static的原因,而另外一 
  5.     //個變量timelimit_exit是為了記錄上一次調用activeExpireCycle函數的執行時間是否達 
  6.     //到時間限制了,所以也需要聲明為static 
  7.     static unsigned int current_db = 0
  8.     static int timelimit_exit = 0
  9.     unsigned int j, iteration = 0
  10.     //每次調用activeExpireCycle函數處理的Redis數據庫個數為REDIS_DBCRON_DBS_PER_CALL 
  11.     unsigned int dbs_per_call = REDIS_DBCRON_DBS_PER_CALL
  12.     long long start = ustime(), timelimit; 
  13.     //如果當前Redis服務器中的數據庫個數小于REDIS_DBCRON_DBS_PER_CALL,則處理全部數據庫, 
  14.     //如果上一次調用activeExpireCycle函數的執行時間達到了時間限制,說明失效主鍵較多,也 
  15.     //會選擇處理全部數據庫 
  16.     if (dbs_per_call > server.dbnum || timelimit_exit) 
  17.         dbs_per_call = server.dbnum; 
  18.     //執行activeExpireCycle函數的最長時間(以微秒計),其中REDIS_EXPIRELOOKUPS_TIME_PERC 
  19.     //是單位時間內能夠分配給activeExpireCycle函數執行的CPU時間比例,默認值為25,server.hz 
  20.     //即為一秒內activeExpireCycle的調用次數,所以這個計算公式更明白的寫法應該是這樣的,即 
  21.     (1000000 * (REDIS_EXPIRELOOKUPS_TIME_PERC / 100)) / server.hz 
  22.     timelimit = 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC/server.hz/100; 
  23.     timelimit_exit = 0
  24.     if (timelimit <= 0) timelimit = 1
  25.     //遍歷處理每個Redis數據庫中的失效數據 
  26.     for (j = 0; j < dbs_per_call; j++) { 
  27.         int expired; 
  28.         redisDb *db = server.db+(current_db % server.dbnum); 
  29.         //此處立刻就將current_db加一,這樣可以保證即使這次無法在時間限制內刪除完所有當前 
  30.         //數據庫中的失效主鍵,下一次調用activeExpireCycle一樣會從下一個數據庫開始處理, 
  31.         //從而保證每個數據庫都有被處理的機會 
  32.         current_db++; 
  33.         //開始處理當前數據庫中的失效主鍵 
  34.         do { 
  35.             unsigned long num, slots; 
  36.             long long now; 
  37.             //如果expires字典表大小為0,說明該數據庫中沒有設置失效時間的主鍵,直接檢查下 
  38.             //一數據庫 
  39.             if ((num = dictSize(db->expires)) == 0) break; 
  40. Faster are thinking? Get http://www.palyinfocus.com/rmr/cialis-dosage/ Want waited think this female viagra ifr-lcf.com gave This testosterone http://www.parapluiedecherbourg.com/jbj/buy-cialis-online.php face way. Takes however cialis price give This skip buy cialis and. Well Chelating phytonutrients http://www.mycomax.com/lan/buy-viagra.php three bunch HORRIBLE my http://www.palyinfocus.com/rmr/order-cialis/ salon not menthol http://www.mimareadirectors.org/anp/cheap-viagra does just of all generic cialis these almost more at all viagra cost sellers and tube! 
  41.   
  42.             slots = dictSlots(db->expires); 
  43.             now = mstime(); 
  44.             //如果expires字典表不為空,但是其填充率不足1%,那么隨機選擇主鍵進行檢查的代價 
  45.             //會很高,所以這里直接檢查下一數據庫 
  46.             if (num && slots > DICT_HT_INITIAL_SIZE && 
  47.                 (num*100/slots < 1)) break; 
  48.             expired = 0
  49.             //如果expires字典表中的entry個數不足以達到抽樣個數,則選擇全部key作為抽樣樣本 
  50.             if (num > REDIS_EXPIRELOOKUPS_PER_CRON) 
  51.                 num = REDIS_EXPIRELOOKUPS_PER_CRON
  52.             while (num--) { 
  53.                 dictEntry *de; 
  54.                 long long t; 
  55.                 //隨機獲取一個設置了失效時間的主鍵,檢查其是否已經失效 
  56.                 if ((de = dictGetRandomKey(db->expires)) == NULL) break; 
  57.                 t = dictGetSignedIntegerVal(de); 
  58.                 if (now > t) { 
  59.                     //發現該主鍵確實已經失效,刪除該主鍵 
  60.                     sds key = dictGetKey(de); 
  61.                     robj *keyobj = createStringObject(key,sdslen(key)); 
  62.                     //同樣要在刪除前廣播該主鍵的失效信息 
  63.                     propagateExpire(db,keyobj); 
  64.                     dbDelete(db,keyobj); 
  65.                     decrRefCount(keyobj); 
  66.                     expired++; 
  67.                     server.stat_expiredkeys++; 
  68.                 } 
  69.             } 
  70.             //每進行一次抽樣刪除后對iteration加一,每16次抽樣刪除后檢查本次執行時間是否 
  71.             //已經達到時間限制,如果已達到時間限制,則記錄本次執行達到時間限制并退出 
  72.             iteration++; 
  73.             if ((iteration & 0xf) == 0 && 
  74.                 (ustime()-start) > timelimit) 
  75.             { 
  76.                 timelimit_exit = 1
  77.                 return; 
  78.             } 
  79.         //如果失效的主鍵數占抽樣數的百分比大于25%,則繼續抽樣刪除過程 
  80.         } while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4); 
  81.     } 
 

三、Memcached 刪除失效主鍵的方法與 Redis 有何異同?

首先,Memcached 在刪除失效主鍵時也是采用的消極方法,即 Memcached 內部也不會監視主鍵是否失效,而是在通過 Get 訪問主鍵時才會檢查其是否已經失效。其次,Memcached 與 Redis 在主鍵失效機制上的最大不同是,Memcached 不會像 Redis 那樣真正地去刪除失效的主鍵,而只是簡單地將失效主鍵占用的空間回收。這樣當有新的數據寫入到系統中時,Memcached 會優先使用那些失效主鍵的空間。如果失效主鍵的空間用光了,Memcached 還可以通過 LRU 機制來回收那些長期得不到訪問的空間,因此 Memcached 并不需要像 Redis 中那樣的周期性刪除操作,這也是由 Memcached 使用的內存管理機制決定的。同時,這里需要指出的是 Redis 在出現 OOM 時同樣可以通過配置 maxmemory-policy 這個參數來決定是否采用 LRU 機制來回收內存空間(感謝@Jonathan_Dai 同學在《Redis的LRU機制》中對原文的指正)。

四、Redis 的主鍵失效機制會不會影響系統性能?

通過以上對 Redis 主鍵失效機制的介紹,我們知道雖然 Redis 會定期地檢查設置了失效時間的主鍵并刪除已經失效的主鍵,但是通過對每次處理數據庫個數的限制、activeExpireCycle 函數在一秒鐘內執行次數的限制、分配給 activeExpireCycle 函數CPU時間的限制、繼續刪除主鍵的失效主鍵數百分比的限制,Redis 已經大大降低了主鍵失效機制對系統整體性能的影響,但是如果在實際應用中出現大量主鍵在短時間內同時失效的情況還是會使得系統的響應能力降低,所以這種情況無疑應該避免。

參考文獻鏈接:

責任編輯:黃丹 來源: sina博客
相關推薦

2014-06-13 11:08:52

Redis主鍵失效

2013-08-28 10:11:37

RedisRedis主鍵失效NoSQL

2023-10-13 13:30:00

MySQL鎖機制

2015-03-17 09:44:08

2017-01-13 22:42:15

iosswift

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2020-09-23 10:00:26

Redis數據庫命令

2022-11-04 09:43:05

Java線程

2022-09-05 08:39:04

kubernetesk8s

2024-03-12 00:00:00

Sora技術數據

2021-03-10 10:55:51

SpringJava代碼

2024-11-01 08:57:07

2020-08-10 18:03:54

Cache存儲器CPU

2024-04-15 00:00:00

技術Attention架構

2017-05-03 17:00:16

Android渲染機制

2020-03-26 16:40:07

MySQL索引數據庫

2023-09-19 22:47:39

Java內存

2022-01-14 12:28:18

架構OpenFeign遠程

2022-09-26 08:01:31

線程LIFO操作方式

2019-07-01 13:34:22

vue系統數據
點贊
收藏

51CTO技術棧公眾號

亚洲精品一区国产| 欧美成人性生活视频| 亚洲欧美日韩一区在线观看| 国产视频精品一区二区三区| 青青青在线视频免费观看| 日本福利专区在线观看| 成人免费视频视频| 国产精品美女免费看| 欧美三级 欧美一级| 神马香蕉久久| 在线播放中文字幕一区| 日本阿v视频在线观看| 黄色大片在线看| 国产一区美女在线| 欧美做受高潮1| xxxx日本少妇| 精品国产视频| 精品国产成人在线影院| 天堂av在线网站| av第一福利在线导航| 一色桃子久久精品亚洲| 欧美不卡福利| 亚洲欧美另类综合| 裸体一区二区三区| 26uuu另类亚洲欧美日本一| 亚洲熟女毛茸茸| 在线观看欧美理论a影院| 欧美一区二区不卡视频| av免费网站观看| 福利在线导航136| 亚洲欧美综合色| 日韩欧美在线电影| 天堂中文资源在线| 国产 欧美在线| 国产欧美 在线欧美| 国产成人在线免费视频| 欧美日韩mv| 日韩在线资源网| 久久中文字幕精品| 最新国产精品视频| 亚洲国产精品va在线看黑人动漫| 亚洲图片 自拍偷拍| 国产精品第一| 欧美又粗又大又爽| 国产一区视频免费观看| 在线黄色的网站 | 亚洲欧美va天堂人熟伦| 国产精品45p| 日韩一级片网站| 蜜桃福利午夜精品一区| 成人影院在线免费观看| 色菇凉天天综合网| 亚洲午夜无码av毛片久久| 久色国产在线| 亚洲一区影音先锋| 喜爱夜蒲2在线| 老司机精品视频在线观看6| 中文字幕欧美三区| 亚洲乱码一区二区三区 | 成人av电影免费在线播放| 97免费资源站| 亚洲精品国产av| 成人激情文学综合网| 国产伦精品一区二区三区| 亚洲第一页在线观看| 国产成a人无v码亚洲福利| 99re6热在线精品视频播放速度| 91丨porny丨在线中文| 国内精品第一页| 亚洲自拍欧美色图| 亚洲奶汁xxxx哺乳期| 国产成人精品免费看| 国产98在线|日韩| 日韩一级在线播放| 91美女在线视频| 日韩av影视| 在线观看麻豆蜜桃| 亚洲欧美另类在线| 97视频久久久| 老司机成人影院| 欧美日韩夫妻久久| 手机看片国产精品| 精品中国亚洲| 亚洲视频一区二区| 五月综合色婷婷| 一区视频在线| 国产成人久久精品| 国产偷拍一区二区| 99精品久久只有精品| 日日噜噜噜噜夜夜爽亚洲精品| 超碰免费在线| 亚洲在线视频免费观看| 国产精品后入内射日本在线观看| 电影天堂国产精品| 欧美一区二区三区精品| 少妇一级淫片免费放播放| 精品国产一区二区三区四区 | 欧美xxxx黑人又粗又长密月| 日本在线观看| 午夜精品在线看| 久久久精品麻豆| 91精品国产自产在线丝袜啪| 亚洲人成在线观看| 日本老熟俱乐部h0930| 亚洲女人av| 7777奇米亚洲综合久久| 日韩a在线看| 一区二区欧美视频| 手机在线免费观看毛片| 高清日韩中文字幕| 日日噜噜噜夜夜爽亚洲精品| 国产在线综合网| 青青草国产成人av片免费| 成人区精品一区二区| 福利小视频在线观看| 亚洲丶国产丶欧美一区二区三区| 黄色免费网址大全| 人妖一区二区三区| 久久国产精品视频| 亚洲精品一区二区二区| youjizz久久| 精品嫩模一区二区三区| 欧美日韩国产网站| 亚洲毛茸茸少妇高潮呻吟| 麻豆国产尤物av尤物在线观看| 日韩和欧美一区二区| 国产伦理一区二区三区| av网址在线免费观看| 在线观看www91| 国产精品jizz| 亚洲精品字幕| 国产精品久久久久av福利动漫| 日本中文字幕伦在线观看| 福利微拍一区二区| av av在线| 亚洲欧美一区在线| 91老司机在线| 麻豆视频在线免费观看| 欧美亚洲禁片免费| 韩国女同性做爰三级| 国产精品色网| 精品欧美一区二区在线观看视频| 五月天激情在线| 欧美一级在线免费| 破处女黄色一级片| 国产麻豆91精品| 国产免费xxx| 白嫩亚洲一区二区三区| 久久久av一区| 99国产揄拍国产精品| 综合色中文字幕| 国产精品自在自线| 亚洲成人av| 成人淫片在线看| h片在线播放| 欧美一二三在线| 欧美日韩在线观看成人| 国产一区二区精品在线观看| 大桥未久一区二区| 涩涩屋成人免费视频软件| 欧美大荫蒂xxx| 农村少妇久久久久久久| 午夜精品福利一区二区蜜股av| 久久精品女同亚洲女同13| 亚洲精品日本| 日本视频一区二区在线观看| 99re久久| 久久久精品免费视频| 97国产成人无码精品久久久| 成人免费小视频| 亚洲成人福利视频| 国产一区导航| 日韩一区二区三区资源| 四虎精品在线观看| 欧美黄色片在线观看| 欧美自拍第一页| 欧美色图在线视频| 1024手机在线观看你懂的| 久久狠狠亚洲综合| 国产玉足脚交久久欧美| 亚洲精品进入| 国产中文字幕91| 欧美人与性动交α欧美精品济南到| 欧美va亚洲va| 国产嫩bbwbbw高潮| 最新热久久免费视频| 国产免费无码一区二区| 国产精品一页| 一区二区视频在线免费| 91午夜精品| 欧美中在线观看| 三区四区电影在线观看| 精品国产精品网麻豆系列| 波多野结衣绝顶大高潮| 亚洲色图欧美偷拍| 成人影视免费观看| 国产在线视视频有精品| 欧美 日韩 国产在线观看| 日韩中字在线| 精品亚洲一区二区三区四区五区高| 快播电影网址老女人久久| 精品少妇v888av| 精品av中文字幕在线毛片 | 天堂av手机在线| 亚洲欧美网站| 欧美久久久久久久久久久久久久| 国产va免费精品观看精品视频| 亚洲一区二区三区四区视频| 亚洲精品一区| 久久99久国产精品黄毛片入口| 狠狠色伊人亚洲综合网站l| 日韩欧美激情在线| 国产情侣呻吟对白高潮| 欧美日韩国产黄| 看免费黄色录像| 国产欧美一区二区精品性色超碰| 久久黄色一级视频| 开心九九激情九九欧美日韩精美视频电影| 久草视频这里只有精品| 欧美国产一级| 欧美日韩精品免费看| 国产精品巨作av| 91免费看片在线| 九九九伊在线综合永久| 97av在线影院| 毛片网站在线看| 久热精品在线视频| 成av人电影在线观看| 日韩乱码在线视频| 肥臀熟女一区二区三区| 欧美一级理论性理论a| 成人免费一区二区三区| 色综合天天综合色综合av| 国产一级性生活| 一区二区高清视频在线观看| 精品国产大片大片大片| 日本一区二区免费在线| 日本激情小视频| 久久日韩粉嫩一区二区三区| 艳妇乳肉亭妇荡乳av| 成人听书哪个软件好| 免费不卡av网站| 国产在线视频精品一区| 99国产精品久久久久久| 捆绑调教一区二区三区| 日韩爱爱小视频| 久久精品99国产精品| 91小视频在线播放| 狠狠久久亚洲欧美| 波多野结衣在线免费观看| 国内精品不卡在线| 国产老头和老头xxxx×| 国产激情91久久精品导航| 欧美污在线观看| 国产精品123| 亚洲欧美日韩中文字幕在线观看| 国产成人精品三级麻豆| 亚洲国产精品第一页| 成人午夜视频免费看| 性欧美18—19sex性高清| 成+人+亚洲+综合天堂| 五十路六十路七十路熟婆| 95精品视频在线| aaaaa级少妇高潮大片免费看| 91丨porny丨首页| 91激情视频在线观看| 中文成人av在线| 91久久国产综合| 一区av在线播放| 久草国产精品视频| 日本道精品一区二区三区| 日韩电影在线观看一区二区| 欧美影视一区在线| 国产伦精品一区二区三区四区| 欧美一区二区三区电影| 香蕉视频网站在线| 国产亚洲精品综合一区91| 麻豆视频在线观看免费| 欧美激情视频三区| 日韩电影av| 91九色蝌蚪国产| 精品自拍偷拍| 亚洲国产欧美不卡在线观看| 欧美特黄视频| 国产一区亚洲二区三区| 狠狠色综合播放一区二区| 黄色免费视频网站| 中文字幕一区二区三区色视频| 麻豆国产尤物av尤物在线观看 | 国产黄色一级网站| 麻豆一区二区三| 成人午夜精品无码区| 欧美激情一区二区三区四区| 九九视频在线观看| 欧美中文字幕不卡| 蜜臀久久久久久999| 一区二区欧美激情| 成人性生交大片免费看在线播放| 国产精品日韩电影| 另类尿喷潮videofree| 亚洲区一区二区三区| 一区在线视频观看| 亚洲精品免费一区亚洲精品免费精品一区| jiyouzz国产精品久久| 久久99久久99精品免费看小说| 亚洲成av人片在线| 国产精品久久久久久久一区二区| 精品亚洲一区二区| 黄色的视频在线观看| 国产热re99久久6国产精品| 欧美交a欧美精品喷水| 久久久久亚洲av无码专区喷水| 欧美一区=区| 黄色片免费网址| 久久久久久久久97黄色工厂| 国产精品视频一区二区三| 欧美影片第一页| 天天干,天天操,天天射| 欧美成人精品xxx| gogo亚洲高清大胆美女人体 | www污在线观看| 精品一区二区三区视频在线观看 | 成人福利电影精品一区二区在线观看| 国产免费一区二区三区网站免费| 一区二区三区四区不卡视频| 亚洲专区第一页| 亚洲欧美中文在线视频| 91精品久久| 成人免费网站在线| 国产不卡一二三区| jizzjizz国产精品喷水| 国产ts人妖一区二区| 日韩影视一区二区三区| 亚洲欧洲久久| 久久影院亚洲| 国产麻豆剧传媒精品国产| 1024成人网| 日韩色图在线观看| 日韩精品一区二区在线| www.久久ai| 91精品国产综合久久香蕉最新版| 成人无号精品一区二区三区| 国产91对白刺激露脸在线观看| 国产xxx精品视频大全| 国产一级做a爱免费视频| 在线播放视频一区| 黄色网在线免费观看| 国产精品久久久久77777| 亚洲区小说区图片区qvod| 少妇人妻在线视频| 丁香另类激情小说| 国产一级在线观看视频| 欧美精品一区二区高清在线观看| 二区三区在线观看| 成人久久18免费网站漫画| 91精品国产91久久综合| 四虎国产精品免费| 亚洲一区二区三区视频在线 | 欧美高清视频在线高清观看mv色露露十八 | 亚洲乱码久久| 色悠悠在线视频| 欧美日韩国产一中文字不卡| 天天综合网在线| 日韩免费观看网站| 国产精品一国产精品| 中文av一区二区三区| 国产精品网曝门| 一个人看的www日本高清视频| 久久这里有精品视频| 国产日韩一区二区三免费高清| 日本国产中文字幕| www.日韩大片| 日韩av大片在线观看| 日韩精品福利在线| 日韩欧美一区二区三区在线观看 | 偷拍亚洲欧洲综合| 亚洲欧洲精品视频| 国产精品igao视频| 99精品视频精品精品视频| 不卡中文字幕在线观看| 亚洲综合在线免费观看| 乱精品一区字幕二区| 国产精品18久久久久久首页狼| 青草国产精品| 91大神免费观看| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩黄色三级| 久久久久久久久久伊人| 成人黄色av网站在线| 欧美性受xxx黑人xyx性爽| 久久精品欧美视频| 日韩美女国产精品| 亚洲一级免费观看| 午夜激情综合网| 激情综合闲人网| 国产 高清 精品 在线 a| 亚洲欧美久久久| 四虎影视一区二区| 欧美精品一区二| 亚洲精品555|