日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Redis源码解析——字典基本操作

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis源码解析——字典基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ? 有了《Redis源碼解析——字典結構》的基礎,我們便可以對dict的實現進行展開分析。(轉載請指明出于breaksoftware的csdn博客)

創建字典

? ? ? ? 一般字典創建時,都是沒有數據的,但是字典類型需要確定,所以我們看到Redis字典創建主要需要定義數據操作的dictType對象:

static void _dictReset(dictht *ht)
{ht->table = NULL;ht->size = 0;ht->sizemask = 0;ht->used = 0;
}/* Create a new hash table */
dict *dictCreate(dictType *type,void *privDataPtr)
{dict *d = zmalloc(sizeof(*d));_dictInit(d,type,privDataPtr);return d;
}/* Initialize the hash table */
int _dictInit(dict *d, dictType *type,void *privDataPtr)
{_dictReset(&d->ht[0]);_dictReset(&d->ht[1]);d->type = type;d->privdata = privDataPtr;d->rehashidx = -1;d->iterators = 0;return DICT_OK;
}

? ? ? ? dictCreate的privaDataPtr一般都傳Null。但是這個變量的設計是有原因的,因為作者希望提供一種能力,在框架調用一些使用者提供的方法時,能夠將一些他們可能關心的數據透傳回去。這種數據可能不一定是簡單的數據,也可能是個函數指針。如果是個函數指針的話,那么在框架調用相關函數時,使用者通過privaDataPtr傳遞進來的函數指針將被回傳,并在用戶自定義的方法中執行。比如調用用戶提供的對比數據的函數:

#define dictCompareKeys(d, key1, key2) \(((d)->type->keyCompare) ? \(d)->type->keyCompare((d)->privdata, key1, key2) : \(key1) == (key2))

? ? ? ? 還有一個需要注意的是rehashidx。因為剛創建的初始字典不需要rehash,所以rehashidx為-1。

刪除字典

? ? ? ? 字典刪除操作也非常簡單,其主要處理的就是兩個dictht對象。因為這兩個對象中有dictEntry數組,而每個數組元素均為一條鏈的首地址,于是刪除操作既有鏈表釋放,也有動態數組釋放操作。

int _dictClear(dict *d, dictht *ht, void(callback)(void *)) {unsigned long i;/* Free all the elements */for (i = 0; i < ht->size && ht->used > 0; i++) {dictEntry *he, *nextHe;if (callback && (i & 65535) == 0) callback(d->privdata);if ((he = ht->table[i]) == NULL) continue;while(he) {nextHe = he->next;dictFreeKey(d, he);dictFreeVal(d, he);zfree(he);ht->used--;he = nextHe;}}/* Free the table and the allocated cache structure */zfree(ht->table);/* Re-initialize the table */_dictReset(ht);return DICT_OK; /* never fails */
}/* Clear & Release the hash table */
void dictRelease(dict *d)
{_dictClear(d,&d->ht[0],NULL);_dictClear(d,&d->ht[1],NULL);zfree(d);
}

? ? ? ? 上面函數中dictFreeKey和dictFreeValue實則是調用dictType中傳入的數據釋放函數

#define dictFreeVal(d, entry) \if ((d)->type->valDestructor) \(d)->type->valDestructor((d)->privdata, (entry)->v.val)#define dictFreeKey(d, entry) \if ((d)->type->keyDestructor) \(d)->type->keyDestructor((d)->privdata, (entry)->key)

字典擴容和縮容

? ? ? ? 我們知道Redis的字典是通過數組和鏈表相結合的方式實現的。理論上說,如果數組長度不變,鏈表長度改變則可以達到字典內容增減的目的。但是為什么還要設計擴容和縮容呢?首先說明下,這兒講解的兩個概念是針dictht的table的——即針對數組結構的。那么有了《Redis源碼解析——字典結構》知識,我們可以得知,針對數組長度的增減是為了:在鏈表過長影響查找效率時,擴大數組長度以減小鏈表長度,達到性能優化。在數據過于稀疏的情況下,減小數組長度以使得無效數組指針變少,從而達到節約空間的目的。

? ? ? ? 我們先看看擴容的計算:

/* Expand the hash table if needed */
static int _dictExpandIfNeeded(dict *d)
{/* Incremental rehashing already in progress. Return. */if (dictIsRehashing(d)) return DICT_OK;/* If the hash table is empty expand it to the initial size. */if (d->ht[0].size == 0) return dictExpand(d, DICT_HT_INITIAL_SIZE);/* If we reached the 1:1 ratio, and we are allowed to resize the hash* table (global setting) or we should avoid it but the ratio between* elements/buckets is over the "safe" threshold, we resize doubling* the number of buckets. */if (d->ht[0].used >= d->ht[0].size &&(dict_can_resize ||d->ht[0].used/d->ht[0].size > dict_force_resize_ratio)){return dictExpand(d, d->ht[0].used*2);}return DICT_OK;
}

? ? ? ? 其中最核心的是檢查ht[0]中元素個數和保存鏈表首地址的數組長度的商是否大于dict_force_resize_ratio——5。這個公式是計算鏈表的平均長度(數組中NULL意味著該對應的鏈表長度為0)。如果平均長度大于5,則需要通過dictExpand方法讓數組去擴容

int dictExpand(dict *d, unsigned long size)
{dictht n; /* the new hash table */unsigned long realsize = _dictNextPower(size);/* the size is invalid if it is smaller than the number of* elements already inside the hash table */if (dictIsRehashing(d) || d->ht[0].used > size)return DICT_ERR;/* Rehashing to the same table size is not useful. */if (realsize == d->ht[0].size) return DICT_ERR;/* Allocate the new hash table and initialize all pointers to NULL */n.size = realsize;n.sizemask = realsize-1;n.table = zcalloc(realsize*sizeof(dictEntry*));n.used = 0;/* Is this the first initialization? If so it's not really a rehashing* we just set the first hash table so that it can accept keys. */if (d->ht[0].table == NULL) {d->ht[0] = n;return DICT_OK;}/* Prepare a second hash table for incremental rehashing */d->ht[1] = n;d->rehashidx = 0;return DICT_OK;
}

? ? ? ? 至于擴容的大小要看下面的實現

