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

Redis 中的 Set,底層采用了什么數據結構?

數據庫 Redis
本文將深入分析 Redis Set 的原理、源碼實現,并通過示例展示其在實際應用中的使用方式。

在 Redis中,Set(集合)以其獨特的特性和高效的操作模式,在實際應用中得到了廣泛的使用。本文將深入分析 Redis Set 的原理、源碼實現,并通過示例展示其在實際應用中的使用方式。

一、什么是 Redis Set?

在 Redis 中,Set 是一種無序且不允許重復元素的數據結構,它支持豐富的集合操作,如交集、并集和差集等。這使得 Redis Set 非常適合用于社交網絡中的好友列表、標簽管理、實時推薦系統等場景。

Redis Set 的特點:

  • 無序性:Set 中的元素是無序的,這意味著無法通過索引訪問特定元素。
  • 唯一性:Set 中的每個元素都是唯一的,重復元素會被自動去重。
  • 高效的元素操作:Redis 提供了豐富且高效的命令用于對 Set 進行操作,如添加、刪除、獲取元素等。
  • 豐富的集合操作:支持集合的交集、并集、差集等高級操作。

二、底層實現原理

Redis 對 Set 的實現高度優化,以滿足不同場景下的性能需求,具體來說,Redis 使用了兩種內部數據結構來表示 Set:

  • 整數集合(Intset)
  • 哈希表(Hashtable)

1. Intset(整數集合)

當一個 Set 中的所有元素都是整數,并且數量較少時,Redis 會選擇使用 Intset 來存儲。這種表示方式節省內存,并且在元素較少的情況下提供了較快的訪問速度。

結構特點:

  • 連續存儲:Intset 使用連續的內存塊存儲整數,類似于一個整數數組。
  • 有序性:為了優化查找操作,Intset 會保持內部元素的有序性,使得二分查找成為可能。
  • 內存緊湊:由于只是存儲連續的整數,內存占用較低。

Intset 的優勢:

  • 節省內存:對于小規模的整數 Set,Intset 比哈希表節省大量內存。
  • 快速查找:有序的結構使得二分查找的時間復雜度為 O(log N)。

Intset 的限制:

  • 僅支持整數:如果 Set 中包含非整數元素,無法使用 Intset。
  • 動態擴展限制:當元素數量超過閾值,或者出現非整數元素時,需要轉換為哈希表。

2. Hashtable(哈希表)

當 Set 中包含非整數元素,或元素數量超過某個閾值時,Redis 會將 Set 的內部實現轉換為哈希表。這種表示方式雖然在內存占用上稍大,但是支持更豐富的操作和更大的元素規模。

結構特點:

  • 散列表存儲:使用開放定址哈希表來存儲元素,支持快速的插入、刪除和查找。
  • 支持多種元素類型:不僅支持整數,還支持字符串等其他數據類型。
  • 無序性:與 Intset 一樣,哈希表中的元素也是無序的。

Hashtable 的優勢:

  • 高效的操作:哈希表提供了接近 O(1) 的時間復雜度,適用于大規模數據操作。
  • 靈活性強:支持多種數據類型,適用于不同的應用場景。

Hashtable 的限制:

  • 內存占用較大:相比 Intset,哈希表的內存消耗更高。
  • 無序性:盡管支持高效的操作,但無法保證元素的順序。

3. 內部轉換機制

Redis 為了優化性能和內存利用,會根據 Set 的實際內容和規模動態地在 Intset 和 Hashtable 之間進行轉換。具體來說:

  • 從 Intset 到 Hashtable:當 Set 中的元素個數超過 set-max-intset-entries(默認 512),或者出現非整數元素時,會將內部表示從 Intset 轉換為 Hashtable。
  • 從 Hashtable 到 Intset:當使用于 Hashtable 的元素數量降至 set-min-intset-entries(默認 128)以下,并且所有元素都是整數時,會將內部表示從 Hashtable 轉換為 Intset。

這種動態轉換機制保證了 Redis 在不同階段都能以最佳的方式管理 Set,兼顧性能和內存利用。

三、源碼分析

為了深入理解 Redis Set 的實現原理,我們需要分析 Redis 的源代碼。以下分析基于 Redis 6.0 版本,但大部分實現邏輯在后續版本中保持穩定。

1. 數據結構定義

