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

聊聊 Redis 中的字典設(shè)計(jì)與實(shí)現(xiàn)

數(shù)據(jù)庫(kù) Redis
本文筆者從字典的數(shù)據(jù)結(jié)構(gòu)和常見操作的角度對(duì)Redis中字典的設(shè)計(jì)思想和優(yōu)化思路進(jìn)行深入的剖析,希望對(duì)你有幫助。

Redis作為非關(guān)系數(shù)據(jù)庫(kù),其底層采用了字典(也稱為映射)保存鍵值對(duì)。本文會(huì)基于源碼分析的方式帶你了解redis中這一常見數(shù)據(jù)結(jié)構(gòu)的精巧設(shè)計(jì),希望對(duì)你有幫助。

哈希表的基本數(shù)據(jù)結(jié)構(gòu)

字典用table管理當(dāng)前存儲(chǔ)鍵值對(duì)的數(shù)組,這個(gè)數(shù)組的大小可有size這個(gè)字段知曉,每當(dāng)我們有一個(gè)鍵值對(duì)要存儲(chǔ)到字典時(shí)就會(huì)通過sizemask進(jìn)行按位與運(yùn)算得到table數(shù)組的某個(gè)索引位置將當(dāng)前鍵值對(duì)存儲(chǔ),然后自增一個(gè)used標(biāo)識(shí)當(dāng)前有一個(gè)節(jié)點(diǎn)加入。

可能上文說的比較抽象,我們不妨舉個(gè)例子,假設(shè)我們現(xiàn)在鍵入如下指令:

HSET student  xiaoming 18

redis完成命令解析后,定位到student這個(gè)key對(duì)應(yīng)的字段空間的字典,找到當(dāng)前正在使用的哈希表,按照如下步驟完成鍵值對(duì)存儲(chǔ):

  • 計(jì)算xiaoming的哈希值。
  • 將計(jì)算出的哈希值和sizemask即3,也就是數(shù)組的索引范圍進(jìn)行按位與運(yùn)算,得到對(duì)應(yīng)的數(shù)組索引位置。
  • 查看該位置是否有元素,如果沒有則直接添加,反之追加到該dictEntry的后面,這也就是我們常說的鏈地址法。
  • used字段自增一下,表示當(dāng)前哈希表有一個(gè)元素。

我們可以在dict.h看到上文所提及的哈希表和字典中每一個(gè)元素的數(shù)據(jù)結(jié)構(gòu):

typedef struct dictht {
 //存儲(chǔ)鍵值對(duì)的哈希表
    dictEntry **table;
    //當(dāng)前哈希表的大小
    unsigned long size;
    //計(jì)算哈希值的掩碼值
    unsigned long sizemask;
    //當(dāng)前哈希表的節(jié)點(diǎn)數(shù)
    unsigned long used;
} dictht;

//記錄鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)dictEntry 
typedef struct dictEntry {
 //指向鍵的指針
    void *key;
    
    //通過共用體存儲(chǔ)值
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    //next指針指向下一個(gè)dictEntry 
    struct dictEntry *next;
} dictEntry;

字典的數(shù)據(jù)結(jié)構(gòu)

哈希表在極端算法情況下會(huì)造成大量鍵值對(duì)沖突碰撞的情況,導(dǎo)致查詢效率由原來的O(1)變?yōu)镺(n),所以為了保證針對(duì)沖突的數(shù)組進(jìn)行優(yōu)化,redis的字典采用的雙數(shù)組的方式管理鍵值對(duì)。

如下圖所示,可以看到dict的數(shù)據(jù)結(jié)構(gòu)定義了大小為2的哈希表數(shù)組,當(dāng)某個(gè)哈希表碰撞激烈需要進(jìn)行調(diào)整時(shí),就會(huì)采用漸進(jìn)式哈希算法將鍵值對(duì)存到dictht[1],并通過rehashidx標(biāo)志為-1表示當(dāng)前處于漸進(jìn)式哈希階段:

對(duì)應(yīng)的我們也可以在dict.h看到dict 的定義:

typedef struct dict {
  //.......
   //定義2個(gè)哈希表
    dictht ht[2];
    //-1時(shí)表示當(dāng)前哈希表處于漸進(jìn)式哈希
    int rehashidx; /* rehashing not in progress if rehashidx == -1 */
    //.......
} dict;

字典的創(chuàng)建

進(jìn)行鍵值對(duì)創(chuàng)建時(shí),dictCreate會(huì)進(jìn)行必要的內(nèi)存分配,然后進(jìn)入初始化工作:

  • 初始化兩個(gè)哈希表空間。
  • 設(shè)置類型特定函數(shù)type ,這個(gè)type 包含了各種類型哈希值計(jì)算、值復(fù)制以及鍵比對(duì)等各種方法的指針。
  • 設(shè)置私有數(shù)據(jù)privdata 。
  • 初始化rehashidx 為-1表示未進(jìn)行漸進(jìn)式再哈希。

對(duì)應(yīng)的我們可以在dict.c中看到這段源代碼:

/* Create a new hash table */
dict *dictCreate(dictType *type,
        void *privDataPtr)
{
 //內(nèi)存分配
    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]);
    //設(shè)置類型特定函數(shù)和私有數(shù)據(jù)
    d->type = type;
    d->privdata = privDataPtr;
    //初始化漸進(jìn)式哈希標(biāo)識(shí)
    d->rehashidx = -1;
    d->iterators = 0;
    return DICT_OK;
}

元素的插入

字典的插入操作大體流程也很市面上常見的哈希表實(shí)現(xiàn)差不多,通過哈希算法(MurmurHash2)定位元素插入的位置再進(jìn)行插入操作,唯一有所區(qū)別的是,redis版本字典的鏈地址法解決沖突的上的優(yōu)化,為了保證哈希定位的位置存在元素時(shí)能夠快速插入,redis字典的插入采用的是頭插法,即將最新的元素作為鏈表頭元素插入:

與之對(duì)應(yīng)的我們給出代碼的入口,也就是dict.c下的dictAdd方法,可以看到其內(nèi)部是通過完成鍵的添加,只有key插入成功后才會(huì)通過setVal方法維護(hù)插入的entry的值:

int dictAdd(dict *d, void *key, void *val)
{
 //通過dictAddRaw完成key的插入
    dictEntry *entry = dictAddRaw(d,key);
 //如果插入成功再維護(hù)value
    if (!entry) return DICT_ERR;
    dictSetVal(d, entry, val);
    return DICT_OK;
}

dictAddRaw邏輯也比較簡(jiǎn)單,先檢查當(dāng)前的字典表是否因?yàn)榇罅繘_突而處理漸進(jìn)式哈希(關(guān)于漸進(jìn)式哈希后文會(huì)詳細(xì)講解,這里也補(bǔ)充一些簡(jiǎn)單的概念),通過_dictKeyIndex定位到當(dāng)前元素插入的索引位置,采用頭插法將其插入到對(duì)應(yīng)索引位置的鏈表首部:

dictEntry *dictAddRaw(dict *d, void *key)
{
    int index;
    dictEntry *entry;
    dictht *ht;
 //是否處于漸進(jìn)式哈希階段
    if (dictIsRehashing(d)) _dictRehashStep(d);

   //定位索引位置
    if ((index = _dictKeyIndex(d, key)) == -1)
        return NULL;

   //定位要存儲(chǔ)元素的哈希表位置
    ht = dictIsRehashing(d) ? &d->ht[1] : &d->ht[0];
    //分配內(nèi)存空間
    entry = zmalloc(sizeof(*entry));
    //采用頭插法將元素插入到對(duì)應(yīng)哈希表的索引位置上
    entry->next = ht->table[index];
    ht->table[index] = entry;
    //當(dāng)前插入元素?cái)?shù)加一
    ht->used++;

    /* Set the hash entry fields. */
    dictSetKey(d, entry, key);
    return entry;
}