static unsigned long _dictNextPower(unsigned long size) {unsigned long i = DICT_HT_INITIAL_SIZE;if (size >= LONG_MAX) return LONG_MAX;while(1) {if (i >= size)return i;i *= 2;}
}

? ? ? ? 可以見的_dictNextPower是獲取最近接size的,但是比size大的2的N次冪。這樣就可以讓鏈表平均長度降低到5/4~5/2之間(1.24~2.5)。

? ? ? ? 我們再注意下dictExpand函數,它最后將分配的空間賦值給ht[1]。如果進入這個場景,就意味著要進行rehash操作了——因為ht[1]就是為了臨時保存rehash結果的。

? ? ? ? 接下來看看縮容計算:

/* Resize the table to the minimal size that contains all the elements,* but with the invariant of a USED/BUCKETS ratio near to <= 1 */
int dictResize(dict *d)
{int minimal;if (!dict_can_resize || dictIsRehashing(d)) return DICT_ERR;minimal = d->ht[0].used;if (minimal < DICT_HT_INITIAL_SIZE)minimal = DICT_HT_INITIAL_SIZE;return dictExpand(d, minimal);
}

? ? ? ? 函數注釋寫的很清楚:在平均鏈表長度低于1時要縮容了。但是作者并沒有在字典內容減少時檢測是否需要縮容,甚至沒有設計一個檢測是否需要縮容的函數,而是將這個方法暴露給用戶去做。我想是因為這種場景不影響字典的執行效率,而內存問題可能更多是應該讓用戶去考慮。

Rehash操作 ? ? ? ?

? ? ? ? Rehash操作是Dict庫的重要算法,好在邏輯我們已經在《Redis源碼解析——字典結構》講清楚了,現在我們就看看它的實現

int dictRehash(dict *d, int n) {

? ? ? ? 該函數需要傳入字典指針d和步進長度n,返回0或者1。這兒的步進長度需要說明下,因為Redis的字典rehash操作是漸進的分步來完成,所以每步需要漸進多少距離需要指定。然后dictht的dictEntry數組可能存在連續的空指針,這些空指針沒有數據鏈,因此不需要rehash,所以不用對它們進行操作。于是步進距離只是針對有效的數組指針,比如我們針對下圖結構進行rehash


? ? ? ? 我們假設步進長度為1,則對上面進行rehash時,ht[0].table的前兩個元素均被跳過,第三個元素所指向的鏈上數據將被rehash。因為步進長度為1,且已經rehash了數組中第三條鏈的數據,所以認為該次步進結束。

    int empty_visits = n*10; /* Max number of empty buckets to visit. */if (!dictIsRehashing(d)) return 0;while(n-- && d->ht[0].used != 0) {dictEntry *de, *nextde;/* Note that rehashidx can't overflow as we are sure there are more* elements because ht[0].used != 0 */assert(d->ht[0].size > (unsigned long)d->rehashidx);while(d->ht[0].table[d->rehashidx] == NULL) {d->rehashidx++;if (--empty_visits == 0) return 1;}

? ? ? ? 但是作者認為數組中有效步進長度內,過多的空指針也是會影響rehash效率。于是作者定義了empty_visits的值為步進長度10倍,如果有效步進長度內空指針數大于empty_visits的值,則需要提前跳出rehash操作,并返回1。可能有讀者會疑問,跳過空指針又不耗費時間,干嘛要做這個限制呢?其實問題不出在空指針上,而是因為數組中有過多空指針的話,意味著數據向數據鏈上堆積,于是每步進一次,需要rehash該鏈上的數據也會相對較多,時間消耗也會變長。所以限制空數據鏈的實質是優化步進的操作耗時的不確定性。

? ? ? ? 通過while我們可以看出,如果達到步進長度,或者ht[0]上的數據已經全被rehash到ht[1]上去了,rehash操作就完成了。我們再看戲rehash的具體操作:

        de = d->ht[0].table[d->rehashidx];/* Move all the keys in this bucket from the old to the new hash HT */while(de) {unsigned int h;nextde = de->next;/* Get the index in the new hash table */h = dictHashKey(d, de->key) & d->ht[1].sizemask;de->next = d->ht[1].table[h];d->ht[1].table[h] = de;d->ht[0].used--;d->ht[1].used++;de = nextde;}d->ht[0].table[d->rehashidx] = NULL;d->rehashidx++;}

? ? ? ? 這個過程就是不停的對ht[0].table上數組進行遍歷,如果數組元素不為空,則遍歷并rehash該元素指向的鏈表上的元素。如果ht[0]上數據已經全rehash到ht[1]上,則其used參數為0。這個時候則讓ht[0]等于ht[1],而ht[1]自身釋放掉,從而達到在ht[0]中的數據被全部rehash的目的。

    /* Check if we already rehashed the whole table... */if (d->ht[0].used == 0) {zfree(d->ht[0].table);d->ht[0] = d->ht[1];_dictReset(&d->ht[1]);d->rehashidx = -1;return 0;}/* More to rehash... */return 1;
}

? ? ? ? 總結下dictRehash操作:它是通過用戶指定有效步進長度,并結合實際數據分布情況,將ht[0]上數據重新rehash到ht[1]上。如果ht[0].table數組全部被遍歷過,則認為rehash完成并返回0,否則返回1。

Rehash的時機

? ? ? ? 之前我們講過為什么要rehash,現在我們探討下分步rehash的時機。

? ? ? ? 當一個Redis字典需要rehash時,它沒有采用一次性完成的方案,而是采用漸進式。于是保持在中間狀態的字典又是在何時被繼續rehash的呢?Redis的字典庫提供了兩個時機,一個是在對字典進行更新或者查找操作時;另一個則是提供給使用者一個接口,由其決定決定何時去rehash。

? ? ? ??因為查找或者更新操作都是需要耗費一定時間,所以此時的rehash也不應該“蹭”過多的時間,于是步進設置為1。

static void _dictRehashStep(dict *d) {if (d->iterators == 0) dictRehash(d,1);
}

? ? ? ? 另一種是是提供給用戶觸發的,但是作者還是希望盡量保證其操作時間不可以過長,所以提供了下面的方法:

/* Rehash for an amount of time between ms milliseconds and ms+1 milliseconds */
int dictRehashMilliseconds(dict *d, int ms) {long long start = timeInMilliseconds();int rehashes = 0;while(dictRehash(d,100)) {rehashes += 100;if (timeInMilliseconds()-start > ms) break;}return rehashes;
}

? ? ? ? 此時rehash操作的步進長度為100,這樣相對于步進長度為1的情況,算是批量操作,可以省去函數調用和返回的時間消耗。相應的,還需要使用者提供時間進行約束。至于時長多少,使用者需要自己權衡了。

增加元素

? ? ? ? 新增元素通過下面函數實現

int dictAdd(dict *d, void *key, void *val)
{dictEntry *entry = dictAddRaw(d,key);if (!entry) return DICT_ERR;dictSetVal(d, entry, val);return DICT_OK;
}

? ? ? ??dictAddRaw方法獲取一個新的dictEntry指針,然后通過用于傳入的函數指針,將value復制到dictEntry所指向的對象的值上

#define dictSetVal(d, entry, _val_) do { \if ((d)->type->valDup) \entry->v.val = (d)->type->valDup((d)->privdata, _val_); \else \entry->v.val = (_val_); \
} while(0)

? ? ? ??dictAddRaw方法的實現我們需要注意下。首先它會檢測該字典是否處在rehash的狀態,如果是,則讓其rehash一步

dictEntry *dictAddRaw(dict *d, void *key)
{int index;dictEntry *entry;dictht *ht;if (dictIsRehashing(d)) _dictRehashStep(d);

? ? ? ? 然后檢測key是否已經在map中存在,如果存在則不能新增;否則返回key所在的指針數組的下標。(dictHashKey(ht, key) & ht->sizemask;)

    /* Get the index of the new element, or -1 if* the element already exists. */if ((index = _dictKeyIndex(d, key)) == -1)return NULL;

? ? ? ? 由于字典可能處在rehash的中間狀態,數據一部分在ht[0]中,有一部分在ht[1]中。這個時候就需要判斷新增的dictEntry是要加到哪個dictht上:如果在rehash,則新增到ht[1]上。因為如果新增到ht[0]上,此時rehashidx可能已經越過剛新增key對應的索引,導致數據丟失;如果不在rehash狀態,則新增到ht[0]上。

    ht = dictIsRehashing(d) ? &d->ht[1] : &d->ht[0];entry = zmalloc(sizeof(*entry));entry->next = ht->table[index];ht->table[index] = entry;ht->used++;/* Set the hash entry fields. */dictSetKey(d, entry, key);return entry;
}

刪除元素

? ? ? ? 刪除元素時,需要在ht[0]和ht[1]中查找并刪除,所以會遍歷兩個table

static int dictGenericDelete(dict *d, const void *key, int nofree)
{unsigned int h, idx;dictEntry *he, *prevHe;int table;if (d->ht[0].size == 0) return DICT_ERR; /* d->ht[0].table is NULL */if (dictIsRehashing(d)) _dictRehashStep(d);h = dictHashKey(d, key);for (table = 0; table <= 1; table++) {

? ? ? ? 然后找到key對應的指針數組的下標

        idx = h & d->ht[table].sizemask;

? ? ? ? sizemask是數組長度減去1。上面這步與操作,相當于讓hash值向數組長度取余數。比如我們hash值是5(0x101),數組長度是4(0x100),則sizemask為3(0x011)。5和3進行與運算,得出的是0x001,即5%4的結果。

? ? ? ? 找到指針下標后,則對該下標所指向的鏈表進行遍歷。找到元素就將其從鏈表中摘除。至于是否需要通過用戶提供的析構函數將key和value析構掉,要視傳入的force值決定。

        he = d->ht[table].table[idx];prevHe = NULL;while(he) {if (key==he->key || dictCompareKeys(d, key, he->key)) {/* Unlink the element from the list */if (prevHe)prevHe->next = he->next;elsed->ht[table].table[idx] = he->next;if (!nofree) {dictFreeKey(d, he);dictFreeVal(d, he);}zfree(he);d->ht[table].used--;return DICT_OK;}prevHe = he;he = he->next;}if (!dictIsRehashing(d)) break;}return DICT_ERR; /* not found */
}

? ? ? ? Redis字典庫對上面方法進行封裝,提供了下面這兩個函數:

int dictDelete(dict *ht, const void *key) {return dictGenericDelete(ht,key,0);
}int dictDeleteNoFree(dict *ht, const void *key) {return dictGenericDelete(ht,key,1);
}

查找元素

? ? ? ? 查找元素也需要考慮字典是否在rehash的過程中,于是查找也要視情況看看在ht[0]中查找,還是也要在ht[1]中查找:

dictEntry *dictFind(dict *d, const void *key)
{dictEntry *he;unsigned int h, idx, table;if (d->ht[0].used + d->ht[1].used == 0) return NULL; /* dict is empty */if (dictIsRehashing(d)) _dictRehashStep(d);h = dictHashKey(d, key);for (table = 0; table <= 1; table++) {idx = h & d->ht[table].sizemask;he = d->ht[table].table[idx];while(he) {if (key==he->key || dictCompareKeys(d, key, he->key))return he;he = he->next;}if (!dictIsRehashing(d)) return NULL;}return NULL;
}void *dictFetchValue(dict *d, const void *key) {dictEntry *he;he = dictFind(d,key);return he ? dictGetVal(he) : NULL;
}

修改(無時新增)元素

? ? ? ? Redis的字典庫,會先嘗試往字典里新增該key,然后再查找到該key,讓其value變成需要替換的值,最后還要將原來的value釋放掉

int dictReplace(dict *d, void *key, void *val)
{dictEntry *entry, auxentry;/* Try to add the element. If the key* does not exists dictAdd will suceed. */if (dictAdd(d, key, val) == DICT_OK)return 1;/* It already exists, get the entry */entry = dictFind(d, key);/* Set the new value and free the old one. Note that it is important* to do that in this order, as the value may just be exactly the same* as the previous one. In this context, think to reference counting,* you want to increment (set), and then decrement (free), and not the* reverse. */auxentry = *entry;dictSetVal(d, entry, val);dictFreeVal(d, &auxentry);return 0;
}