在 Redis 的源代碼中,Set 的實現主要涉及以下幾個關鍵數據結構:

  • robj:Redis 的通用對象結構,用于表示不同的數據類型,包括 Set。
  • intset:表示 Intset 的結構。
  • dict:Redis 的哈希表實現,表示 Hashtable。

以下是相關結構的簡化定義。

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; // 最近使用時間
    int refcount;
    void *ptr;
} robj;

typedefstruct intset {
    uint32_t encoding;
    uint32_t length;
    int32_t contents[];
} intset;

typedefstruct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
} dictEntry;

typedefstruct dicthdr {
    int size;
    dictEntry *table;
    dictEntry **buckets;
    // 其他成員...
} dict;

2. 創建和銷毀 Set對象

當調用 SADD、SREM 等命令時,Redis 首先會檢查目標鍵是否存在。如果不存在,會調用 createSetObject 來創建一個新的 Set 對象。

  • 創建 Set 對象的代碼片段:
robj *createSetObject(void) {
    intset *is = intsetNew();
    robj *o = createObject(OBJ_SET, is);
    o->encoding = OBJ_ENCODING_INTSET;
    return o;
}

intset *intsetNew(void) {
    intset *is = malloc(sizeof(intset));
    is->encoding = INTSET_ENC_INT32;
    is->length = 0;
    return is;
}
  • 銷毀 Set 對象的代碼片段:
void freeSetObject(robj *set) {
    if (set->encoding == OBJ_ENCODING_INTSET) {
        intsetDel(set->ptr);
    } else {
        dictRelease(set->ptr);
    }
    decrRefCount(set);
}

3. Set 操作命令的實現

以 SADD 命令為例,其實現涉及以下幾個步驟:

(1) 查找或創建 Set 對象:如果目標鍵不存在,創建一個新的 Set 對象。

(2) 判斷編碼類型:根據當前 Set 的編碼類型(Intset 或 Hashtable),調用相應的添加元素函數。

(3) 添加元素:

  • 如果是 Intset,嘗試將元素轉換為整數并添加;如果轉換失敗或超出容量,轉換為 Hashtable。
  • 如果是 Hashtable,直接進行添加。

(4) 返回結果:返回成功添加的元素數量。

SADD 命令的關鍵實現代碼:

int setTypeAdd(robj *subject, robj *value) {
    if (subject->encoding == OBJ_ENCODING_INTSET) {
        longlong ll;
        if (getLongLongFromObject(value, &ll)) {
            if (intsetFind(subject->ptr, ll)) return0;
            subject->ptr = intsetAdd(subject->ptr, ll, INTSET_NONE);
            return1;
        }
        // 轉換為 hashtable
        setTypeConvert(subject, OBJ_ENCODING_HT);
    }
    if (subject->encoding == OBJ_ENCODING_HT) {
        dict *dict = subject->ptr;
        return dictAdd(dict, value, NULL) == DICT_OK;
    }
    return0;
}

4. Set的集合操作

Redis 支持多種集合操作,如交集(SINTER)、并集(SUNION)和差集(SDIFF)。這些操作通常涉及多個 Set 對象的迭代和元素比較。

以 SINTER 為例,其實現步驟如下:

  • 獲取所有參與的 Set 對象。
  • 選擇最小的 Set 作為基準以優化性能。
  • 遍歷基準 Set 的元素,對每個元素在其他 Set 中進行查找。
  • 將存在于所有 Set 中的元素添加到結果 Set。
  • 返回結果。

SINTER 命令的關鍵實現代碼:

robj *sinterCommand(client *c) {
    robj **sets = c->argv + 1;
    int setnum = c->argc - 1;
    robj *s = setTypeIntersection(sets, setnum);
    addReplySet(c, s);
    decrRefCount(s);
    return C_OK;
}

robj *setTypeIntersection(robj **sets, int setnum) {
    // 選擇最小的 Set 作為基準
    robj *minset = selectMinSet(sets, setnum);
    robj *result = createSetObject();
    // 遍歷基準 Set 的元素
    if (minset->encoding == OBJ_ENCODING_INTSET) {
        intset *is = minset->ptr;
        for (int i = 0; i < is->length; i++) {
            longlong ll;
            intsetGet(is, i, &ll);
            robj *ele = createStringObjectFromLongLong(ll);
            int exists = 1;
            for (int j = 0; j < setnum; j++) {
                if (j == index of minset) continue;
                if (!setTypeIsMember(sets[j], ele)) {
                    exists = 0;
                    break;
                }
            }
            if (exists) setTypeAdd(result, ele);
            decrRefCount(ele);
        }
    } else {
        // 哈希表遍歷邏輯
    }
    return result;
}