哈希沖突及其對(duì)應(yīng)解決方案(漸進(jìn)式哈希驅(qū)逐)

隨著我們不斷的新增鍵值對(duì),當(dāng)前的哈希算法得到的索引位置很大概率會(huì)出現(xiàn)哈希沖突,即每次定位到的索引位置都很大概率存在元素,這也就是我們的常說的哈希沖突,這就是redis的字典默認(rèn)會(huì)初始化兩張哈希表的原因所在。

符合以下兩個(gè)條件時(shí),字典就會(huì)觸發(fā)擴(kuò)容機(jī)制:

  • 未進(jìn)行BGSAVE命令或者BGREWRITEAOF持久化操作,且當(dāng)前哈希表元素?cái)?shù)和哈希表空間大小一樣。
  • 正進(jìn)行BGSAVE命令或者BGREWRITEAOF持久化操作,當(dāng)且哈希表元素?cái)?shù)是哈希表空間的5倍。

觸發(fā)擴(kuò)容時(shí),字典會(huì)將rehashidx設(shè)置為0意為當(dāng)前因?yàn)榇罅繘_突碰撞而從0索引開始漸進(jìn)式再哈希,ht[1]就會(huì)開辟一個(gè)ht[0]數(shù)組長(zhǎng)度2倍的數(shù)組空間,后續(xù)的新插入的元素也都會(huì)根據(jù)哈希算法將元素插入到ht[1]中。

對(duì)于舊有存在的元素,考慮到整個(gè)哈希表可能存在不可預(yù)估數(shù)量的鍵值對(duì),redis的字典會(huì)通過漸進(jìn)式哈希的方式在元素每次進(jìn)行增刪改查操作時(shí)將舊有元素遷移到ht[1]中,一旦所有元素全部遷移到ht[1]后,哈希表就會(huì)將ht[1]指向的哈希表指針賦值給ht[0],并將ht[0]原有哈希表釋放。

了解整體的設(shè)計(jì)之后,我們就可以從源碼角度印證這個(gè)問題了,可以看到字典在每次進(jìn)行哈希索引定位時(shí)都會(huì)調(diào)用_dictKeyIndex方法,而該方法內(nèi)部則有一個(gè)_dictExpandIfNeeded操作,其內(nèi)部就會(huì)根據(jù)我們上文所說的閾值判斷當(dāng)前哈希表是否需要進(jìn)行擴(kuò)容:

static int _dictKeyIndex(dict *d, const void *key)
{
    unsigned int h, idx, table;
    dictEntry *he;

    //判斷當(dāng)前哈希表是否需要進(jìn)行擴(kuò)容操作
    if (_dictExpandIfNeeded(d) == DICT_ERR)
        return -1;
   //獲取當(dāng)前key的哈希值
    h = dictHashKey(d, key);
    //計(jì)算哈希值
    for (table = 0; table <= 1; table++) {
     //計(jì)算索引
        idx = h & d->ht[table].sizemask;
  
        he = d->ht[table].table[idx];
        while(he) {
            if (dictCompareKeys(d, key, he->key))
                return -1;
            he = he->next;
        }
        //如果不處于漸進(jìn)式哈希階段,則直接將該索引值返回,后續(xù)元素直接存入ht[0]表中,反之進(jìn)入下一個(gè)循環(huán)計(jì)算當(dāng)前元素在ht[1]表的索引
        if (!dictIsRehashing(d)) break;
    }
    return idx;
}

我們繼續(xù)步入_dictExpandIfNeeded即可看到擴(kuò)容判斷的邏輯,也就是我們上文所說的符合兩個(gè)擴(kuò)容條件之一時(shí)就會(huì)觸發(fā)擴(kuò)容:

static int _dictExpandIfNeeded(dict *d)
{
 //如果正處于漸進(jìn)式哈希則直接返回
    if (dictIsRehashing(d)) return DICT_OK;

   //......
   //如果當(dāng)前有子進(jìn)程進(jìn)行持久化操作則dict_can_resize為false,所以當(dāng)字典元素?cái)?shù)大于等于哈希表大小且未進(jìn)行持久化,或進(jìn)行持久化操作且元素?cái)?shù)是哈希表的5倍時(shí)才會(huì)進(jìn)行擴(kuò)容操作,dictExpand會(huì)將rehashidx設(shè)置為0,告知當(dāng)前哈希表進(jìn)行擴(kuò)容需要進(jìn)行漸進(jìn)式再哈希
    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;
}

此時(shí)我們?cè)倩乜粗暗逆I值對(duì)插入操作,它會(huì)根據(jù)dictIsRehashing判斷rehashidx是否為0,從而調(diào)用_dictRehashStep進(jìn)入漸進(jìn)式哈希操作在鍵值對(duì)維護(hù):

dictEntry *dictAddRaw(dict *d, void *key)
{
    int index;
    dictEntry *entry;
    dictht *ht;
 //如果處于再哈希階段,若符合要求則進(jìn)行一次ht[0]哈希表元素驅(qū)逐操作
    if (dictIsRehashing(d)) _dictRehashStep(d);

   //保存鍵值對(duì)操作
   //......
    return entry;
}

我們直接查看_dictRehashStep內(nèi)部的實(shí)現(xiàn)就可以看到一個(gè)dictRehash的方法,它就是漸進(jìn)式哈希的核心實(shí)現(xiàn),可以看到該方法會(huì)從0開始每次驅(qū)逐10個(gè)元素到ht[1]中:

int dictRehash(dict *d, int n) {
    //基于傳入的n得出訪問空bucket的最大次數(shù),默認(rèn)為1*10=10
    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);
        //基于empty_visits 循環(huán)找到第一個(gè)非空的bucket
        while(d->ht[0].table[d->rehashidx] == NULL) {
            d->rehashidx++;
            if (--empty_visits == 0) return 1;
        }
        //定位到需要驅(qū)逐元素的bucket
        de = d->ht[0].table[d->rehashidx];
        /* Move all the keys in this bucket from the old to the new hash HT */
        //計(jì)算當(dāng)前元素在ht[1]中的位置并驅(qū)逐過去
        while(de) {
            unsigned int h;

            nextde = de->next;
            /* Get the index in the new hash table */
            //計(jì)算當(dāng)前元素在新哈希表的索引位置
            h = dictHashKey(d, de->key) & d->ht[1].sizemask;
            //基于頭插法,將舊元素指向新哈希表的第一個(gè)元素,構(gòu)成鏈表
            de->next = d->ht[1].table[h];
            //節(jié)點(diǎn)空間指向舊元素
            d->ht[1].table[h] = de;
            //舊有哈希表元素?cái)?shù)減去1
            d->ht[0].used--;
            //新的哈希值元素空間加上1
            d->ht[1].used++;
            //進(jìn)行下一輪迭代
            de = nextde;
        }
        d->ht[0].table[d->rehashidx] = NULL;
        d->rehashidx++;
    }

    /* Check if we already rehashed the whole table... */
    //used 為0說明所有元素驅(qū)逐完成,將ht[1]指向的哈希表賦值給ht[0],重置rehashidx ,并返回0
    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;
}

查詢操作

有了上述的基礎(chǔ)后,我們查看查詢操作就比較簡(jiǎn)單了,其步驟比較固定:

  • 計(jì)算key的哈希值。
  • 計(jì)算對(duì)應(yīng)索引位置到ht[0]定位,如果找到了直接返回。
  • 如果沒找到,查看當(dāng)前是否處于擴(kuò)容階段,若是則到ht[1]進(jìn)行哈希定位,若找到直接返回。
  • 上述操作都未找到該元素,直接返回null。
