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

精品按摩偷拍| 黄色成人在线网| 欧美a一区二区| 久久五月情影视| 中文字幕乱码在线人视频| 国产乱码在线| 日本一区免费视频| 97人人澡人人爽| 伊人手机在线视频| 三级电影一区| 亚洲国产精品成人va在线观看| 国产免费毛卡片| 生活片a∨在线观看| 成人爽a毛片一区二区免费| 国产成人jvid在线播放| 国语对白在线播放| 台湾亚洲精品一区二区tv| 欧美日韩精品福利| 免费无遮挡无码永久视频| 日本视频不卡| 久久久夜色精品亚洲| 91久久精品国产91久久| 五月天激情国产综合婷婷婷| 亚洲最新色图| 伊人一区二区三区久久精品| 中文字幕18页| 亚洲爽爆av| 狠狠色狠狠色综合日日五| 亚洲一区二区三区精品视频| 少妇人妻偷人精品一区二区| 黑人巨大精品欧美一区| 欧美在线激情网| 久久国产露脸精品国产| 日韩欧美一区免费| 亚洲人成电影网站色xx| 97精品人人妻人人| 91麻豆精品| 色呦呦日韩精品| 久久av综合网| 成年人黄视频在线观看| 中国色在线观看另类| 久久精品国产精品国产精品污| 精品国自产在线观看| 美女视频一区二区| 国产成人啪精品视频免费网| 日韩视频免费观看高清| 欧美日韩亚洲一区| 久久电影一区二区| 日本爱爱小视频| 日韩国产欧美| 这里只有精品视频| 日韩免费成人av| 神马电影久久| 亚洲桃花岛网站| www.久久av| 亚洲调教一区| 国产亚洲精品高潮| 国产精品免费无码| 欧美精选一区二区三区| 亚洲视频一区二区三区| www久久久久久久| 精品国产中文字幕第一页| 亚洲精品视频播放| 白白色免费视频| 国产精品一国产精品| 亚洲男人天堂视频| 一级片视频免费看| 成人激情开心网| 久久激情视频久久| 日本黄色片免费观看| 中文乱码免费一区二区三区下载| 不卡av在线播放| 欧美精品一级片| 激情综合在线| 欧美一级淫片videoshd| 黄色一级片免费在线观看| 久久午夜影视| 国产一区私人高清影院| 国产视频在线观看免费| 国产成人在线影院| 久久久久久九九九九| 国产资源在线观看| 国产精品高清亚洲| 青草全福视在线| av影视在线| 91久久国产最好的精华液| 日本免费观看网站| 国产精久久一区二区| 精品日韩在线观看| 波多野结衣av在线免费观看 | 国产主播欧美精品| 精品人妻无码一区二区三区蜜桃一 | 亚洲熟妇av乱码在线观看| 极品尤物av久久免费看| 岛国视频一区免费观看| 欧美女同网站| 中文字幕亚洲一区二区av在线 | 国产精品免费无码| 欧美1区2区3区| 欧美孕妇孕交黑巨大网站| 中文字幕1区2区3区| 国产成人精品综合在线观看| 免费观看成人高| 久草免费在线| 黑人巨大精品欧美一区免费视频| 亚洲午夜激情影院| 欧美大奶一区二区| 久久精品国产96久久久香蕉| 激情综合网五月婷婷| 欧美a一区二区| 国产在线欧美日韩| 精品孕妇一区二区三区| 欧美性jizz18性欧美| 亚洲综合123| 精品中文字幕一区二区三区av| 久久久av网站| 国产女主播喷水视频在线观看| 国产精品影视天天线| 日本免费高清一区二区| 人人澡人人添人人爽一区二区| 日本道免费精品一区二区三区| 亚洲 自拍 另类 欧美 丝袜| 欧美丝袜激情| 欧美一区二三区| 成人福利小视频| 国产精品久久久久久久久图文区 | 日韩精品一区二| 四虎影视1304t| 国产精品一页| 国产精品乱码视频| 91网在线看| 欧美日韩一级大片网址| 久久久久亚洲av无码专区桃色| 欧美视频成人| 95av在线视频| 137大胆人体在线观看| 岛国av午夜精品| 最新日本中文字幕| 欧美激情日韩| 91在线免费观看网站| 18视频免费网址在线观看| 色欧美日韩亚洲| 无码人妻精品一区二区三| 女主播福利一区| **亚洲第一综合导航网站| 日本高清在线观看wwwww色| 色噜噜狠狠成人中文综合 | 成人搞黄视频| 欧美超级免费视 在线| 国产又粗又长视频| 国产精品三级在线观看| 国产喷水theporn| av一区二区高清| 国产精品成人一区二区| 日韩av高清在线| 色婷婷综合在线| 亚洲色成人网站www永久四虎| 久久午夜电影| 先锋影音亚洲资源| 性欧美video另类hd尤物| 日韩在线视频播放| 97超碰人人模人人人爽人人爱| 国产精品成人网| 手机看片国产精品| 亚洲午夜电影| 精品欧美国产| 欧美一区国产| 综合136福利视频在线| 亚洲一级av毛片| 亚洲人亚洲人成电影网站色| 中文字幕第六页| 亚洲国产日韩欧美一区二区三区| 国产免费一区| 成人免费影院| 中文字幕综合一区| 国产ts变态重口人妖hd| 一区二区三区日韩精品| 欧产日产国产精品98| 亚洲综合不卡| 亚洲国产精品视频一区| www999久久| 午夜精品一区二区三区在线视 | 91麻豆.com| 波多野结衣天堂| 一区二区电影在线观看| 国产精品手机在线| 深夜成人影院| 久久九九全国免费精品观看| 天堂v在线观看| 欧美伊人久久久久久久久影院| 国产高清视频免费在线观看| 国产精品99久久不卡二区| 国产老熟妇精品观看| 欧美性感美女一区二区| 91在线精品观看| 成人教育av| 久久在线视频在线| 神马久久高清| 91麻豆精品国产自产在线| 日本少妇毛茸茸高潮| 欧美激情一区在线观看| 亚洲av午夜精品一区二区三区| 久久激情网站| 欧美黄色免费网址| 欧美日韩国产免费观看视频| av资源一区二区| 亚洲一区二区三区四区| 欧美成人一区二区三区电影| 精品乱码一区二区三四区视频 | 亚洲大片精品永久免费| jizz18女人高潮| 不卡av电影在线播放| 欧美特级aaa| 国产情侣久久| 国产 国语对白 露脸| 国产精品一在线观看| 不卡一卡2卡3卡4卡精品在| 国模私拍国内精品国内av| 欧美在线视频在线播放完整版免费观看| 黄色一级片在线观看| 亚洲久久久久久久久久| 蜜臀av午夜精品| 91精品中文字幕一区二区三区| 久久久精品视频网站| 亚洲一区免费在线观看| 五月天色婷婷丁香| 久久久精品免费免费| 国产麻豆剧传媒精品国产av| 国产麻豆91精品| 中文字幕av不卡在线| 三级欧美在线一区| 男人添女人下部高潮视频在观看| 91精品国产乱码久久久久久久 | 亚洲性人人天天夜夜摸| 熟女视频一区二区三区| 欧美偷拍综合| 日本一区免费观看| 亚洲福利网站| 久久国产精品精品国产色婷婷| caoporn成人| 国产91精品一区二区绿帽| 麻豆精品久久| 亚洲一区二区三区sesese| 日韩深夜福利网站| 国产精品丝袜久久久久久不卡| 欧美成人性网| 国产不卡在线观看| 向日葵视频成人app网址| 97香蕉超级碰碰久久免费的优势| 国产精品国精产品一二| 欧美激情欧美狂野欧美精品| 少妇视频在线| 欧美激情精品久久久久久久变态| 午夜伦理在线视频| 久久97久久97精品免视看| 中文字幕在线播放网址| 美日韩在线视频| 免费电影网站在线视频观看福利| 欧美激情18p| hd国产人妖ts另类视频| 98精品国产高清在线xxxx天堂| av中文资源在线资源免费观看| 91国产视频在线播放| 色戒汤唯在线观看| 日本三级韩国三级久久| 中文字幕日本一区二区| 国产噜噜噜噜久久久久久久久| 色狠狠一区二区三区| 91中文精品字幕在线视频| 亚洲精品国产九九九| 成人免费在线一区二区三区| 黄色欧美网站| 欧美男人的天堂| 色777狠狠狠综合伊人| 日本一区二区三区四区五区六区| 欧美国产三级| 久久久噜噜噜www成人网| 老妇喷水一区二区三区| 亚洲娇小娇小娇小| 国产成人精品一区二区三区四区 | 青青草原在线亚洲| 日韩wuma| 欧美一区影院| 日韩免费视频播放| 热久久久久久久| 香蕉久久久久久av成人| 91丨九色丨国产丨porny| 一级二级黄色片| 亚洲一区二区三区爽爽爽爽爽| 少妇一级淫片免费放中国 | 99在线观看免费| 亚洲国产精品一区二区三区| 国产在线观看免费| 久久香蕉国产线看观看av| 国产精品25p| 国产欧美一区二区三区在线看| 99re8这里有精品热视频免费| 欧美精彩一区二区三区| 香蕉久久网站| 欧美黄色免费影院| 国产麻豆精品久久一二三| 亚洲狠狠婷婷综合久久久久图片| 一色桃子久久精品亚洲| 日本亚洲色大成网站www久久| 欧美色图在线观看| 天天av天天翘| 粗暴蹂躏中文一区二区三区| 亚洲欧洲高清| 99re国产视频| 日韩理论在线| 国产a级一级片| 国产白丝网站精品污在线入口| 欧美熟妇激情一区二区三区| 亚洲国产欧美日韩另类综合| 亚洲一卡二卡在线| 国产视频精品在线| 免费在线观看av电影| 国产精品久久久久久久av大片| 好吊妞视频这里有精品| 国产高清免费在线| 日韩国产高清影视| 亚洲成人av免费在线观看| 亚洲久草在线视频| 一卡二卡在线视频| 亚洲视频在线视频| 色老头在线一区二区三区| 国产精品成人观看视频免费| 午夜免费一区| 最新天堂在线视频| 中文字幕高清不卡| 日本丰满少妇做爰爽爽| 亚洲国产精品va在线看黑人 | 欧美老女人另类| 国模杨依粉嫩蝴蝶150p| 成人av免费网站| 国产成人精品av在线| 求av网址在线观看| 国产精品男女猛烈高潮激情| 日韩黄色网络| 男女私大尺度视频| 豆国产96在线|亚洲| 青青草偷拍视频| 欧美一区二区三区四区高清| 日本美女在线中文版| 国产免费一区视频观看免费| 日韩成人综合| 中文字幕第88页| 国产精品高潮久久久久无| 亚洲最新av网站| 日韩最新在线视频| 亚洲男人在线| 一级特黄妇女高潮| 国产乱码一区二区三区| 欧美日韩在线视频免费播放| 日韩一二三区不卡| 欧美黑人猛交的在线视频| 懂色一区二区三区av片| 好吊日精品视频| 精品熟女一区二区三区| 欧美日韩在线视频首页| 桃花色综合影院| 国产成+人+综合+亚洲欧洲| 激情婷婷综合| 天堂av手机在线| 亚洲午夜精品17c| 日韩a在线观看| 国产精品入口尤物| 亚洲综合专区| 久久久久国产精品无码免费看| 懂色av一区二区三区| 国产福利在线| 91精品在线国产| 在线观看不卡| 最近中文字幕在线mv视频在线| 欧美性受xxxx| 日本资源在线| 久久伦理网站| 久久99精品视频| www.99re7.com| 亚洲视频在线看| 日韩在线精品强乱中文字幕| 久草热视频在线观看| 国产欧美一区二区三区网站| 国产一区二区三区三州| 久久久亚洲天堂| 精品免费在线| 性生活在线视频| 欧美视频在线观看免费| 免费高清完整在线观看| 国产一区二区三区免费不卡| 免费日韩视频| 国产稀缺精品盗摄盗拍| 亚洲国产精久久久久久| 久久久精品一区二区毛片免费看| 亚洲五码在线观看视频| 久久久久久一级片| 99在线观看免费| 国产精品精品一区二区三区午夜版| 伊人色**天天综合婷婷| 熟女俱乐部一区二区|