5. 內部轉換邏輯

如前所述,當 Set 的大小或元素類型發生變化時,Redis 會在 Intset 和 Hashtable 之間轉換。這一過程涉及內存重新分配和數據拷貝。

從 Intset 到 Hashtable 的轉換:

void setTypeConvert(robj *set, int encoding) {
    if (set->encoding == encoding) return;
    if (encoding == OBJ_ENCODING_HT) {
        dict *dict = dictCreate(&setDictType, NULL);
        void *iter = setTypeInitIterator(set);
        robj *ele;
        while((ele = setTypeNext(set, iter)) != NULL) {
            dictAdd(dict, ele, NULL);
        }
        setTypeReleaseIterator(iter);
        set->encoding = OBJ_ENCODING_HT;
        set->ptr = dict;
    }
    // 其他轉換邏輯...
}

從 Hashtable 到 Intset 的轉換:

void setTypeConvertToIntset(robj *set) {
    if (!setTypeCanEncodeIntset(set)) return;
    intset *is = intsetNew();
    dict *dict = set->ptr;
    dictIterator *di = dictGetIterator(dict);
    dictEntry *de;
    while ((de = dictNext(di)) != NULL) {
        longlong ll;
        if (getLongLongFromObj(de->key, &ll)) {
            is = intsetAdd(is, ll, INTSET_NONE);
        } else {
            dictReleaseIterator(di);
            intsetDel(is);
            return;
        }
    }
    dictReleaseIterator(di);
    dictRelease(set->ptr);
    set->ptr = is;
    set->encoding = OBJ_ENCODING_INTSET;
}

6. 內存管理和優化

Redis 對 Set 的內存管理進行了深度優化,以確保在不同的使用場景下都能高效地利用內存。具體措施包括:

  • 共享對象:對于經常使用的小整數,Redis 通過對象共享機制(Shared Objects)減少內存占用。
  • 內存分配器優化:Redis 使用 jemalloc 作為默認的內存分配器,通過優化內存分配策略提升性能。
  • 惰性刪除:在哈希表中刪除元素時,Redis 采用惰性刪除策略,避免高頻次的重新哈希操作。

四、Redis Set 的使用示例

為了更好地理解 Redis Set的實用性,下面我們將通過幾個具體的示例展示它在實際應用中的使用方式。

1. 用戶興趣標簽管理

假設有一個應用需要管理用戶的興趣標簽,Set 是理想的選擇,因為它能有效地保證標簽的唯一性,并支持高效的添加、刪除和查詢操作。

示例場景:

  • 一個用戶可以擁有多個興趣標簽,如“音樂”、“編程”、“旅游”等。
  • 用戶可以添加或刪除興趣標簽。
  • 需要查詢用戶的所有興趣標簽。

Redis 命令示例:

# 添加興趣標簽
SADD user:1000:tags "音樂" "編程" "旅游"

# 刪除一個標簽
SREM user:1000:tags "旅游"

# 獲取所有標簽
SMEMBERS user:1000:tags

# 判斷用戶是否有某個標簽
SISMEMBER user:1000:tags "編程"

示例解釋:

  • SADD 命令用于添加一個或多個元素到 Set 中。重復的元素會被自動忽略。
  • SREM 命令用于從 Set 中刪除一個或多個元素。
  • SMEMBERS 命令返回 Set 中的所有成員。
  • SISMEMBER 命令用于檢查一個元素是否存在于 Set 中。

2. 共同好友推薦

在社交網絡中,推薦共同好友是一個常見功能。Set 的交集操作為實現這一功能提供了高效的手段。

示例場景:

  • 用戶 A 和用戶 B 的好友列表都是 Redis 的 Set。
  • 需要找出 A 和 B 的共同好友數量。

Redis 命令示例:

# 用戶 A 的好友列表
SADD user:A:friends "User1" "User2" "User3" "User4"

# 用戶 B 的好友列表
SADD user:B:friends "User3" "User4" "User5" "User6"

# 獲取共同好友
SINTER user:A:friends user:B:friends

