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

如履薄冰:Redis懶惰刪除的巨大犧牲

數據庫 其他數據庫 Redis
大家都知道 Redis 是單線程的,但是 Redis 4.0 增加了懶惰刪除功能,懶惰刪除需要使用異步線程對已刪除的節點進行內存回收,這意味著 Redis 底層其實并不是單線程,它內部還有幾個額外的鮮為人知的輔助線程。

[[252391]]

大家都知道 Redis 是單線程的,但是 Redis 4.0 增加了懶惰刪除功能,懶惰刪除需要使用異步線程對已刪除的節點進行內存回收,這意味著 Redis 底層其實并不是單線程,它內部還有幾個額外的鮮為人知的輔助線程。

這幾個輔助線程在 Redis 內部有一個特別的名稱,就是“BIO”,全稱是 Background IO,意思是在背后默默干活的 IO 線程。

不過內存回收本身并不是什么 IO 操作,只是 CPU 的計算消耗可能會比較大而已。

01.懶惰刪除的最初實現不是異步線程

Redis 大佬 Antirez 實現懶惰刪除時,它并不是一開始就想到了異步線程。它最初的嘗試是在主線程里,使用類似于字典漸進式搬遷的方式來實現漸進式刪除回收。

比如對于一個非常大的字典來說,懶惰刪除是采用類似于 scan 操作的方法,通過遍歷第一維數組來逐步刪除回收第二維鏈表的內容,等到所有鏈表都回收完了,再一次性回收第一維數組。這樣也可以達到刪除大對象時不阻塞主線程的效果。

但是說起來容易做起來卻很難。漸進式回收需要仔細控制回收頻率,它不能回收得太猛,這會導致 CPU 資源占用過多,也不能回收得像蝸牛那么慢,因為內存回收不及時可能導致內存消耗持續增長。

Antirez 需要采用合適的自適應算法來控制回收頻率。他首先想到的是通過檢測內存增長的趨勢是增長“+1”還是下降“-1”,來漸進式調整回收頻率系數,這樣的自適應算法實現也很簡單。

但是測試后發現在服務繁忙的時候,QPS 會下降到正常情況下 65% 的水平,這點非常致命。

所以 Antirez 才使用了如今的方案——異步線程。異步線程這套方案就簡單多了,釋放內存不用為每種數據結構適配一套漸進式釋放策略,也不用搞個自適應算法來仔細控制回收頻率,只是將對象從全局字典中摘掉,然后往隊列里一扔,主線程就干別的去了。異步線程從隊列里取出對象來,直接走正常的同步釋放邏輯就可以了。

不過使用異步線程也是有代價的,主線程和異步線程之間在內存回收器(jemalloc)的使用上存在競爭。

這點競爭消耗是可以忽略不計的,因為 Redis 的主線程在內存的分配與回收上花的時間相對整體運算時間而言是極少的。

02.異步線程方案其實也相當復雜

上文筆者剛說異步線程方案很簡單,為什么在這里又說它很復雜呢?因為有一點,筆者之前沒有提到,這點非常可怕,嚴重阻礙了異步線程方案的改造,那就是 Redis 的內部對象有共享機制。

比如集合的并集操作 sunionstore 用來將多個集合合并成一個新集合。 

  1. > sadd src1 value1 value2 value3  
  2. (integer) 3  
  3. > sadd src2 value3 value4 value5  
  4. (integer) 3  
  5. > sunionstore dest src1 src2  
  6. (integer) 5  
  7. > smembers dest  
  8. 1) "value2"  
  9. 2) "value3"  
  10. 3) "value1"  
  11. 4) "value4"  
  12. 5) "value5" 

我們看到新的集合包含了舊集合的所有元素。但是這里有一個我們沒看到的 trick,那就是底層的字符串對象被共享了,如下圖所示。

為什么對象共享是懶惰刪除的巨大障礙呢?因為懶惰刪除相當于徹底砍掉某個樹枝,將它扔到異步刪除隊列里去。