dictEntry *dictFind(dict *d, const void *key)
{
    //......
    //計(jì)算哈希值
    h = dictHashKey(d, key);
    //通過哈希算法定位索引,到哈希表進(jìn)行查詢
    for (table = 0; table <= 1; table++) {
        idx = h & d->ht[table].sizemask;
        he = d->ht[table].table[idx];
        //遍歷當(dāng)前索引位置的元素,找到比對(duì)一致的返回
        while(he) {
            if (dictCompareKeys(d, key, he->key))
                return he;
            he = he->next;
        }
        //上一步?jīng)]找到則判斷是否處于擴(kuò)容,若處于擴(kuò)容則進(jìn)入下一個(gè)循環(huán)到ht[1]表找,反之直接返回null
        if (!dictIsRehashing(d)) return NULL;
    }
    return NULL;
}

刪除操作

同理我們最后給出刪除操作的源碼,也查詢操作一樣,定位到元素后,將其從索引位置中解除該元素和前驅(qū)節(jié)點(diǎn)關(guān)系即可:

static int dictGenericDelete(dict *d, const void *key, int nofree)
{
 //......
 
    //定位元素
    h = dictHashKey(d, key);
 
    for (table = 0; table <= 1; table++) {
        idx = h & d->ht[table].sizemask;
        he = d->ht[table].table[idx];
        prevHe = NULL;
        while(he) {
         //找到比對(duì)一致的鍵值對(duì)
            if (dictCompareKeys(d, key, he->key)) {
               //解除該元素和前驅(qū)節(jié)點(diǎn)的關(guān)系
                if (prevHe)
                    prevHe->next = he->next;
                else
                    d->ht[table].table[idx] = he->next;
                //釋放當(dāng)前節(jié)點(diǎn)
                if (!nofree) {
                    dictFreeKey(d, he);
                    dictFreeVal(d, he);
                }
                zfree(he);
                //元素?cái)?shù)減去1
                d->ht[table].used--;
                return DICT_OK;
            }
            prevHe = he;
            he = he->next;
        }
        if (!dictIsRehashing(d)) break;
    }
    return DICT_ERR; /* not found */
}

責(zé)任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關(guān)推薦

2025-05-22 08:15:00

2025-02-25 09:29:34

2023-05-26 08:24:17

短信渠道模型

2022-10-18 08:28:38

運(yùn)營(yíng)活動(dòng)實(shí)現(xiàn)邏輯整體協(xié)作

2025-02-19 10:27:48

哨兵Redis故障轉(zhuǎn)移

2023-03-06 07:48:01

數(shù)據(jù)字典Spring

2020-09-04 07:33:12

Redis HashMap 數(shù)據(jù)

2024-01-31 08:41:43

異步設(shè)計(jì)項(xiàng)目

2021-12-28 19:05:41

路由服務(wù)治理

2024-11-04 08:00:00

Netty客戶端

2023-02-10 08:59:42

業(yè)務(wù)技術(shù)核心

2024-12-13 08:28:45

設(shè)計(jì)模式依賴

2024-12-13 16:28:43

2025-01-06 08:10:00

Redis跳表索引

2022-08-16 08:17:09

CDPCRM數(shù)據(jù)

2020-07-19 10:26:47

Kubernetes數(shù)據(jù)結(jié)構(gòu)

2021-03-28 08:32:58

Java

2021-09-14 13:25:23

容器pod僵尸進(jìn)程

2024-05-15 09:11:51

委托事件C#

2024-11-04 06:00:00

redis雙向鏈表
點(diǎn)贊
收藏

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