總結

以上是生活随笔為你收集整理的Redis源码解析——字典基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久久黄色av | 色干综合 | www亚洲一区 | 午夜色大片在线观看 | 国产一在线精品一区在线观看 | 久久精品视 | 国产成人精品av在线观 | 国产精品一区二区视频 | 日韩三级视频在线观看 | 射九九| 一本大道久久精品懂色aⅴ 五月婷社区 | 免费精品在线观看 | 久久久久久久免费 | 91精品久久久久久久99蜜桃 | 日韩三级免费观看 | 97色资源 | 在线观看深夜视频 | 香蕉视频亚洲 | 中文字幕婷婷 | 久久伊人国产精品 | 亚洲国产成人在线 | 日韩在线视 | av不卡在线看 | 国产视频在线一区二区 | 精品国产一区二区久久 | 91精品1区2区 | 久久国产午夜精品理论片最新版本 | 中文字幕在线观看视频免费 | 在线精品亚洲一区二区 | 成年人看片 | 96精品视频 | v片在线看 | 日本黄色免费在线观看 | 在线视频 日韩 | 日韩一区二区三 | 在线观看亚洲视频 | 草久中文字幕 | 91丨九色丨蝌蚪丨老版 | 久久综合五月天 | 久久成人人人人精品欧 | 亚洲综合在线播放 | 日韩电影在线观看中文字幕 | 色婷婷久久久综合中文字幕 | 国产爽视频 | 国产 欧美 日本 | 久久精品123 | 一区二区三区免费 | 成人黄在线 | 久久免费中文视频 | 91在线影院 | 特级西西444www大精品视频免费看 | 91色在线观看视频 | 国内精品久久久久久久97牛牛 | 国产大片免费久久 | 日日干天天 | 久久夜色精品国产欧美一区麻豆 | 久久视频免费看 | 国产高清中文字幕 | 天天操天天操天天爽 | 久久国产精品久久精品国产演员表 | 香蕉视频在线免费 | 91av在线免费视频 | 97国产精品久久 | 国产精品麻豆果冻传媒在线播放 | 97超碰在线资源 | 国产精品视屏 | 欧美色图视频一区 | 免费精品在线 | zzijzzij日本成熟少妇 | 欧美精品中文 | 99久久精品免费看国产免费软件 | 九月婷婷综合网 | 亚洲影视九九影院在线观看 | 中文字幕在线视频第一页 | 97视频在线观看网址 | 国外调教视频网站 | 伊人影院得得 | 久久99网站 | 久久久国产精品一区二区中文 | 精品91| 特级西西人体444是什么意思 | 国产一区二区三区久久久 | 免费av网址大全 | 视频99爱| 91pony九色丨交换 | 中文久草| 香蕉视频4aa| 国产精品久久久久久超碰 | 亚洲视频中文 | 久久久精品 一区二区三区 国产99视频在线观看 | 视频成人| 精品国产一区二区三区蜜臀 | 久草在线手机视频 | 九九免费观看视频 | 日韩久久精品一区二区三区 | 中文字幕制服丝袜av久久 | 99在线看 | 在线精品一区二区 | 国产视频精选 | 毛片激情永久免费 | 欧美日韩免费在线观看视频 | 91香蕉亚洲精品 | 激情欧美一区二区三区免费看 | 国产精品成人在线观看 | 色综合色综合久久综合频道88 | 97超级碰碰碰视频在线观看 | 日日干日日 | 日本精品视频免费观看 | av黄色亚洲| 蜜臀av免费一区二区三区 | 免费观看特级毛片 | 天天色天天射天天操 | 亚洲国产成人高清精品 | 激情喷水 | 国产精品网站 | 天天天天天天操 | 黄色看片 | 丁香综合激情 | 欧美极品少妇xxxx | 国产明星视频三级a三级点| 99精品国产一区二区三区麻豆 | 在线视频手机国产 | 亚洲欧美日韩一区二区三区在线观看 | 激情视频免费在线观看 | 久久免费a | 国产精品一区久久久久 | 国产精品在线看 | 午夜免费久久看 | 97超碰人人澡人人爱学生 | 安徽妇搡bbbb搡bbbb | 亚洲激情六月 | 婷婷av色综合 | 久草在线免费资源 | 香蕉影院在线观看 | 中文字幕乱码亚洲精品一区 | 免费亚洲精品视频 | 人人插人人玩 | 亚洲精品视频网址 | www.夜夜骑.com | 久久精品99精品国产香蕉 | 欧美三级高清 | 欧美国产日韩一区二区 | 在线观看中文字幕av | 国产高清久久 | 五月天色婷婷丁香 | 特黄特黄的视频 | 色婷婷六月天 | 综合久久久久久久 | 国产精品久久网 | 久久久性 | 精品成人久久 | japanesexxxhd奶水 91在线精品一区二区 | 亚洲区另类春色综合小说 | 国产在线国偷精品产拍 | 久久久久久久久久久久久久免费看 | 国产精品一区二区免费看 | 日韩午夜精品 | 日本99热| 久久黄色a级片 | 成人午夜性影院 | 国产精品久久一区二区三区, | 中文字幕在线一区观看 | 在线成人小视频 | 久久久久久久久久影视 | 91精品国自产在线偷拍蜜桃 | 一级理论片在线观看 | 一区二区三区三区在线 | 久久亚洲综合国产精品99麻豆的功能介绍 | 中文字幕精品在线 | 狠狠色狠狠色合久久伊人 | 九九热国产视频 | 亚洲午夜久久久久久久久电影网 | 91黄色在线观看 | 亚洲国产中文字幕在线 | 一级大片在线观看 | 成年人看片 | 日日精品 | 永久免费视频国产 | 久久久久久久久免费视频 | 国产精品欧美久久久久三级 | 中文字幕国产亚洲 | 国内丰满少妇猛烈精品播放 | 国产高清综合 | 97av影院 | 日躁夜躁狠狠躁2001 | 色婷婷久久一区二区 | 天天干天天色2020 | 美女免费视频一区二区 | 特级黄录像视频 | 亚洲精品h | 狠狠操狠狠操 | 九九激情视频 | 九九电影在线 | 欧美99热 | 97在线影院 | 毛片黄色一级 | 成人免费网站在线观看 | 国产黄色免费在线观看 | 久久香蕉影视 | 天天操天| 激情视频91 | 黄色小说视频网站 | 日韩在线观看你懂的 | 欧美在线观看禁18 | www.天天色.com | 亚洲激情网站免费观看 | 久久久久久久久网站 | 狠狠操在线 | 亚洲精品国产精品乱码在线观看 | www.av中文字幕.com| 麻豆视频免费播放 | 国产精品久久婷婷六月丁香 | 亚洲精品美女 | 九色porny真实丨国产18 | 精品久久久久久亚洲 | 久久蜜桃av| 天天曰天天曰 | 欧美国产亚洲精品久久久8v | 亚洲视频免费 | 特级黄色视频毛片 | 天天干天天操 | 亚洲日本一区二区在线 | av导航福利| 视频三区在线 | 久久精彩免费视频 | 成人av影视| 精品久久久久久久 | 国产精品自产拍在线观看蜜 | 久久久精品亚洲 | 久久av免费 | 韩国精品在线观看 | 亚洲一区二区三区四区在线视频 | 日本在线视频一区二区三区 | 中文字幕在线中文 | 亚洲精品无 | 日日夜夜网 | 亚洲国产视频在线 | 999成人| 97在线免费视频 | 日韩三级免费 | 特级免费毛片 | 国产精品免费麻豆入口 | 日本久久91 | 色婷婷综合五月 | 日韩欧美在线视频一区二区三区 | 欧美精品亚洲精品日韩精品 | 成人久久18免费网站 | 三级在线视频观看 | 日韩精品大片 | 99久免费精品视频在线观看 | 国产午夜激情视频 | 欧美在线观看视频一区二区三区 | 成人国产精品免费 | 欧美精品资源 | 欧美色图狠狠干 | 99国产情侣在线播放 | 91c网站色版视频 | 亚洲精品综合一二三区在线观看 | 国产精品亚洲a | 欧日韩在线| 久久久久久毛片精品免费不卡 | 久热色超碰 | 91超碰在线播放 | 日本久久久久久久久久久 | 99视频精品全部免费 在线 | 成人影音av| 婷婷婷国产在线视频 | 亚洲国产欧美一区二区三区丁香婷 | 久久视频在线观看 | 成人宗合网 | 成人av资源在线 | 欧美天天综合网 | 色婷婷一| 日本精品视频在线播放 | 久久精品视频在线观看免费 | 色网站在线 | 91福利视频免费观看 | 成人免费看片98欧美 | 久久成人国产精品入口 | 狠狠干夜夜操天天爽 | 在线观看91| 国内视频在线 | 国产精品不卡在线 | 天天天干天天射天天天操 | 欧美色道| 婷婷精品在线视频 | 久久成人高清 | 天天爽夜夜爽精品视频婷婷 | 精品美女在线视频 | 日本久久精 | 青春草视频在线播放 | 欧美精品一二三 | 久久激情视频 久久 | 久碰视频在线观看 | 亚洲美女免费视频 | 国产小视频在线 | 激情久久久久久久久久久久久久久久 | 中文字幕亚洲欧美日韩2019 | 美女久久视频 | 在线观看你懂的网站 | 中文字幕电影网 | 五月天色站 | 久久久九色精品国产一区二区三区 | 免费在线国产 | 亚洲经典视频 | 国产精品成人国产乱一区 | 日韩免费播放 | 丁香高清视频在线看看 | 六月色丁香| 在线精品观看国产 | 国产精品久久久久久久久免费 | 国产精成人品免费观看 | 欧美日韩中文字幕视频 | 天天射综合网视频 | 国产免费黄视频在线观看 | 欧美疯狂性受xxxxx另类 | 西西444www大胆高清视频 | 99国产在线观看 | 草 免费视频 | 久久网站免费 | 黄色毛片视频免费 | 欧美片网站yy | 伊人干综合 | 国产成人不卡 | 亚洲黄色av| 亚洲色图激情文学 | 亚州人成在线播放 | 成年人在线观看网站 | 中文国产字幕在线观看 | 91久久精品日日躁夜夜躁国产 | 超碰在线97国产 | 久久99爱视频 | 国产精品久久久久久爽爽爽 | 亚洲乱亚洲乱妇 | av在线进入 | 丁香六月综合网 | 亚洲精品在线资源 | 草久在线观看视频 | 美州a亚洲一视本频v色道 | 岛国av在线不卡 | 久久国产美女 | 人人看人人爱 | 麻豆国产精品永久免费视频 | 国产韩国日本高清视频 | 射射色| 三级av中文字幕 | 久久精品久久久久电影 | 午夜精品视频在线 | av中文字幕在线观看网站 | 一区二区三区久久精品 | 在线观看亚洲国产 | 99热在线看 | 99久久精品久久亚洲精品 | 中文字幕在线播放一区 | 9在线观看免费高清完整版在线观看明 | 97超碰人人澡 | 国产精品久久久久久久久久久免费看 | 亚洲欧美视频在线观看 | 国产免费不卡 | 18做爰免费视频网站 | 激情av在线播放 | 国产人在线成免费视频 | 四虎影视成人永久免费观看亚洲欧美 | 国产免码va在线观看免费 | 97干com| 91视视频在线直接观看在线看网页在线看 | 91av在线播放| 亚洲电影院 | 91爱爱视频 | 国产精品久久一区二区无卡 | 992tv在线成人免费观看 | 久久在线一区 | av免费看在线 | 中文不卡视频在线 | 国产精品麻豆视频 | 天天操伊人 | 91精品久久久久久久久 | 91精品老司机久久一区啪 | 在线午夜电影神马影院 | 色九色| 国产精品麻豆视频 | www.香蕉| 免费福利在线视频 | 99视频在线观看视频 | 亚洲人成免费 | 丁香婷婷激情网 | 狠狠操狠狠干天天操 | 国产福利一区二区三区在线观看 | 久久综合九色综合欧美狠狠 | www久| 俺要去色综合狠狠 | 中文字幕之中文字幕 | 激情电影在线观看 | 中文字幕乱码亚洲精品一区 | 99久高清在线观看视频99精品热在线观看视频 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 91成人精品一区在线播放69 | 亚洲欧美日韩精品久久久 | 国产剧情av在线播放 | 日韩精品中文字幕在线播放 | 五月天堂网 | 久久激情日本aⅴ | 中文字幕在线观看日本 | 色视频在线观看免费 | 日韩激情免费视频 | 四虎成人免费影院 | 亚洲第一av在线播放 | 日韩av黄| 成年人免费电影在线观看 | 人人爱人人添 | 二区三区在线视频 | 十八岁以下禁止观看的1000个网站 | 国产精品永久免费 | 日韩av成人免费看 | 亚洲 欧洲av | 99精品在线 | 欧美日韩中字 | 日韩高清在线一区 | 99视频免费看| 伊人激情网| 亚州av免费| 精精国产xxxx视频在线播放 | 国产在线观看你懂得 | 成人av在线影视 | 亚洲一本视频 | 国产精品久久久久久久久蜜臀 | 亚洲一区二区三区四区在线视频 | 久久久国产一区二区三区四区小说 | 在线激情小视频 | 激情欧美xxxx| 欧美日韩在线观看一区二区 | 西西大胆免费视频 | 夜夜躁日日躁狠狠躁 | 97碰在线视频 | 美女网站视频一区 | 97麻豆视频 | 狠狠色丁香婷综合久久 | 亚洲一区二区天堂 | 国内毛片毛片 | 久久久久久免费视频 | 国产a网站 | 欧美精品久久久久久久久老牛影院 | 久久久久久中文字幕 | 久久久久成人精品 | 日韩在线观看a | 349k.cc看片app | 深爱激情五月婷婷 | 精品自拍av | 美女很黄免费网站 | 超碰在线人人爱 | 九九九九热精品免费视频点播观看 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 久青草视频在线观看 | 欧美精品视 | 亚洲黑丝少妇 | 午夜123| 日韩在线观看一区二区三区 | 91成人免费看 | 久草手机视频 | 97人人爽人人 | 欧美一区二区三区不卡 | 在线观看视频中文字幕 | 成人av影视 | 这里只有精品视频在线 | 极品嫩模被强到高潮呻吟91 | 日韩免费不卡视频 | 999精品在线| 亚洲一区 影院 | 国产精品成人一区二区三区 | 99久热在线精品视频观看 | 日韩一级网站 | 国产精品免费小视频 | 最近中文字幕完整视频高清1 | 天天做天天射 | 一区二区三区av在线 | 国产免费一区二区三区最新6 | 成人av手机在线 | 日本精品一二区 | 国产精品一区二区果冻传媒 | 91精品国自产在线观看 | 午夜精品一区二区三区免费视频 | www.操.com| 国产99区 | 免费麻豆 | 国产亚洲婷婷 | 午夜精品视频福利 | 久久av一区二区三区亚洲 | 99久久综合狠狠综合久久 | 国内视频在线观看 | 亚洲美女在线一区 | 午夜精品电影一区二区在线 | 免费av观看网站 | 黄色大全免费观看 | 国产亚洲婷婷免费 | 亚洲精品视频在线播放 | 98超碰人人 | 亚洲国产成人久久 | av线上看| 亚洲成a人片综合在线 | 日韩网站在线免费观看 | 成人在线中文字幕 | 美女久久99 | 69av免费视频| 99精品视频一区二区 | 欧美精品久久久久久久久久丰满 | 在线免费精品视频 | 国产美女免费观看 | 亚洲国产精品一区二区久久hs | 久久超碰99 | www.亚洲激情.com | 精品一区二区免费 | 91精品导航| www国产亚洲精品久久网站 | 亚洲日本va在线观看 | 夜夜夜草 | 日韩mv欧美mv国产精品 | 日韩另类在线 | 国产麻豆精品久久一二三 | 麻豆传媒视频在线播放 | 深爱五月网 | 日本精品中文字幕在线观看 | 久久久久久久久亚洲精品 | 最近高清中文字幕在线国语5 | 久热超碰 | 婷婷综合激情 | 久久久久国产精品www | 国产午夜亚洲精品 | 精品一区精品二区 | 国产精品久久久久久久久免费看 | 久久久久综合网 | av免费黄色 | 丁香六月在线 | 亚洲国产99| 在线日本看片免费人成视久网 | 婷婷色社区| 狠狠色丁香婷婷综合基地 | 午夜国产一区二区 | 99久久精品国产毛片 | 日批视频国产 | 久久精品久久久久电影 | 五月天久久久久久 | 色婷婷97| 国产一区二区高清 | 日韩一二三区不卡 | 婷婷久久久 | 狠狠操天天射 | 国产伦精品一区二区三区无广告 | 国产精品毛片完整版 | 日韩国产高清在线 | 日日射天天射 | 欧美精品首页 | av在线电影网站 | 欧美日韩中文在线视频 | 成人在线视频在线观看 | 国产欧美综合在线观看 | 精品国产免费一区二区三区五区 | 在线观看免费福利 | 99热都是精品 | bayu135国产精品视频 | 碰天天操天天 | 久久理论电影网 | 日韩三级视频在线看 | 日本黄色a级大片 | 在线国产91| 97免费在线观看视频 | 黄色大片免费播放 | 日韩免费不卡av | 国产一区欧美一区 | 日日夜夜91 | 国产精品久久99综合免费观看尤物 | 99久高清在线观看视频99精品热在线观看视频 | 日韩av一区二区在线播放 | 久久国产精品99国产 | 日日干夜夜干 | 国产一区视频在线播放 | 特级黄色一级 | 日韩免费不卡av | 福利视频导航网址 | 天天综合日日夜夜 | 久久国产影院 | 日韩欧美不卡 | 欧美做受高潮电影o | 99久久久久久久久久 | 精品在线观 | 亚洲成人二区 | 日韩色一区二区三区 | 波多野结衣电影一区二区 | 91成人精品一区在线播放69 | 狠狠的干 | 日韩中文字幕a | 成人免费xxx在线观看 | 中文字幕91视频 | 亚洲成人免费 | 成片人卡1卡2卡3手机免费看 | 欧美日韩网址 | 国产剧情一区二区 | 黄色小说免费在线观看 | 黄色三级免费网址 | 免费看搞黄视频网站 | 久久精品网站视频 | 日韩视频在线一区 | 久久8| 成人午夜影院在线观看 | 日韩免费在线 | 免费在线观看av网址 | 亚洲成a人片综合在线 | 欧美一区二区三区不卡 | 欧美在线观看视频一区二区三区 | 国产精品毛片一区二区在线 | 久久久久高清 | 丁香亚洲| 亚洲乱码在线观看 | 夜夜爽88888免费视频4848 | 精品视频99 | 国产精品久久久久婷婷 | 日韩精品久久久免费观看夜色 | 97成人资源站 | 色999视频 | 日日摸日日碰 | 亚洲午夜精品久久久久久久久久久久 | 最近2019中文免费高清视频观看www99 | 97精品国产aⅴ | 日韩一区正在播放 | 成人av片免费看 | 成人黄色小说视频 | 色综合久久久久综合体桃花网 | 亚洲视频高清 | 黄色a视频 | 国产成人精品一区二区 | 五月婷在线视频 | 91成人免费在线视频 | 天天干,天天射,天天操,天天摸 | 亚洲黄色av | 国产免费资源 | 国产剧情一区二区 | 国产网红在线观看 | 国产 欧美 日产久久 | 成人99免费视频 | 韩日av在线 | 日本系列中文字幕 | 久久视频国产精品免费视频在线 | 天天爽夜夜爽精品视频婷婷 | 欧美中文字幕第一页 | 夜夜夜夜夜夜操 | 黄色毛片一级片 | 天堂av在线 | 激情av网址| 麻豆免费观看视频 | 日韩动态视频 | 国产三级午夜理伦三级 | 欧美中文字幕第一页 | 免费看三级网站 | 久久久国产视频 | av一级免费| 超碰97网站| 久久久一本精品99久久精品66 | av888.com | 久草精品视频在线观看 | 国产一级免费片 | 久久av福利 | 天天操婷婷| 免费观看十分钟 | 亚洲 欧洲 国产 日本 综合 | 操老逼免费视频 | 久久观看免费视频 | 五月婷社区 | 免费观看一级特黄欧美大片 | 日本不卡一区二区三区在线观看 | 香蕉久久久久久av成人 | 亚洲一区日韩 | 欧美精品久久久久久 | 国产专区视频在线 | 国产专区在线看 | 亚洲日本va在线观看 | 中文字幕中文字幕在线中文字幕三区 | 久久久久国 | 福利视频入口 | 精品久久网| 毛片在线播放网址 | 99久久国产免费看 | 日韩中文字幕国产 | 国产黄色免费观看 | 香蕉视频18 | 在线 你懂| 久久午夜免费观看 | 成人免费xxx在线观看 | 国外调教视频网站 | 青草视频网 | 99视频在线 | 四虎在线视频免费观看 | 最近更新好看的中文字幕 | 97色婷婷人人爽人人 | 欧美精品黑人性xxxx | 97在线观看免费视频 | 国产精品婷婷午夜在线观看 | 精品一区二区6 | 欧美一区二区三区在线观看 | 2017狠狠干| 天堂网在线视频 | 成人影音av | 高清精品久久 | 日日干夜夜爱 | 日韩电影在线观看一区二区三区 | 亚洲精品av中文字幕在线在线 | 激情久久婷婷 | 中文字幕在线观看日本 | 91尤物国产尤物福利在线播放 | 国产免费又爽又刺激在线观看 | 精品国产精品国产偷麻豆 | 精品a级片| 亚洲天堂网视频在线观看 | 国产专区欧美专区 | 外国av网 | 国内久久看 | 天天天天爽| 国产精品丝袜在线 | 日韩免费播放 | 国产精品免费久久久久久久久久中文 | 国产九色视频在线观看 | 亚洲精品在线观看的 | 国产精品av在线 | 精品国自产在线观看 | 免费看在线看www777 | 91福利视频免费 | 色综合色综合色综合 | 婷婷色九月| 精品乱码一区二区三四区 | 玖玖精品视频 | 国产99久久九九精品免费 | 夜夜夜夜夜夜操 | 日韩有码网站 | 精品女同一区二区三区在线观看 | 国产老太婆免费交性大片 | 久久国产精品99国产 | 日韩免费视频播放 | 欧美日韩中文字幕综合视频 | 国产精品原创视频 | 成x99人av在线www | 国产视频亚洲精品 | 涩涩爱夜夜爱 | 91亚洲欧美 | 久久九九精品久久 | 久久婷婷视频 | av福利在线看 | 精品亚洲视频在线观看 | 一区二区三区国产精品 | 精品字幕| 麻豆91精品 | 欧美成人免费在线 | 6080yy午夜一二三区久久 | 久草视频2| 欧美精品一区二区蜜臀亚洲 | 国产精品欧美一区二区 | 99精品久久99久久久久 | 精品美女在线视频 | 久久国产精品一二三区 | 热久久国产 | 人人玩人人添人人澡超碰 | 夜夜爽天天爽 | 美女视频黄是免费的 | 免费黄色在线 | 西西44人体做爰大胆视频 | 2022久久国产露脸精品国产 | 日批视频国产 | 久久高清毛片 | 人人干,人人爽 | 免费一级黄色 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 黄色三级久久 | 九九热精 | 久久99国产精品二区护士 | 国产成人精品一区在线 | 天天操天天操天天 | 99精品视频在线观看 | 午夜精品一区二区三区免费视频 | 免费看成年人 | 911国产| 婷婷精品进入 | 99精品欧美一区二区 | 91精品久久久久久久久 | 麻豆av一区二区三区在线观看 | 天天操天天干天天干 | www.在线观看av | 99久免费精品视频在线观看 | 91精品国自产在线偷拍蜜桃 | 青青河边草免费视频 | 在线免费观看国产视频 | 丝袜一区在线 | 国产日韩欧美精品在线观看 | 一区 在线 影院 | 国产精品欧美日韩在线观看 | 国产精品毛片久久久久久久久久99999999 | 婷婷丁香激情网 | 中文字幕频道 | 久久久久久久电影 | 97超碰在线免费观看 | 欧美极品一区二区三区 | 中文在线资源 | 91免费网站在线观看 | 国产精品福利小视频 | 欧美亚洲另类在线视频 | 久久国产精品久久国产精品 | 亚洲国产欧美一区二区三区丁香婷 | www.久久免费视频 | 婷五月激情 | 天天夜夜操| 免费一级片视频 | 国产综合精品一区二区三区 | 91久久精品一区 | 91黄视频在线 | 久久精品美女 | 中文字幕制服丝袜av久久 | 99精品视频在线观看免费 | av在线网站免费观看 | 99久久久久久国产精品 | 国产精品美女免费 | 18岁免费看片 | avcom在线| 久久久久国产精品免费免费搜索 | 亚洲人片在线观看 | 欧美与欧洲交xxxx免费观看 | 91av播放| 狠狠色丁香久久婷婷综合_中 | 黄网站色视频免费观看 | www黄色 | 国产精品久久久久久久久搜平片 | 香蕉看片| 五月天久久久 | www.久久免费视频 | v片在线看 | 少妇bbbb搡bbbb搡bbbb | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 丁香网五月天 | 久久久久在线 | 国产成人一区二区三区在线观看 | 日日碰狠狠躁久久躁综合网 | www.黄色网.com| 久久精品日本啪啪涩涩 | 免费a v在线 | 久久久久久久久久久久久9999 | 黄色av网站在线观看免费 | 人人澡人 | 热久久免费视频 | 福利久久久 | 高清有码中文字幕 | 91精品久久久久 | 丁香花五月 | 欧美精品在线一区二区 | 久草视频播放 | 久草在线观看视频免费 | 免费观看www7722午夜电影 | 成人黄色片在线播放 | 五月婷婷综合在线视频 | 豆豆色资源网xfplay | 国产在线观看 | 国产二区免费视频 | 精品欧美一区二区三区久久久 | 成人国产精品免费观看 | 在线亚洲人成电影网站色www | 亚洲国产精品资源 | www.成人久久 | 中文字幕av网站 | 日韩精品国产一区 | 国产精品日韩久久久久 | 天天干干 | 日韩精品一区二区在线观看 | 99视频免费在线观看 | 国产美女在线免费观看 | 综合国产在线 | 亚洲伊人成综合网 | 草免费视频 | 99精品久久久久久久 | 成人黄色毛片 | 欧美少妇18p | 欧美精品一级视频 | 亚州精品在线视频 | 亚洲成人在线免费 | 国产精品自在线拍国产 | 国产高清久久久久 | 日韩av一区二区在线影视 | 久久久久免费精品视频 | 亚洲精品乱码久久 | 国产一级在线观看 | 视频1区2区 | 久久99热这里只有精品 | 国产高清专区 | 精品国产三级 | 天天操夜夜操国产精品 | 欧美精品在线一区 | 丁香六月婷 | 成人午夜精品久久久久久久3d | 亚洲成av片人久久久 | 91亚洲精品久久久蜜桃借种 | 国产xxxx| 最新日韩电影 | 91大神电影 | 国产99一区二区 | 亚洲精品久久久久久国 | 国产精品久久麻豆 | 国产成人区| 亚洲码国产日韩欧美高潮在线播放 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 日日干视频 | 毛片随便看 | 这里只有精品视频在线 | 99视频免费观看 | 五月av在线 | 国产午夜三级一区二区三 | 97碰碰精品嫩模在线播放 | 超碰在线人人草 | 五月天亚洲激情 | 一区二区三区影院 | 国产中文字幕第一页 | 亚洲高清国产视频 | 99亚洲视频 | 色久天| 亚洲第一久久久 | 国产精品美女久久久久久久 | 国产97碰免费视频 | 成人av网址大全 | 天天操天天色综合 | 综合久久久久 | 亚洲黄色高清 | 欧美日韩国内在线 | 黄色电影在线免费观看 | 91精品国产三级a在线观看 | 奇米影视四色8888 | 国产午夜三级一区二区三桃花影视 | 色综合综合 | 国内视频在线观看 | 亚洲开心激情 | 日日干干| 日韩激情一二三区 | 天堂av色婷婷一区二区三区 | 国产精品国产三级国产 | 亚洲精品大片www | 欧美不卡视频在线 | 国产成人精品一区在线 | 天天射天 | 国产精品亚洲a | 2018亚洲男人天堂 | 天天草天天干天天射 | 日韩欧美一区二区在线播放 | 91亚洲精品久久久久图片蜜桃 | 成人性生爱a∨ | 六月丁香六月婷婷 | 最近中文字幕国语免费高清6 | 国产黄在线播放 | 天天操夜操 | 国产精品人成电影在线观看 | 色噜噜日韩精品一区二区三区视频 | 极品久久久久 | 免费成人在线观看 | 国产精品6 | 欧美91成人网 | 91麻豆精品国产91久久久久久久久 | 成人在线你懂得 | 免费视频 三区 | 三级黄色免费 | 久久久这里有精品 | 中文字幕 国产精品 | 99精品视频免费 | 久久99精品久久久久久三级 | 热久久免费国产视频 | 国产精品1000| 国产欧美综合视频 | 91免费视频黄 | 国产亚洲欧美在线视频 | 亚洲美女在线国产 | 久久激情视频 久久 | 日韩免费av网址 | 久久一区二区三区国产精品 | 久久草在线免费 | 欧美精品资源 | 国产精品美女久久久久久久久 | 亚洲区另类春色综合小说 | 免费福利视频导航 | sm免费xx网站 | 久久久久成人免费 | 精品国内自产拍在线观看视频 | 久久久久免费电影 | 蜜桃麻豆www久久囤产精品 | 免费观看丰满少妇做爰 | 草莓视频在线观看免费观看 | 国产精品久久久久婷婷二区次 | 欧美精品乱码久久久久久 | 亚洲欧洲国产视频 | 久久综合在线 | 狠狠色丁香婷综合久久 | 日本一区二区高清不卡 | 中文字幕精品三级久久久 | 国产黄色av网站 | 在线观看黄色免费视频 | 特级a老妇做爰全过程 | 最新极品jizzhd欧美 | 91精品伦理 | 国产片网站 | 日韩av在线高清 |