注意這里必須是徹底刪除,不能藕斷絲連。如果底層對象是共享的,那就做不到徹底刪除。如圖 2 所示的刪除就不是徹底刪除。

所以 Antirez 為了支持懶惰刪除,將對象共享機制徹底拋棄,它將這種對象結構稱為“share-nothing”,也就是無共享設計。

但是甩掉對象共享談何容易!這種對象共享機制散落在源代碼的各個角落,牽一發而動全身,改起來猶如在布滿地雷的道路上小心翼翼地行走。

不過 Antirez 還是決心改了,它將這種改動描述為“絕望而瘋狂”,可見改動之大、之深、之險,前后花了好幾周時間才改完。

不過這次修改的效果也是很明顯的,對象的刪除操作再也不會導致主線程卡頓了。

03.異步刪除的實現

主線程需要將刪除任務傳遞給異步線程,它是通過一個普通的雙向鏈表來傳遞的。因為鏈表需要支持多線程并發操作,所以它需要有鎖來保護。

執行懶惰刪除時,Redis 將刪除操作的相關參數封裝成一個 bio_job 結構,然后追加到鏈表尾部。異步線程通過遍歷鏈表摘取 job 元素來挨個執行異步任務。 

  1. struct bio_job {  
  2.     time_t time;  // 時間字段暫時沒有使用,應該是預留的  
  3.     void *arg1, *arg2, *arg3;  
  4. }; 

我們注意到這個 job 結構有三個參數。為什么刪除對象需要三個參數呢?我們看如下代碼。   

  1. /* What we free changes depending on what arguments are set:  
  2.      * arg1 -> free the object at pointer.  
  3.      * arg2 & arg3 -> free two dictionaries (a Redis DB).  
  4.      * only arg3 -> free the skiplist. */  
  5.     if (job->arg1)  
  6.         // 釋放一個普通對象,string/set/zset/hash 等,用于普通對象的異步刪除  
  7.         lazyfreeFreeObjectFromBioThread(job->arg1);  
  8.     else if (job->arg2 && job->arg3)  
  9.         // 釋放全局 redisDb 對象的 dict 字典和 expires 字典,用于 flushdb  
  10.         lazyfreeFreeDatabaseFromBioThread(job->arg2,job->arg3);  
  11.     else if (job->arg3)  
  12.         // 釋放 Cluster 的 slots_to_keys 對象,請參見第 5.7 節  
  13.         lazyfreeFreeSlotsMapFromBioThread(job->arg3); 

可以看到,通過組合這三個參數可以實現不同結構的釋放邏輯。