示例解釋:SINTER 命令返回所有給定集合的交集成員。在本例中,即為用戶 A 和用戶 B 的共同好友。

3. 實時在線用戶統計

在實時應用中,經常需要統計當前在線的用戶列表。Set 的添加、刪除和計數功能使其成為理想的選擇。

示例場景:

  • 當用戶上線時,將用戶 ID 添加到在線用戶 Set 中。
  • 當用戶下線時,從 Set 中移除用戶 ID。
  • 統計當前在線用戶數量。

Redis 命令示例:

# 用戶上線
SADD online_users "User1"

# 用戶下線
SREM online_users "User1"

# 獲取在線用戶數量
SCARD online_users

# 獲取所有在線用戶
SMEMBERS online_users

示例解釋:SCARD 命令返回 Set 中的元素數量,用于統計在線用戶數量。

4. 關鍵詞去重

在數據處理過程中,常常需要對關鍵詞進行去重。Set 的唯一性保證了關鍵詞的唯一性,適合用于此類場景。

示例場景:從大規模文本中提取關鍵詞,并存儲到 Redis 的 Set 中,自動去除重復關鍵詞。

Redis 命令示例:

# 假設從文本中提取到以下關鍵詞
SADD keywords "redis" "數據庫" "緩存" "redis" "NoSQL"

# 獲取去重后的關鍵詞
SMEMBERS keywords

示例解釋:重復的"redis"關鍵詞在 Set 中只會存儲一次,確保關鍵詞的唯一性。

五、擴展與高級功能

Redis Set 作為基礎的數據結構,還支持一些擴展和高級功能,進一步增強了其應用的靈活性和 powerfulness。

1. 集合的交集、并集和差集

Redis 提供了 SINTER, SUNION, SDIFF 等命令,用于執行集合的交集、并集和差集操作。這些操作在群組管理、標簽分析等場景中非常有用。

示例:

# 交集
SINTER group:admins group:active

# 并集
SUNION group:admins group:employees

# 差集
SDIFF group:admins group:external

2. 隨機元素獲取

有時需要從 Set 中隨機獲取一個或多個元素,Redis 提供了 SRANDMEMBER 命令來滿足這一需求。

示例:

# 隨機獲取一個元素
SRANDMEMBER myset

# 隨機獲取兩個元素
SRANDMEMBER myset 2

3. 元素迭代

通過 SSCAN 命令,可以對 Set 進行迭代,適用于處理大規模 Set 的場景,有助于避免長時間阻塞 Redis 服務。

示例:

# 迭代 Set 中的元素
SSCAN myset 0 MATCH pattern* COUNT 100

4. 結合其他數據結構

Redis 允許將 Set 與其他數據結構組合使用,構建更加復雜和高效的數據模型。例如,使用 Hash 和 Set 結合,管理用戶的詳細信息和興趣標簽。

示例:

# 存儲用戶詳細信息
HSET user:1000:name "Alice" user:1000:age 30

# 存儲用戶興趣標簽
SADD user:1000:tags "音樂" "編程" "旅游"

# 查詢用戶信息和興趣標簽
HGETALL user:1000:name
SMEMBERS user:1000:tags

六、總結

本文,我們詳細分析了 Redis 的 Set數據結構,通過深入分析其底層實現原理,包括 Intset 和 Hashtable 的動態轉換機制,以及其相關的源碼,可以幫助我們更好地利用 Redis Set,實現高性能、高可靠的應用系統。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2025-01-14 08:00:00

RedisList數據結構

2019-10-29 08:59:16

Redis底層數據

2019-06-12 22:51:57

Redis軟件開發

2019-04-17 15:35:37

Redis數據庫數據結構

2020-03-20 10:47:51

Redis數據庫字符串

2023-04-27 08:40:55

Redis數據結構存儲

2022-05-23 08:19:19

Redis數據結構內存

2023-09-15 08:14:48

HashMap負載因子

2019-06-21 15:20:05

Redis數據結構數據庫

2023-03-06 08:40:43

RedisListJava

2023-11-12 21:49:10

Redis數據庫

2021-08-29 07:41:48

數據HashMap底層

2023-01-09 08:42:04

String數據類型

2023-04-28 08:53:09

2021-08-31 07:36:22

LinkedListAndroid數據結構

2024-01-26 06:42:05

Redis數據結構

2020-06-29 07:44:36

Redis