自拍偷拍精品视频| 中文字幕av网址| 免费在线看电影| 成人中文字幕合集| 日本欧美黄网站| 色婷婷粉嫩av| 免费成人蒂法| 欧美三级一区二区| www.亚洲成人网| 男人久久精品| 国产乱色国产精品免费视频| 国外视频精品毛片| 色欲狠狠躁天天躁无码中文字幕| 国产精品久久久久久久久久辛辛 | 91小视频xxxx网站在线| av动漫一区二区| 国产精品永久免费观看| 久久久无码一区二区三区| 精品国产一区探花在线观看| 日韩视频一区二区三区在线播放 | 日韩欧美亚洲精品| 亚洲欧美激情国产综合久久久| 日韩成人一级片| 国外成人免费在线播放| 三级黄色录像视频| 深爱激情久久| 亚洲精品国产精品国自产在线| 久久黄色片网站| 欧美91看片特黄aaaa| 一区二区三区欧美久久| 亚洲欧美久久234| 日韩精品系列| 成人黄色国产精品网站大全在线免费观看 | 精品国产一区二区三区免费| 国产精品人人爽| 日日嗨av一区二区三区四区| 国内自拍欧美激情| 久久久久久久久久综合| 91tv官网精品成人亚洲| 中文字幕欧美精品在线| 亚洲午夜福利在线观看| 欧美日韩一本| 欧美精品一区二区三区高清aⅴ| 中文字幕 日韩 欧美| 亚洲成人激情社区| 欧美午夜无遮挡| 日韩少妇内射免费播放| 国内在线视频| 亚洲一区二区三区自拍| 四虎4hu永久免费入口| 免费大片在线观看www| 国产日韩欧美精品电影三级在线| 美国av一区二区三区| 污视频网站免费观看| 国产精一品亚洲二区在线视频| 成人福利网站在线观看11| 中文字幕永久在线观看| 麻豆91精品视频| 国产区精品视频| 国产欧美久久久| 国产一区二区三区久久久| 91视频国产精品| 国产成人a人亚洲精品无码| 国产一区二区看久久| 51精品国产人成在线观看| 国产三级漂亮女教师| 国产传媒一区在线| 国产精品国产精品国产专区蜜臀ah| 精品人妻av一区二区三区| 国产乱理伦片在线观看夜一区| 99电影网电视剧在线观看| 亚洲第一色网站| av电影在线观看一区| 蜜桃av色综合| 网友自拍视频在线| 亚洲欧美另类小说| 欧美乱大交xxxxx潮喷l头像| 色综合亚洲图丝熟| 在线免费不卡视频| 国产精品嫩草影院8vv8 | 精品伦精品一区二区三区视频| 天堂v在线观看| 国产午夜精品理论片a级大结局| 亚洲精品成人自拍| 尤物在线网址| 欧美色播在线播放| 在线能看的av网站| 成人18夜夜网深夜福利网| 精品视频偷偷看在线观看| 神马久久久久久久久久久 | 久久久久免费看黄a片app| 最近高清中文在线字幕在线观看1| 91福利在线导航| 国产黄色一区二区三区 | 国产成人精品三级麻豆| 好看的日韩精品视频在线| 国产一区二区影视| 尤物视频一区二区| 91视频免费版污| 91精品导航| 国产亚洲欧美aaaa| 久久国产在线视频| 美日韩一区二区三区| 国产麻豆一区二区三区在线观看| www免费网站在线观看| 亚洲最色的网站| 992kp快乐看片永久免费网址| 日本伊人久久| 中文字幕日韩精品有码视频| 国产精品30p| 激情国产一区二区| 欧美重口乱码一区二区| 欧美v亚洲v| 欧美视频你懂的| 国产传媒第一页| 91精品国产乱码久久久久久久 | 中文字幕欧美国内| 国产成人在线免费视频 | 亚洲综合一区二区不卡| 你懂的在线看| 精品久久久久人成 | 国产人妖乱国产精品人妖| 日韩成人三级视频| 国产精品麻豆| 中文字幕久热精品在线视频| 免费看毛片网站| 91在线你懂得| 欧美午夜性视频| 一区二区三区视频播放| 久久久国产成人精品| 久久久久久久久久一级| 久久综合色天天久久综合图片| 国产性生活免费视频| av在线成人| 日韩中文理论片| 午夜一级黄色片| 国产亚洲短视频| 日韩在线xxx| 妖精视频一区二区三区| 91精品国产91久久久久久不卡| 精品人妻伦一二三区久久| 亚洲婷婷综合色高清在线| 超碰影院在线观看| 国产乱码精品一区二区亚洲| 欧洲中文字幕国产精品| 亚洲欧美日韩精品永久在线| 亚洲18女电影在线观看| 特级特黄刘亦菲aaa级| 欧美日韩调教| 国产伦精品一区| 99久久精品免费看国产小宝寻花| 精品国产一区二区三区久久影院| 欧美成人片在线观看| 国产成人超碰人人澡人人澡| 无码人妻少妇伦在线电影| 日本一区影院| 91国自产精品中文字幕亚洲| 深夜福利视频在线免费观看| 色婷婷综合视频在线观看| 国产在线观看h| 蜜臀91精品一区二区三区| 亚洲欧洲精品在线| 国产精品视频首页| 欧美第一黄网免费网站| 丰满人妻一区二区| 欧美午夜影院在线视频| 夜夜春很很躁夜夜躁| 精品一区二区三区在线播放视频| 日本丰满少妇黄大片在线观看| 亚洲精品不卡在线观看| 69**夜色精品国产69乱| 国产毛片av在线| 欧美乱妇15p| 久久老司机精品视频| av亚洲精华国产精华精华| 欧美一级黄色片视频| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 国产成人一区二区三区免费看| 岛国在线视频网站| 一本色道久久综合亚洲精品小说 | 亚洲精品国产精品国自产观看| 日韩大陆av| 午夜免费日韩视频| yw193.com尤物在线| 91麻豆精品国产| 精品在线播放视频| 国产精品人妖ts系列视频| 国模大尺度视频| 久久九九99| 日韩人妻精品一区二区三区| 欧美wwwsss9999| 国产欧美韩国高清| 国产激情在线播放| 日韩在线观看网站| 天堂网2014av| 在线播放中文一区| 免费看一级视频| 《视频一区视频二区| 国产又粗又长又爽| 久久99久久久欧美国产| 黄色av网址在线播放| 91精品综合久久久久久久久久久| 黄色99视频| 综合欧美精品| 热久久这里只有精品| 伊人福利在线| 中文字幕亚洲激情| 婷婷色在线观看| 在线综合视频播放| 天天射天天干天天| 香蕉av福利精品导航| 搜索黄色一级片| 国产亚洲午夜高清国产拍精品| 污网站免费观看| 国产一区二区三区在线观看精品| 国产天堂在线播放| 亚洲综合欧美| 女人帮男人橹视频播放| 911精品美国片911久久久| 五月天亚洲综合小说网| 日本午夜精品| 成人三级在线| 日韩一区二区三区色 | 久草精品视频| 亚洲自拍偷拍第一页| 精品自拍视频| 国产精品九九久久久久久久| 精品国产免费人成网站| 国内免费精品永久在线视频| 视频在线观看入口黄最新永久免费国产 | 黑人玩弄人妻一区二区三区| 国产一区欧美二区| 17c国产在线| 男人的j进女人的j一区| 四虎永久在线精品无码视频| 99精品视频免费全部在线| 国产xxxx振车| 国产精品激情电影| 999久久欧美人妻一区二区| 欧美在线免费一级片| 中文字幕制服丝袜在线| 99久久精品网| 黄瓜视频免费观看在线观看www| 日韩一级毛片| 在线视频不卡一区二区| 国产精品x453.com| 综合网五月天| 亚洲综合五月| 国产欧美123| 在线 亚洲欧美在线综合一区| 欧美大黑帍在线播放| 欧美一区二区三区久久精品| 免费成人进口网站| 欧美激情自拍| av女优在线播放| 国产日韩一区二区三区在线| 北条麻妃69av| 日韩经典中文字幕一区| 天天干天天草天天| 国产原创一区二区| www.欧美com| 99精品欧美一区| 国产毛片久久久久久久| 日本一区二区高清| 亚洲一级二级片| 亚洲精品国产一区二区精华液| 久久精品性爱视频| 色综合久久久久综合| 在线观看色网站| 日韩一区二区免费视频| 蜜桃久久一区二区三区| 亚洲视频自拍偷拍| 欧美一区二区三区| 伦伦影院午夜日韩欧美限制| 激情图片在线观看高清国产| 18性欧美xxxⅹ性满足| 在线看欧美视频| 91亚洲精品丁香在线观看| 天堂网av成人| 伊甸园精品99久久久久久| 韩国在线视频一区| 欧美牲交a欧美牲交aⅴ免费下载| 人人爽香蕉精品| 一级片黄色免费| 91论坛在线播放| 天天操天天摸天天舔| 亚洲一区二区三区四区在线| 无码人妻精品一区二区| 3d成人动漫网站| 五月天婷婷激情网| xxav国产精品美女主播| 91吃瓜在线观看| 国产美女扒开尿口久久久| 国产福利一区二区精品秒拍| 久久国产一区| 午夜亚洲福利| 成人性视频欧美一区二区三区| 国产黄色成人av| 国产精品20p| 亚洲国产成人av好男人在线观看| 久久久久亚洲视频| 亚洲第一精品夜夜躁人人爽| www 日韩| 91sa在线看| 精品一区二区三区亚洲| 欧美最大成人综合网| 红桃视频欧美| 亚洲精品久久久久久宅男| 91亚洲精华国产精华精华液| 日韩福利小视频| 欧美在线短视频| 亚洲欧美日本在线观看| 欧美人成在线视频| 久久女人天堂| 欧美1o一11sex性hdhd| 激情久久一区| 日本r级电影在线观看| 中文字幕第一区综合| 久久国产黄色片| 日韩精品一区二区三区四区视频| www.在线播放| 国产91精品网站| 欧美人成在线观看ccc36| 黑人巨茎大战欧美白妇 | 日本一卡二卡在线| 亚洲欧美经典视频| 亚洲自拍第二页| 一区二区国产精品视频| videos性欧美另类高清| 国内精品久久国产| 影音先锋在线一区| 亚洲国产精品第一页| 一区二区三区成人| 国产欧美综合视频| 久久这里只有精品视频首页| 日韩欧美三区| 中文字幕日韩精品久久| 久久97超碰国产精品超碰| 日韩女同一区二区三区| 在线看国产日韩| 国产二区视频在线观看| 国产极品精品在线观看| 国内精品视频在线观看 | 久草视频在线观| 亚洲国产一区二区三区四区| 成人国产电影在线观看| 精品午夜一区二区三区| 亚洲在线电影| 久久精品无码一区| 欧美在线一区二区| 午夜在线小视频| 91久久国产精品91久久性色| 91精品一区二区三区综合在线爱| 久久久久久久久久久久久久久国产 | 精品久久久久久亚洲| 国产精品综合色区在线观看| 加勒比一区二区| 欧美在线看片a免费观看| 99reav在线| 91精品综合久久久久久五月天| 艳女tv在线观看国产一区| 久久久久亚洲av片无码v| 亚洲主播在线播放| 亚洲欧美色视频| 国产成人亚洲综合91| 久久国产影院| 中文字幕久久久久久久| 午夜日韩在线观看| 每日更新在线观看av| 国产日韩av在线播放| 亚洲精品91| 黄色录像a级片| 欧美主播一区二区三区| av香蕉成人| 久久久久久99| 久久精品国产秦先生| 九九热视频精品| 国产婷婷97碰碰久久人人蜜臀| 国产欧美在线观看免费| 喜爱夜蒲2在线| 91麻豆国产福利在线观看| 亚洲精品国产精品国自产网站按摩| 久久好看免费视频| 国产毛片精品| 欧美精品久久久久久久久25p| 一区二区三区不卡视频 | 欧美黑人巨大videos精品| 亚洲黄色a v| 一区二区三区精品在线| 日韩av资源站| 91色在线观看| 日韩一区精品视频| 久久久久久欧美精品se一二三四| 亚洲精品一区二区三区婷婷月| 日韩在线电影| 人妻内射一区二区在线视频 | 97精品国产97久久久久久粉红| 91免费版在线| 亚洲黄色在线观看视频| 国产精品久久久久久五月尺|