接下來我們繼續追蹤普通對象的異步刪除 lazyfreeFreeObjectFromBioThread 是如何進行的,請仔細閱讀代碼注釋。 

  1. void lazyfreeFreeObjectFromBioThread(robj *o) {  
  2.     decrRefCount(o); // 降低對象的引用計數,如果為零,就釋放  
  3.     atomicDecr(lazyfree_objects,1); // lazyfree_objects 為待釋放對象的數量,用于統計  
  4.  
  5. // 減少引用計數  
  6. void decrRefCount(robj *o) {  
  7.     if (o->refcount == 1) {  
  8.         // 該釋放對象了  
  9.         switch(o->type) {  
  10.         case OBJ_STRING: freeStringObject(o); break;  
  11.         case OBJ_LIST: freeListObject(o); break;  
  12.         case OBJ_SET: freeSetObject(o); break;  
  13.         case OBJ_ZSET: freeZsetObject(o); break;  
  14.         case OBJ_HASH: freeHashObject(o); break;  // 釋放 hash 對象,繼續追蹤  
  15.         case OBJ_MODULE: freeModuleObject(o); break;  
  16.         case OBJ_STREAM: freeStreamObject(o); break;  
  17.         default: serverPanic("Unknown object type"); break;  
  18.         } 
  19.         zfree(o);  
  20.     } else {  
  21.         if (o->refcount <= 0) serverPanic("decrRefCount against refcount <= 0");  
  22.         if (o->refcount != OBJ_SHARED_REFCOUNT) o->refcount--; // 引用計數減 1  
  23.     }  
  24.  
  25. // 釋放 hash 對象  
  26. void freeHashObject(robj *o) {  
  27.     switch (o->encoding) {  
  28.     case OBJ_ENCODING_HT:  
  29.         // 釋放字典,我們繼續追蹤  
  30.         dictRelease((dict*) o->ptr);  
  31.         break;  
  32.     case OBJ_ENCODING_ZIPLIST:  
  33.         // 如果是壓縮列表可以直接釋放  
  34.         // 因為壓縮列表是一整塊字節數組  
  35.         zfree(o->ptr);  
  36.         break;  
  37.     default:  
  38.         serverPanic("Unknown hash encoding type");  
  39.         break;  
  40.     }  
  41.  
  42. // 釋放字典,如果字典正在遷移中,ht[0] 和 ht[1] 分別存儲舊字典和新字典  
  43. void dictRelease(dict *d)  
  44.  
  45.     _dictClear(d,&d->ht[0],NULL); // 繼續追蹤  
  46.     _dictClear(d,&d->ht[1],NULL);  
  47.     zfree(d);  
  48.  
  49. // 這里要釋放 hashtable 了  
  50. // 需要遍歷第一維數組,然后繼續遍歷第二維鏈表,雙重循環  
  51. int _dictClear(dict *d, dictht *ht, void(callback)(void *)) {  
  52.     unsigned long i;  
  53.     /* Free all the elements */  
  54.     for (i = 0; i < ht->size && ht->used > 0; i++) {  
  55.         dictEntry *he, *nextHe;  
  56.         if (callback && (i & 65535) == 0) callback(d->privdata);  
  57.         if ((he = ht->table[i]) == NULL) continue;  
  58.         while(he) {  
  59.             nextHe = he->next;  
  60.             dictFreeKey(d, he); // 先釋放 key  
  61.             dictFreeVal(d, he); // 再釋放 value  
  62.             zfree(he); // 最后釋放 entry  
  63.             ht->used--;  
  64.             he = nextHe 
  65.         }  
  66.     }  
  67.     /* Free the table and the allocated cache structure */  
  68.     zfree(ht->table); // 可以回收第一維數組了  
  69.     /* Re-initialize the table */  
  70.     _dictReset(ht);  
  71.     return DICT_OK; /* never fails */  

這些代碼散落在多個不同的文件,我將它們湊到了一塊便于讀者閱讀。從代碼中我們可以看到釋放一個對象要深度調用一系列函數,每種對象都有它獨特的內存回收邏輯。

04.5.9.4 隊列安全

前面提到任務隊列是一個不安全的雙向鏈表,需要使用鎖來保護它。當主線程將任務追加到隊列之前需要給它加鎖,追加完畢后,再釋放鎖,還需要喚醒異步線程——如果其在休眠的話。 

  1. void bioCreateBackgroundJob(int type, void *arg1, void *arg2, void *arg3) {  
  2.     struct bio_job *job = zmalloc(sizeof(*job));  
  3.     job->timetime = time(NULL);  
  4.     job->arg1arg1 = arg1;  
  5.     job->arg2arg2 = arg2;  
  6.     job->arg3arg3 = arg3;  
  7.     pthread_mutex_lock(&bio_mutex[type]); // 加鎖  
  8.     listAddNodeTail(bio_jobs[type],job); // 追加任務  
  9.     bio_pending[type]++; // 計數  
  10.     pthread_cond_signal(&bio_newjob_cond[type]); // 喚醒異步線程  
  11.     pthread_mutex_unlock(&bio_mutex[type]); // 釋放鎖  

異步線程需要對任務隊列進行輪詢處理,依次從鏈表表頭摘取元素逐個處理。摘取元素的時候也需要加鎖,摘出來之后再解鎖。如果一個元素都沒有,它需要等待,直到主線程來喚醒它繼續工作。 

  1. // 異步線程執行邏輯  
  2. void *bioProcessBackgroundJobs(void *arg) {  
  3. ...  
  4.     pthread_mutex_lock(&bio_mutex[type]); // 先加鎖  
  5.     ...  
  6.     // 循環處理  
  7.     while(1) {  
  8.         listNode *ln;  
  9.         /* The loop always starts with the lock hold. */  
  10.         if (listLength(bio_jobs[type]) == 0) {  
  11.             // 對列空,那就睡覺吧  
  12.             pthread_cond_wait(&bio_newjob_cond[type],&bio_mutex[type]);  
  13.             continue;  
  14.         }  
  15.         /* Pop the job from the queue. */  
  16.         ln = listFirst(bio_jobs[type]); // 獲取隊列頭元素  
  17.         job = ln->value;  
  18.         /* It is now possible to unlock the background system as we know have  
  19.          * a stand alone job structure to process.*/  
  20.         pthread_mutex_unlock(&bio_mutex[type]); // 釋放鎖  
  21.         // 這里是處理過程,為了省紙,就略去了  
  22.         ...  
  23.         // 釋放任務對象  
  24.         zfree(job);  
  25.         ...  
  26.         // 再次加鎖繼續處理下一個元素  
  27.         pthread_mutex_lock(&bio_mutex[type]);  
  28.         // 因為任務已經處理完了,可以放心從鏈表中刪除節點了  
  29.         listDelNode(bio_jobs[type],ln);  
  30.         bio_pending[type]--; // 計數減 1  
  31.     } 

研究完這些加鎖解鎖的代碼后,筆者開始有點擔心主線程的性能。我們都知道加鎖解鎖是一個相對比較耗時的操作,尤其是悲觀鎖最為耗時。如果刪除很頻繁,主線程豈不是要頻繁加鎖解鎖。

所以這里肯定還有優化空間,Java 的 ConcurrentLinkQueue 就沒有使用這樣粗粒度的悲觀鎖,它優先使用 cas 來控制并發。那就讓我們就期待 Redis 在未來的版本里對它進一步改造優化吧!

 

責任編輯:龐桂玉 來源: 程序人生
相關推薦

2015-09-24 16:48:17

數據中心云遷移

2013-01-06 10:40:30

網絡管理數據安全

2012-05-01 08:18:25

華為

2011-12-29 09:54:07

數據安全

2025-10-29 09:51:03

2010-08-04 14:21:21

面試

2019-03-20 10:10:17

互聯網數據技術

2011-11-02 09:29:42

存儲虛擬化虛擬化

2017-01-10 15:22:34

京東容器集群

2021-08-18 09:38:51

人工智能AI機器學習

2021-04-13 17:17:08

線上故障交付

2018-02-26 13:12:20

人工智能

2020-06-12 11:51:07

工控安全網絡安全網絡攻擊

2014-06-05 09:23:47

程序員高效

2024-03-29 08:03:48

單元測試流量

2023-06-15 13:59:00

人工智能智能家居

2016-10-09 19:49:30

ERP工具編程

2024-04-18 00:20:56

Redis策略數據

2012-04-04 22:17:40

移動游戲
點贊
收藏

51CTO技術棧公眾號

日本免费高清一区| 久久999免费视频| 搡女人真爽免费午夜网站| а天堂8中文最新版在线官网| 久久国产乱子精品免费女| 日韩一中文字幕| 黑人无套内谢中国美女| 忘忧草在线日韩www影院| 国产欧美精品一区二区三区四区 | 奇米精品一区二区三区四区| 色偷偷偷综合中文字幕;dd| 成人综合网网址| 国产性生活网站| 国产免费播放一区二区| 日韩视频在线永久播放| 久久黄色免费看| 免费看电影在线| 国产精品乱码久久久久久| 国产一区二区三区四区五区在线| 中文永久免费观看| 中文高清一区| 久久97精品久久久久久久不卡| 国产精品无码无卡无需播放器| 一区二区中文字幕在线观看| 综合av第一页| 日本公妇乱淫免费视频一区三区| a级片免费观看| 93在线视频精品免费观看| 精品成人一区二区三区| 国内国产精品天干天干| 在线手机中文字幕| 亚洲激情图片一区| 艳色歌舞团一区二区三区| 日韩不卡高清视频| 亚洲国产91| 精品国偷自产在线视频99| 精品人妻一区二区三区日产乱码卜| 国产精品日本一区二区三区在线| 欧美视频中文一区二区三区在线观看| 国产极品尤物在线| 欧美videosex性极品hd| 亚洲视频一区二区在线观看| 四虎影院一区二区三区| 日本私人网站在线观看| 不卡一区二区中文字幕| 99久久精品免费看国产一区二区三区| 一区二区三区午夜| 精品一区91| 欧美日韩在线另类| 成人在线播放网址| 亚洲丝袜精品| 亚洲精品伦理在线| 国产盗摄视频在线观看| 黄黄的网站在线观看| 国产精品久久综合| 天堂精品一区二区三区| 国产中文字幕在线观看| 久久精品这里都是精品| 青青草成人网| wwwxxx在线观看| 中文字幕第一页久久| 午夜老司机精品| 日本高清中文字幕在线| 亚洲天堂网中文字| 日韩精品一区二区三区电影| 亚洲AV无码成人片在线观看| 激情综合网天天干| 97超碰人人模人人爽人人看| 性一交一乱一乱一视频| 成人免费视频网站在线观看| 国产精品日韩欧美一区二区三区| 色哟哟国产精品色哟哟| 久久众筹精品私拍模特| 色姑娘综合网| 黄色在线播放网站| 亚洲一二三四区| 奇米精品一区二区三区| 国产另类xxxxhd高清| 欧美在线免费观看视频| 伊人久久大香线蕉综合75| 成人网视频在线观看| 亚洲欧洲日产国码二区| 日本a级片在线播放| sis001亚洲原创区| 91精品福利视频| 久久久福利影院| 精品精品国产毛片在线看| 亚洲欧美精品伊人久久| 色哟哟免费视频| jizz18欧美18| 亚洲人成网站免费播放| www.av免费| 亚洲激精日韩激精欧美精品| 国产成人+综合亚洲+天堂| 中文字幕在线观看欧美| 粉嫩绯色av一区二区在线观看 | 欧美人妖在线观看| 日韩中文理论片| 国产乡下妇女做爰| 日本 国产 欧美色综合| 国产不卡一区二区在线观看| 国产三级电影在线| 亚洲一区二区五区| 天天干在线影院| 狠狠久久伊人| 久久精品国产欧美亚洲人人爽| 日韩免费在线视频观看| 久久99国内精品| 免费中文日韩| 美女网站视频在线| 欧美亚洲综合在线| 影音先锋人妻啪啪av资源网站| 精品国产91| 亚洲黄色成人网| 亚洲天堂av中文字幕| 精品999成人| 成人www视频在线观看| 无码国产精品高潮久久99| 中文字幕一区二区在线观看| 先锋影音日韩| 国产福利电影在线播放| 欧美一区二区三区在| 夜夜春很很躁夜夜躁| 亚洲经典三级| 亚洲自拍偷拍福利| 91porn在线观看| 国产精品国产自产拍高清av| www.99热这里只有精品| 日韩精品一级| y97精品国产97久久久久久| 精品国产一区二区三区四| 国产成人免费在线视频| 色乱码一区二区三区熟女| 在线观看三级视频| 欧美性做爰猛烈叫床潮| 中文字幕在线看高清电影| 91久久综合| 国产精品国产三级欧美二区| www红色一片_亚洲成a人片在线观看_| 亚洲乱码国产乱码精品精的特点| 国内外成人免费激情视频| 老汉色老汉首页av亚洲| 欧美人成在线视频| 精品人妻一区二区三区日产乱码 | 欧美日韩四区| 91在线网站视频| 天堂а√在线官网| 欧美日韩国产另类一区| 蜜桃av免费观看| 久久精品国产77777蜜臀| 亚洲图片小说在线| 国产精品蜜月aⅴ在线| 中文字幕精品一区二区精品| 欧美国产日韩在线观看成人| 美女www一区二区| 亚洲欧美在线网| 国产成人免费精品| 日韩中文字幕在线看| 国产日本精品视频| 91天堂素人约啪| 九色在线视频观看| 国产不卡av一区二区| 国产精品视频播放| av免费网站在线| 精品久久久影院| 极品久久久久久久| 蜜臀av性久久久久蜜臀aⅴ| 亚洲.欧美.日本.国产综合在线| 福利一区视频| 欧美精品手机在线| 视频污在线观看| 91成人在线免费观看| 日韩av片在线免费观看| 国产乱淫av一区二区三区 | 台湾av在线二三区观看| 一本大道av一区二区在线播放| 五月天综合视频| 久久99精品久久久久久动态图| 国产精品免费看久久久无码| 久久男人av| 国产精品免费看久久久香蕉| 国产激情在线| 日韩精品在线影院| 一区二区www| 亚洲电影第三页| a天堂中文字幕| 国产精品99久久久久久有的能看 | 欧美成人精品欧美一级私黄| 99riav久久精品riav| 人人干人人干人人| 秋霞影视一区二区三区| 国产精品白嫩初高中害羞小美女| 美女写真理伦片在线看| 欧美亚洲日本一区| 欧美日韩在线国产| 久久久久国产精品厨房| 精产国品一二三区| 先锋资源久久| 精品欧美一区二区久久久伦| 久久精品97| 97视频在线观看免费高清完整版在线观看 | 日韩在线第一区| 欧美久久一区二区三区| 日韩美女免费线视频| 日本中文字幕中出在线| 神马久久久久久| 色视频在线看| 日韩三级在线观看| 中文字幕在线网址| 欧美午夜精品伦理| 欧美人妻一区二区| 国产精品嫩草影院com| 成年人的黄色片| 国产精品一区二区三区99| 狠狠躁狠狠躁视频专区| 老鸭窝91久久精品色噜噜导演| 精品人妻人人做人人爽| 国产精品久久久久久麻豆一区软件| 久久精品中文字幕一区二区三区 | 久久久久99精品| 日本福利片在线| 日韩欧美亚洲成人| 国产主播在线观看| 日韩理论片一区二区| 国产精品久久免费观看| 久久综合久久综合九色| 在线免费看黄色片| 国产99久久久精品| 肉色超薄丝袜脚交| 久久99国产精品免费网站| 久久久国产欧美| 视频一区二区中文字幕| 亚洲熟妇无码一区二区三区| 午夜久久久久| 不卡视频一区二区| 欧美日韩va| 国产精品久久久久久久一区探花| 岛国av在线网站| 欧美极品在线视频| 日日夜夜天天综合入口| 欧美成人h版在线观看| 成人短视频在线观看| 日韩亚洲欧美中文高清在线| 在线免费观看的av网站| 中文字幕欧美国内| av在线电影院| 中文字幕亚洲综合久久| 91精彩在线视频| 日韩视频在线免费| 欧美成人高清在线| 久久久精品影院| 中文字幕在线三区| 欧美激情高清视频| 1区2区3区在线| 高清欧美性猛交xxxx黑人猛交| 爱情岛论坛亚洲品质自拍视频网站| 久久久久久久久久久亚洲| 99热99re6国产在线播放| 午夜精品视频网站| 国产欧美一区二区三区精品酒店| www日韩欧美| 黄色免费在线网站| 九九九久久国产免费| segui88久久综合| 欧美一级片在线播放| 亚洲人免费短视频| 成人女保姆的销魂服务| 综合视频一区| 久久久久久久久一区二区| 欧美久久综合网| 日本一级淫片演员| 好看的日韩av电影| 欧日韩免费视频| 天堂av在线一区| 在线观看日本www| 成人福利电影精品一区二区在线观看 | 视频在线99| 亚洲精品一区二区三区新线路| 成人免费不卡视频| 精品国产人妻一区二区三区| 国产性色一区二区| 暗呦丨小u女国产精品| 午夜精品久久久久久久久| www.国产一区二区| 91精品国产综合久久福利软件 | 中文成人激情娱乐网| 波多野结衣精品久久| 视频一区中文| www婷婷av久久久影片| 亚洲欧美日本视频在线观看| 色婷婷成人在线| 国产99精品国产| 国产综合精品在线| 亚洲精品中文在线| 区一区二在线观看| 欧美一区国产二区| 免费播放片a高清在线观看| 久久精品国产亚洲| 三上悠亚国产精品一区二区三区| 亚洲一区二区三区成人在线视频精品| 色爱综合av| 97伦理在线四区| 免费精品国产| 国产aaa免费视频| 美女视频网站久久| 搡老熟女老女人一区二区| 一区二区三区在线视频免费 | 亚洲国产成人久久综合| 午夜在线播放| 欧美一二三视频| 一区二区三区高清在线观看| 亚洲开发第一视频在线播放| 亚洲精品字幕| 国产又粗又猛又爽又黄| 中文幕一区二区三区久久蜜桃| 免费在线观看黄网站| 日韩一区二区精品在线观看| 成人高清网站| 欧美怡春院一区二区三区| 51亚洲精品| 2021国产视频| 久久国产精品99久久久久久老狼| 日本一区二区三区网站| 亚洲一区二区三区激情| 国产精品天天操| 一区二区三区黄色| 一区二区电影免费观看| 国产一区二区在线网站| 欧美三级在线| 被黑人猛躁10次高潮视频| 国产精品女主播在线观看| 日韩电影在线观看一区二区| 亚洲黄色www网站| sm捆绑调教国产免费网站在线观看 | 亚洲精品国产品国语在线app| 国产九九在线观看| 26uuu精品一区二区| 免费在线不卡视频| 亚洲韩国欧洲国产日产av| 大香伊人中文字幕精品| 97se国产在线视频| 欧美涩涩视频| 亚洲少妇中文字幕| 99精品视频在线免费观看| 久艹视频在线观看| 欧美岛国在线观看| 日韩精品亚洲人成在线观看| 97久久精品午夜一区二区| 欧美另类专区| 91精品啪在线观看国产| 亚洲成人av福利| 亚洲aⅴ乱码精品成人区| 91精品国产九九九久久久亚洲| 另类尿喷潮videofree| 免费无遮挡无码永久视频| 久久久美女毛片 | 91精品国产综合久久久久久久| 99热这里只有精品1| 久久精品国产96久久久香蕉| 麻豆一区在线| 日韩欧美精品免费| 99国产麻豆精品| 国产精品成人无码| 精品激情国产视频| 日韩在线网址| 久久视频这里有精品| 久久九九国产精品| 亚洲一区二区激情| 欧美疯狂性受xxxxx另类| 国产乱人伦精品一区| 日韩久久一级片| 国产精品视频麻豆| 精品人妻无码一区二区色欲产成人 | 久久国产精品免费一区| 日本不卡123| 欧美xxxx黑人xyx性爽| 亚洲精品一区二区久| 国产黄色精品| 久久av综合网| 久久久不卡影院| 国产乱淫片视频| 91精品国产高清自在线看超| 成人在线电影在线观看视频| 欧美熟妇另类久久久久久多毛| 偷拍日韩校园综合在线| 国产精品欧美亚洲| 国外成人在线直播| 精品久久国产| 国产麻豆剧传媒精品国产| 色综合视频在线观看| 福利视频在线| 欧美高清一区二区| 国产高清不卡一区二区| 国产成人精品777777| 欧美成人在线影院| 国产成人短视频在线观看| 91精品人妻一区二区三区蜜桃2| 日本电影亚洲天堂一区| 欧美v亚洲v| 在线看无码的免费网站|