2019-09-27 08:53:47

Redis數據C語言

2024-08-19 11:23:36

2023-06-08 07:25:56

數據庫索引數據結構
點贊
收藏

51CTO技術棧公眾號

伊人精品久久久久7777| 欧美亚洲国产另类| 日本高清久久| 一本一道久久a久久精品蜜桃 | 美女视频黄频大全不卡视频在线播放| 一本大道亚洲视频| 美女流白浆视频| 在线手机中文字幕| 国产精品国产精品国产专区不片 | 国产精品自偷自拍| 在线观看视频免费一区二区三区| 亚洲色图五月天| 极品人妻一区二区| 一呦二呦三呦精品国产| 依依成人综合视频| 日韩欧美一区二区三区四区五区| 精品二区在线观看| 久久精品毛片| 欧美国产欧美亚洲国产日韩mv天天看完整| 人妻熟女aⅴ一区二区三区汇编| 精品女同一区二区三区在线观看| 亚洲福利视频一区二区| 中国成人亚色综合网站| 日本一卡二卡四卡精品| 国产一区高清在线| 国产精品扒开腿做爽爽爽男男 | 天天综合视频在线观看| www.欧美色图| 亚洲va久久久噜噜噜| 欧美特级黄色片| 一本久道综合久久精品| 欧美成人免费在线观看| 亚洲av毛片基地| 日韩极品少妇| 亚洲第一福利网站| 麻豆传媒在线看| 韩国精品视频在线观看| 一本久道中文字幕精品亚洲嫩 | 美女网站久久| 午夜精品www| 欧美三级小视频| 亚洲成人二区| www.亚洲一区| 日韩精品久久久久久久的张开腿让 | 精品久久久一区二区| 国产91porn| 国产视频一区二区| 亚洲人成小说网站色在线| 亚洲欧美日韩不卡一区二区三区| 国产精品一区在线看| 91免费视频大全| 久久99国产精品| 午夜黄色小视频| 99久久免费视频.com| 岛国视频一区免费观看| www.五月天激情| 国产成人自拍网| 91黄色国产视频| 亚洲av永久纯肉无码精品动漫| 国产精品影视在线| av资源站久久亚洲| 动漫av一区二区三区| 国产白丝精品91爽爽久久| 91手机在线视频| 免费国产精品视频| 91看片淫黄大片一级| 欧美一级片免费观看| 国产日产精品久久久久久婷婷| 国产婷婷精品av在线| 色爱区成人综合网| 三区四区在线视频| 亚洲精品国久久99热| 男女激情免费视频| 一区二区精品伦理... | 国产又粗又黄又爽的视频| 精品一区二区国语对白| 7777精品伊久久久大香线蕉语言 | 国产精欧美一区二区三区蓝颜男同| 午夜电影网一区| 99999精品视频| 国产精品久久久久久吹潮| 欧美精品 国产精品| 丰满少妇中文字幕| 精品成人自拍视频| 在线播放国产一区中文字幕剧情欧美 | 中文资源在线播放| 国产乱码精品一品二品| 99精彩视频在线观看免费| 午夜视频免费看| 中国色在线观看另类| 热久久最新网址| 美女100%一区| 日韩一级片在线播放| 中国一级特黄录像播放| 精品久久久亚洲| 欧美巨大黑人极品精男| 五月婷婷视频在线| 国内精品第一页| 久久久久久久久久久久久久一区| 国内在线免费高清视频| 伊人婷婷欧美激情| 不卡av免费在线| 91精品啪在线观看国产爱臀| 亚洲美女av在线| 超碰在线国产97| 视频在线观看一区二区三区| 成人情视频高清免费观看电影| 精品成人一区二区三区免费视频| 中文字幕亚洲欧美在线不卡| 久久亚洲中文字幕无码| 未满十八勿进黄网站一区不卡| 亚洲国产一区自拍| 亚洲 欧美 国产 另类| 日韩一级网站| 91视频88av| 国产色在线 com| 午夜电影网一区| 特黄特黄一级片| 欧美偷拍自拍| 欧美一区二粉嫩精品国产一线天| 国产同性人妖ts口直男| 久久精品视频在线免费观看| 九九热只有这里有精品| 色999韩欧美国产综合俺来也| 亚洲毛片在线观看.| 国产精品第九页| 国产米奇在线777精品观看| 日韩精品久久久毛片一区二区| ****av在线网毛片| 日韩精品一区二区三区在线播放| 波多野结衣欲乱| 免费人成在线不卡| 女女同性女同一区二区三区91| 青青草原国产在线| 91精品综合久久久久久| 亚洲a∨无码无在线观看| 久久精品三级| 欧美xxxx黑人又粗又长精品| 成人免费网站观看| 亚洲精品国精品久久99热一| 久久免费视频精品| 国产精一区二区三区| 亚洲视频在线观看日本a| 婷婷综合六月| 亚洲欧美日韩在线高清直播| 久久久久久久久久免费视频| 成人av免费观看| 欧美一级片免费播放| 风间由美中文字幕在线看视频国产欧美 | 欧美日韩中文字幕一区二区| 在线不卡av电影| 毛片一区二区| 亚洲黄色一区二区三区| 欧美综合影院| 美乳少妇欧美精品| www.精品久久| 五月婷婷激情综合| 一级特级黄色片| 性8sex亚洲区入口| 欧美日韩高清免费| www.成人在线视频| 日韩在线观看免费高清完整版| 91精品国产乱码久久久| 亚洲乱码一区二区三区在线观看| 国产精品久久久久久久99| 欧美在线影院| 国产精品久久久久久久久久直播| av老司机在线观看| 日韩国产欧美精品一区二区三区| 韩国av中文字幕| 欧美激情在线看| 一级黄色在线播放| 国产一区二区中文| 久久天堂国产精品| 成人在线不卡| 色在人av网站天堂精品| 日本一级在线观看| 欧美色倩网站大全免费| 欧美日韩精品在线观看视频| 99国产精品久久久久久久久久久| 成人在线免费播放视频| 欧美疯狂party性派对| www.久久艹| 六月婷婷综合| 久久天天躁狠狠躁夜夜av| 国产喷水吹潮视频www| 亚洲成a人片在线观看中文| 亚洲av无码国产精品麻豆天美| 久久99精品久久久久久久久久久久| 国产精品视频一二三四区| 西野翔中文久久精品字幕| 国产欧美久久一区二区| 69av成人| 最近2019免费中文字幕视频三| 国精品人妻无码一区二区三区喝尿| 欧美性生交xxxxxdddd| 91n在线视频| 99re亚洲国产精品| 手机在线国产视频| 美女被久久久| 精品国产一区二区三区无码| jlzzjlzz亚洲女人| 国产女主播一区二区三区| 精品久久毛片| 日本在线精品视频| 欧洲性视频在线播放| 中文字幕日韩欧美精品在线观看| 色呦呦视频在线| 91精品国产免费| 中文字幕高清在线免费播放| 一区二区理论电影在线观看| 日本猛少妇色xxxxx免费网站| 成人精品一区二区三区中文字幕| www.com黄色片| 亚洲永久免费| 日日摸日日碰夜夜爽无码| 亚洲精品成人| 亚洲一区二区在线免费观看| 免费看成人哺乳视频网站| 国产精品日韩欧美一区二区三区| 亚洲综合资源| 国产精品美女久久| 欧美片第一页| 2019中文在线观看| 9lporm自拍视频区在线| 欧美久久久精品| 91香蕉在线观看| 日韩在线视频免费观看| 国产精品久久久久一区二区国产| 亚洲精品美女视频| www国产一区| 日韩一级大片在线观看| 亚洲最新av网站| 欧美性色综合网| 黄色av网站免费| 色综合一区二区| 国产精品久免费的黄网站| 亚洲电影在线播放| 国产精品变态另类虐交| 亚洲午夜免费福利视频| 青娱乐国产精品| 一区二区视频在线| 久久久久亚洲av成人片| 亚洲综合999| 久久中文字幕在线观看| 一区二区在线电影| 日本特黄一级片| 亚洲成va人在线观看| 国产成人啪精品午夜在线观看| 亚洲国产一区二区视频| 国产第一页在线播放| 午夜一区二区三区视频| 成人免费看片98欧美| 亚洲一区欧美一区| 国产午夜在线播放| 一道本成人在线| 亚洲中文无码av在线| 欧美日本不卡视频| 国产日韩在线观看一区| 日韩精品一区二区三区蜜臀| 欧美一区二区在线观看视频| 日韩av一区二区在线观看| 嫩草精品影院| 中国人与牲禽动交精品| www在线观看播放免费视频日本| 九九热这里只有精品免费看| 密臀av在线| 青草青草久热精品视频在线观看| 欧美影视资讯| 成人免费高清完整版在线观看| 日本少妇精品亚洲第一区| 国产精品久久精品国产| 亚瑟一区二区三区四区| 亚洲精品欧美精品| 欧美日韩国产精品一区二区亚洲| 久操网在线观看| 久久三级视频| 欧美三级午夜理伦三级富婆| 国产精品亚洲专一区二区三区| 午夜视频在线观看国产| 欧美国产一区视频在线观看| 欧美色图一区二区| 欧美日韩亚洲高清| 91麻豆成人精品国产免费网站| 日韩欧美你懂的| 久久免费看视频| 美女少妇精品视频| 中文字幕高清在线播放| 91探花福利精品国产自产在线| 国产精品一区二区中文字幕| 日韩av一区二区三区在线观看| 欧美jizzhd精品欧美巨大免费| 免费无码国产v片在线观看| 久久er精品视频| 成年人网站免费看| 亚洲欧美一区二区不卡| 免费无码国产精品| 日韩欧美二区三区| 国产免费av在线| 欧美成人剧情片在线观看| 日韩免费va| 国产在线观看一区| 久久精品免费一区二区三区| 欧美国产亚洲一区| 国产一区二区91| 少妇愉情理伦三级| 精品久久久久久久中文字幕| 亚洲字幕av一区二区三区四区| 亚洲免费视频网站| 麻豆av在线免费观看| 国产乱肥老妇国产一区二 | 久久精品第一页| 欧美中文字幕一区二区三区亚洲| 六月婷婷综合网| 欧美成人精品一区| 国产精品久久乐| 欧美另类一区| 亚洲国产黄色| 韩国三级hd中文字幕有哪些| 国产精品久久久久久久久免费相片| 亚洲欧美在线观看视频| 日韩一区二区三区视频| 97超碰国产一区二区三区| 人人做人人澡人人爽欧美| 高潮按摩久久久久久av免费| 无码人妻aⅴ一区二区三区日本| 奇米影视一区二区三区小说| 国产精品jizz| 欧美日韩国产中文字幕| 欧美亚洲精品在线观看| 欧美乱大交xxxxx另类电影| 婷婷激情成人| 正在播放一区| 国产在线精品不卡| 午夜国产福利视频| 欧美日韩精品一区视频| 成年人视频免费在线观看| 国产成人在线精品| 综合国产视频| 少妇性饥渴无码a区免费| 91美女在线观看| 天天操天天摸天天干| 亚洲国产精品国自产拍av秋霞| 91jq激情在线观看| 91手机在线视频| 欧美视频不卡| yjizz视频| 欧美视频在线看| 日韩资源在线| 国产成人精品视| 欧美精品乱码| 日本77777| 一区二区三区四区乱视频| www日本高清| 欧美精品videosex极品1| 国产精品白浆| 日韩免费毛片视频| 国产欧美日韩精品一区| 最新国产中文字幕| 久久久精品视频在线观看| 免费精品一区| 福利视频一区二区三区四区| 91在线码无精品| 无码人妻精品一区二区50| 中文字幕av一区二区| vam成人资源在线观看| 国产尤物av一区二区三区| jiyouzz国产精品久久| 亚洲欧美自拍视频| 中文字幕欧美日韩精品| 成人在线视频www| av无码久久久久久不卡网站| 91美女片黄在线观看91美女| 亚洲 国产 日韩 欧美| 久久久999成人| 国内自拍欧美| 国产天堂在线播放| 亚洲同性同志一二三专区| 黑人精品一区二区| 国产精品 欧美在线| 女生裸体视频一区二区三区| 无码一区二区精品| 欧美无砖专区一中文字| 在线三级电影| 免费在线国产精品| 国产精品99久久久久久久vr | 中文字幕伦理免费在线视频 | 精品成人国产在线观看男人呻吟| 看电影就来5566av视频在线播放| 成人h片在线播放免费网站| 精品91在线| 99国产精品免费| 亚洲国产福利在线| 欧美韩国日本| 日韩欧美一区二| 日韩美女久久久| 美国成人毛片| 国产精品v欧美精品∨日韩| 欧美aⅴ一区二区三区视频| 国产精品美女毛片真酒店|