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

Redis Sorted Set 底層實現原理深度解讀與排行榜實戰

數據庫 Redis
Sorted Sets 與 Sets 類似,是一種集合類型,集合中不會出現重復的數據(member)。區別在于 Sorted Sets 元素由兩部分組成,分別是 member 和 score。

我是碼哥,可以叫我靚仔。今天給大家簡單聊聊 Redis Sorted Set 數據類型底層的實現原理和游戲排行榜實戰。特別簡單,一點也不深入,也就 7 張圖,粉絲可放心食用,哈哈哈哈哈~~~~。

1、是什么

Sorted Sets 與 Sets 類似,是一種集合類型,集合中不會出現重復的數據(member)。區別在于 Sorted Sets 元素由兩部分組成,分別是 member 和 score。

member 會關聯一個 double 類型的分數(score),sorted sets 默認會根據這個 score 對 member 進行從小到大的排序,如果 member 關聯的分數 score 相同,則按照字符串的字典順序排序。

這是規則,得記下來。

常見的使用場景:

  • 排行榜,比如維護大型在線游戲中根據分數排名的 Top 10 有序列表。
  • 速率限流器,根據排序集合構建滑動窗口速率限制器。
  • 延遲隊列,score 存儲過期時間,從小到大排序,最靠前的就是最先到期的數據。

2、修煉心法

Sorted Sets 底層有兩種方式來存儲數據。

  • 在 7.0 版本之前是 ziplist,之后被 listpack 代替,使用 listpack 存儲的條件是集合元素個數小于等于 zset-max-listpack-entries 配置值(默認 128),且 member 占用字節大小小于 zset-max-listpack-value 配置值(默認 64)時使用 listpack 存儲,member 和 score 緊湊排列作為 listpack 的一個元素進行存儲。
  • 不滿足上述條件,使用 skiplist + dict(散列表) 組合方式存儲,數據會插入 skiplist 的同時也會向 dict(散列表)中插入數據 ,是一種用空間換時間的思路。散列表的 key 存放的是元素的 member,value 存儲的是 member 關聯的 score。

MySQL:“也就是說 listpack 適用于元素個數不多且元素內容不大的場景。

對,使用 listpack 存儲的目的就是節省內存。

Sorted Sets 能支持高效的范圍查詢,正是因為采用了 skiplist 跳表,比如 ZRANGE 命令時時間復雜度為 O(log(n)) + m, n 是 member 個數,m 是返回結果數。需要注意的是,你應該避免命令會返回大量結果。

而使用 dict 的原因是實現 O(1) 時間復雜度查詢單個元素。比如 ZSCORE key member 指令。

總結來說,Sorted Sets 在插入或者更新的時候,會同時往 skiplist 和 散列表中插入或者更新對應的數據。保證 skiplist 和散列表的數據一致。

?

MySQL:“這個方式很巧妙呀,skiplist 用來根據 score 進行范范圍查詢或者單個查詢,dict 散列表則用于實現 O(1) 時間復雜度查根據數據查詢對應 score,滿足高效范圍查詢和單元素查詢。“

sorted sets 實現源碼主要在以下兩個文件中。

  • 結構定義在 server.h。
  • 功能實現在 t_zset.c。

先看 skiplist(跳表) + dict(散列表)數據結構如何存儲數據。

skiplist + dict

MySQL:“說說什么是跳表吧”

實質就是一種可以進行二分查找的有序鏈表。跳表在原有的有序鏈表上面增加了多級索引,通過索引來實現快速查找。

不僅能提高搜索性能,還可以提高插入和刪除操作的性能。它在性能上和紅黑樹、AVL 樹不相上下,但是跳表的原理和實現比紅黑樹簡單。

回顧鏈表,它的痛點就是查詢很慢,O(n) 時間復雜度,作為唯快不破的 Redis 是不能忍的。

如果在有序鏈表的每相鄰兩個節點增加一個“跳躍”指向下下個節點的指針,那么查找的時間復雜度就可以降低為原來的一半,如下圖所示。

這樣 level 0 和 level 1 分別形成兩個鏈表,level 1 層的鏈表節點個數只有 2 個(6、26)。

跳表節點查找

查找數據總是從最高層開始比較,如果節點保存的值比待查數據小,跳表就繼續訪問該層的下一個節點;

如果碰到比待查數據值大的節點時,那就跳到當前節點的下一層的鏈表繼續查找。

比如現在想查找 17,查找的路徑如下圖紅色指向的方向進行。

  • 從 level 1 開始,17 與 6 比較,值大于節點,繼續與下一個節點比較。
  • 與 26 比較,17 < 26,回到原節點,跳到當前節點的 level 0 層鏈表,與下一個節點比較,找到目標 17。

skiplist 正是受這種多層鏈表的想法啟發設計出來的。按照上面的生成鏈表方式,每次往上增加一層鏈表的節點個數是下面一層的一半,這樣的查找過程就類似于一個二分查找,時間復雜度為 O(log n)。

但是,這種方式在插入數據的時候有很大的問題,每次新增一個節點,就會打亂相鄰的兩層鏈表節點個數 2:1 的關系,如果要維持這個關系,就需要對鏈表調整,事件復雜度是 O(n)。

為了避免這個問題,它不要求上下相鄰的兩層鏈表節點個數有嚴格的比例關系,而是為每個節點隨機出一個層數,這樣插入節點只需要修改前后指針。

如下圖是一個有 4 層鏈表的 skiplist,假設我們要查找 26,下圖給出了查找經歷過的路徑。

對經典跳表有個直觀的映像后,來看看 Redis 中 skiplist 的實現細節,Sorted Sets 數據結構定義如下。

typedef struct zset {
    dict *dict;
    zskiplist *zsl;
} zset;

zset 結構體中有兩個變量,分別是散列表 dict 和跳表 zskiplist。dict 在前文已經講過, 重點看 zskiplist 。

typedef struct zskiplist {
    // 頭、尾指針便于雙向遍歷
    struct zskiplistNode *header, *tail;
    // 當前跳表包含元素個數
    unsigned long length;
    // 表內節點的最大層級數
    int level;
} zskiplist;
  • zskiplistNode *header, *tail,兩個頭、尾指針,用于實現雙向遍歷。
  • length,鏈表包含的節點總數。需要注意的是,新創建的 zskiplist 會生成一個空的頭指針,它不包含在 length 計數中。
  • level,表示 skiplist 中,所有節點層數的最大值。

接著繼續看 skiplist 中每個節點的定義 zskiplistNode 結構體。

typedef struct zskiplistNode {
    sds ele;
    double score;

    struct zskiplistNode *backward;

    struct zskiplistLevel {
        struct zskiplistNode *forward;
        unsigned long span;
    } level[];

} zskiplistNode;
  • Sorted Set 既要保存元素,又要保存元素的權重。所以對應了 sds 類型的 ele 存儲實際內容, double 類型 score 用于保存權重。
  • *backward,后退指針,指向該節點的上一個節點,便于從尾節點實現倒序查找。注意,每個節點只有一個后向指針,只有 level 0 層鏈表是一個雙向鏈表。
  • level[],是一個 zskiplistLevel 結構體類型的柔性數組。跳表是一個多層的有序鏈表,每一層的節點也是由指針鏈接起來的,所以數組中每個元素代表著 skiplist 的一層。
  • *forward,該層的前進指針。
  • span,跨度,用來記錄節點在該層的 *forward 指針到指針指向的下一個節點之間跨越了 level0 層的節點數。span 用于計算元素排名(rank),例如查找 ele = 肖菜雞、score = 17 的排名,只需要把查找路徑經過的節點的 span 相加即可,如下圖的紅色路徑的 span 累加,rank = (2 + 2) - 1 = 3(減 1 是因為 rank 從 0 開始)。如果要計算從大到小的排名,只需要用 skiplist 長度減去查找路徑上的 span 累加值,即 4 - (2 + 2) = 0。

下圖展示了 Redis 中一個 skiplsit 的可能結構。

listpack

MySQL:“根據 zset 結構體定義可知,分別使用了 dict、zskiplist 兩種數據結構,listpack 影子都見不著呀。“

這個問題問得好,使用 listpack 存儲的細節在源碼文件t_zset.c 中的zaddGenericCommand函數中體現,部分代碼如下,內部會判斷是否使用 listpack 來存儲。·

void zaddGenericCommand(client *c, int flags) {
    // 省略部分代碼

    // key 不存在則創建 sorted set
    zobj = lookupKeyWrite(c->db,key);
    if (checkType(c,zobj,OBJ_ZSET)) goto cleanup;
    if (zobj == NULL) {
        if (xx) goto reply_to_client;
      // 當 zset_max_listpack_entries == 0 或者
        // 元素字節大小大于 zset_max_listpack_value 配置
        // 則使用 skiplist + dict 存儲,否則使用 listpack。
        if (server.zset_max_listpack_entries == 0 ||
            server.zset_max_listpack_value < sdslen(c->argv[scoreidx+1]->ptr))
        {
            zobj = createZsetObject();
        } else {
            zobj = createZsetListpackObject();
        }
        dbAdd(c->db,key,zobj);
    }
   // 省略部分代碼
}

我們知道,listpack 是一塊由多個數據項組成的連續內存。而 sorted set 每一項元素是由 member 和 score 兩部分組成。

采用 listpack 存儲插入一個(member、score)數據對的時候,每個 member/score 數據對緊湊排列存儲。

listpack 最大的優勢就是節省內存,查找元素的話只能按順序查找,時間復雜度是 O(n)。正是如此,在少量數據的情況下,才能做到既能節省內存,又不會影響性能。每一步查找前進兩個數據項,也就是跨越一個 member/score 數據對。

3、出招實戰:排行榜

很多地方都會用到排行榜功能,比如微博熱榜、知乎熱榜、電影排行榜、游戲戰力排行等。

以游戲排行榜為例,我教你使用 Sorted Set 實現一個實時游戲高分排行榜。

玩家的得分越高,排行越靠前,如果分數相同則先達到該分數的玩家排在前面,游戲排行榜的提供的功能如下。

  • 按照分數從大到小排名,查詢前 N 位玩家信息。
  • 新注冊玩家,需要把新玩家信息添加到排行榜中。
  • 能查看某個玩家的排名和分數。

Sorted Set 每個元素有兩部分組成(member + score),可利用 score 進行排序,正好滿足我們的場景。用 score 保存玩家的游戲得分,member 保存玩家 ID。

王架構:“分數相同,先達到該分數的排在前面,也就是說,游戲分數相同的情況下,時間戳越小,排名越靠前,咋實現?”

這個問題問得好,既然時間也會影響排名,那就把時間戳考慮到 score 中。

王架構:“有問題,分數越大,排名越靠前;而時間戳越小,排名越靠前。兩個規則相反的,怎么結合在一起。”

好問題,這時候你可以指定一個非常大的時間作為基準時間,比如這個時間就是你當年信誓旦旦的對那個女孩說:“如果非要在我們的愛上加一個期限,我是希望……一萬年”,也就是 2023 + 10000 年。

執行時間排序值 =(基準時間 - 玩家達到分數時間)/ 基準時間公式計算,得到的結果值一定小于 0,正好可作為 score 小數部分。越早達到,這個值就越大,滿足排序。

最后score = 玩家游戲分 + ((基準時間 - 玩家獲得某分數時間) / 基準時間),就實現了分數相同,先達到該分數的排在前面的功能。

代碼邏輯如下所示。

private double calcScore(int playerScore, long playerScoreTime) {
  return playerScore + (BASE_TIME - playerScoreTime) * 1.0 / BASE_TIME;
}
  • playerScore,玩家游戲分。
  • playerScoreTime,玩家獲得分數的時間秒數。
  • BASE_TIME,基準時間的時間秒數。

想要獲取真正玩家游戲分數的時候,取整數位即可。接下來我來演示一下如何使用 zset 的指令實現排行榜。

假設 BASE_TIME 為 12023 年 1 月 1 日 0 時 0 分 0 秒時間戳秒數 = 317242022400。

更新排行榜

使用指令 ZADD key score member [score member...] 用于新增或者更新玩家排行榜。如下指令表示新增了 4 個玩家信息到排行榜。leaderboard:339 作為 key,表示區服 339 戰力排行榜,玩家 2 和玩家 3 的戰力都是 500 分,玩家 3 比玩家 2 先到達 500 戰力。

redis> ZADD leaderboard:339 2500.994707057989 player:1
(integer) 1
redis> ZADD leaderboard:339 500.99470705798905 player:2
(integer) 1
redis> ZADD leaderboard:339 500.9947097814618 player:3
(integer) 1
redis> ZADD leaderboard:339 987770.994707058 player:4
(integer) 1

假設某天玩家 4 的女朋友不在家,他就天天玩游戲,戰力提升到 1987770。執行如下指令,player:4 的 score 機會更新為 1987770.994707055。

ZADD leaderboard:339 1987770.994707055 player:4

獲取 Top 3 玩家排行信息

ZRANGE 命令可以按照排名、score、字典排序進行范圍查詢。語法使用規則。

ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]

默認排序是按照 score 由低到高,分數相同則根據 member 字典排序。

  • REV,可選參數,按照 score 由高到低逆序排序。
  • LIMIT offset count 可選參數,類似于 MySQL 的使用,需要注意的是, count 為負數則返回所有符合數據。
  • WITHSCORES 可選參數,返回 score 和 member,返回的格式是 member 1,score 1,…memberN,scoreN。

你可以使用 REV 來實現逆序,WITHSCORES返回 member 和 score。如下指令的一是是從 key 為 leaderboard:339 的 Sorted Set 中按照 score 逆序排序獲取 3 個元素。

> ZRANGE leaderboard:339 0 2 REV WITHSCORES
player:4
1987770.9947070549
player:1
2500.9947070579892
player:3
500.99470978146178

獲取指定玩家排名

我提供了 ZREVRANK指令,用于返回指定 member 的排名,需要注意的是,排名從 0 開始。如下指令查找 player:4 的排名,0 表示第一。

> ZREVRANK leaderboard:339 player:4
0
責任編輯:姜華 來源: 碼哥字節
相關推薦

2025-03-10 12:10:00

RedisJava排行榜

2024-05-15 17:21:18

RedisSpring數據

2024-03-26 00:00:06

RedisZSet排行榜

2025-01-02 13:07:24

2013-08-23 09:41:19

2023-08-31 07:53:56

Redis內存數據庫

2014-07-30 12:56:56

2025-05-07 08:21:01

2022-06-17 12:10:07

RPA機器人流程自動化

2012-05-28 09:34:36

編程語言WEB編程

2017-09-08 10:58:49

JavaCC++

2020-03-07 22:01:58

編程語言JavaPython

2019-10-21 10:59:52

編程語言JavaC

2023-12-13 14:31:42

編程語言C#Java

2009-08-17 09:08:14

開源語言排行榜PHP

2022-08-09 08:29:50

TIOBE編程語言排行榜程序員

2022-06-08 13:50:41

AI專業排行

2019-08-02 09:26:24

深度學習框架排行榜

2025-10-31 07:37:48

2018-02-08 09:19:34

linux
點贊
收藏

51CTO技術棧公眾號

www在线免费观看视频| 成人无码www在线看免费| 九九九伊在人线综合| 巨乳诱惑日韩免费av| 亚洲精品视频免费在线观看| www.射射射| 天堂8在线视频| 亚洲一卡久久| 中文字幕综合一区| 深爱五月综合网| 国产美女一区视频| 久久久久久久久蜜桃| 国产精品高潮呻吟久久av无限| 亚洲国产天堂av| 日韩黄色在线| 亚洲国产人成综合网站| 久久国产精品精品国产色婷婷 | 成人av网址在线观看| 69久久夜色精品国产7777| 久久久久亚洲av无码专区桃色| 性欧美gay| 亚洲精品久久7777| 美女黄毛**国产精品啪啪| 在线中文字幕网站| 亚洲特级毛片| 亚洲人成网站999久久久综合| 奇米视频7777| 超碰激情在线| 国产视频一区二区在线观看| 午夜视频精品| 91精品国产综合久久精品性色| 亚洲一区影院| 少妇一区二区三区四区| 亚洲激情女人| 日韩国产一区三区| 91精品视频国产| 一根才成人网| 亚洲欧洲综合另类| 青青草原成人| 人妻视频一区二区三区| 日韩高清一级片| 欧美激情久久久| 亚洲aaa视频| 伊人久久大香线蕉av不卡| 欧美日本国产视频| 国产三区在线视频| www视频在线观看免费| 国内精品伊人久久久久av一坑| 97成人在线视频| 在线观看亚洲网站| 自拍视频一区| 亚洲国产欧美一区二区三区久久| 一本一道久久a久久综合蜜桃| 一区二区乱码| 亚洲电影一级黄| 女女同性女同一区二区三区按摩| 二区在线视频| 久久这里只有精品首页| 91九色在线观看| 在线免费观看一区二区| 日韩中文欧美在线| 91av中文字幕| 青青草原免费观看| 五月精品视频| 日韩亚洲一区二区| 国产精品久久久久久成人| 伊人久久大香线蕉综合网蜜芽| 精品久久一二三区| 免费黄视频在线观看| 69堂免费精品视频在线播放| 欧美日韩在线视频一区二区| 男人日女人视频网站| 少妇丰满尤物大尺度写真| 国产乱码久久久| 免费视频一区二区| 国产成人综合精品在线| www.久久久久久久| 久久av一区| 日本不卡高字幕在线2019| 日本一级黄色大片| 久久久一二三| 国产精品久久久久久久久久新婚| 中国老头性行为xxxx| 蜜臀av性久久久久av蜜臀妖精| 国产中文字幕91| 精品人妻少妇AV无码专区| 高清免费成人av| 久久精品丝袜高跟鞋| 国产福利小视频在线| 中文字幕在线视频一区| 99国产精品白浆在线观看免费| 久久青草伊人| 精品视频1区2区| 91精产国品一二三| 免费观看久久av| 色噜噜狠狠狠综合曰曰曰 | 亚洲欧美在线另类| 妞干网视频在线观看| 自拍网站在线观看| 在线成人小视频| 7788色淫网站小说| 日韩国产一区二区三区| 欧美高跟鞋交xxxxxhd| 韩国av中文字幕| 精品在线播放午夜| 久久草视频在线看| 久草中文在线| 欧美性色19p| theporn国产精品| 亚洲警察之高压线| 久久天堂电影网| 日产精品久久久| 国产毛片精品视频| 日本一区二区高清视频| 黄网av在线| 欧美日本国产一区| 国产呦小j女精品视频| 91成人免费| 国产www精品| 亚洲熟妇无码av| 国产ts人妖调教重口男| 国产精品资源网站| 午夜精品一区二区三区四区 | 亚洲精品高清无码视频| 天堂av一区| 中文字幕亚洲字幕| 国产精品久久久久久久妇| 国内精品免费**视频| 麻豆传媒一区| 丰满的护士2在线观看高清| 欧美日精品一区视频| 中文字幕一区二区三区人妻| 综合久久综合| 91精品国产综合久久男男| 日韩一区av| 香蕉影视欧美成人| 少妇欧美激情一区二区三区| 成人羞羞网站入口| 欧美有码在线观看| 天天色综合久久| 亚洲国产精品影院| 精品国产免费久久久久久婷婷| 欧美成人milf| 国产日韩欧美自拍| av在线电影免费观看| 色呦呦网站一区| 五月开心播播网| 亚洲精品在线二区| 国产精品日韩高清| 乱插在线www| 日韩精品一区二区三区蜜臀| 国产美女久久久久久| 九九在线精品视频| 国产精品亚洲天堂| 国产精品久久久久久av公交车| 在线观看欧美日韩| 中文字幕有码视频| 最新成人av在线| 五月天婷婷影视| 亚洲综合中文| 超碰97在线人人| 黑人精品视频| 日韩电视剧免费观看网站| 少妇一级淫片免费放中国| 99re66热这里只有精品3直播| 日韩av片在线看| 要久久电视剧全集免费| 国产a∨精品一区二区三区不卡| 欧美巨乳在线| 欧美三电影在线| 欧美在线视频第一页| 超碰在线国产| 日本一区二区视频在线| a在线观看免费视频| 91日韩在线| 91香蕉视频在线下载| www欧美xxxx| 亚洲老板91色精品久久| 波多野结衣二区三区| 国产精品久久国产精麻豆99网站| 伊人国产精品视频| 999在线观看精品免费不卡网站| 玛丽玛丽电影原版免费观看1977 | 91人人澡人人爽| 一区二区日本视频| 五月天久久狠狠| 欧美国产中文高清| 91福利视频在线观看| 高h视频在线| 日韩午夜激情视频| 国产又黄又粗又爽| 亚洲三级久久久| 国产精品麻豆入口| 日本成人在线一区| 国产又粗又长又爽视频| 西野翔中文久久精品字幕| 国产精品久久久久久久久久免费| 国产日产一区二区| 日韩国产中文字幕| 国产成人免费看一级大黄| 午夜成人免费电影| 成人做爰视频网站| 91视频观看视频| 91香蕉视频免费看| 日韩在线观看一区二区| 永久免费看av| 精品国产一区二区三区小蝌蚪| 亚洲在线第一页| 激情开心成人网| 久久久久久久久久久久av| 成人在线二区| 日韩av综合网站| 国产99久久九九精品无码免费| 狠狠躁夜夜躁人人爽天天天天97| 波多野结衣喷潮| 久久精品在线免费观看| 欧美一区二区三区影院| 老司机精品视频导航| 日本在线xxx| 欧美三级特黄| 伊人狠狠色丁香综合尤物| 免费看成人哺乳视频网站| 国产高清在线一区| 久久久久久久性潮| 日本欧美精品在线| 青青青免费在线视频| 欧美精品日韩三级| 欧美精品电影| 一个人www欧美| 六十路在线观看| 亚洲国产福利在线| 丰满人妻一区二区三区四区53| 欧美精品 国产精品| 中文字幕自拍偷拍| 日本精品视频一区二区| 色一情一乱一伦| 福利微拍一区二区| 午夜精品三级久久久有码| 亚洲国产精品一区二区久久| 九九在线观看视频| 亚洲精品国产精华液| 男人的午夜天堂| 中文字幕一区二区在线播放| 四虎成人免费影院| 国产免费成人在线视频| 久久精品无码一区| 久久精品亚洲一区二区三区浴池 | 久久久在线观看| 男插女视频久久久| 久久久久亚洲精品| 91高清视频在线观看| 国内精品中文字幕| 美女视频在线免费| 2019精品视频| 暖暖成人免费视频| 日韩免费观看网站| 日韩欧美2区| 国产精品嫩草影院久久久| 久久xxx视频| 成人福利免费观看| 精品一区二区三区亚洲| 超碰97在线资源| 乱中年女人伦av一区二区| 精品在线视频一区二区| 亚洲人和日本人hd| 亚洲国产高清国产精品| 天天色天天射综合网| www.-级毛片线天内射视视| 一区二区三区毛片免费| 国产精品一色哟哟| 国产精品亚洲综合色区韩国| av免费在线播放网站| 免费人成在线不卡| 成人免费播放视频| 99热国产精品| 老熟妇一区二区| 亚洲日本成人在线观看| 久久久久久久福利| 色综合天天综合狠狠| 亚洲免费视频二区| 欧美一区二区日韩| 午夜在线视频免费| 色老头一区二区三区| 欧美巨大xxxx做受沙滩| 欧美在线亚洲在线| 日韩午夜电影免费看| 国产经典一区二区三区| 国产一区日韩| 欧美一级特黄aaaaaa在线看片| 一本久久知道综合久久| 成年人三级黄色片| 不卡av在线网| 免费看一级黄色| 亚洲一区二区成人在线观看| 日本黄色一级视频| 欧美一区二区网站| 黄色软件在线| 欧美裸身视频免费观看| 欧美日韩不卡| 97视频中文字幕| 欧美亚洲激情| 免费看国产曰批40分钟| 久久99深爱久久99精品| 青青草成人免费视频| 日韩美女啊v在线免费观看| 美日韩一二三区| 日韩一级二级三级精品视频| 国产精品一二三区视频| 欧美激情国产精品| 黄页免费欧美| 欧美二区在线| 国产一区日韩欧美| 天天操狠狠操夜夜操| 久久一区二区视频| 久久综合综合久久| 51精品秘密在线观看| 国产午夜在线视频| 国产91精品黑色丝袜高跟鞋| 欧州一区二区三区| 亚洲视频精品一区| 视频在线观看一区| 亚洲一区二区乱码| 亚洲自拍欧美精品| 国产免费视频一区二区三区| 国产亚洲精品久久久| 密臀av在线播放| 国产日产精品一区二区三区四区| 外国成人免费视频| 国产永久免费网站| 亚洲国产精品成人综合 | 欧美日韩夫妻久久| yiren22综合网成人| 欧美做受高潮电影o| 麻豆成人入口| aa在线观看视频| 波波电影院一区二区三区| 久久久久久久久97| 日韩一区国产二区欧美三区| 乱人伦中文视频在线| 国产女人精品视频| 久久综合国产| 国产精品久久a| 中文无字幕一区二区三区| 久久亚洲精品石原莉奈| 亚洲人av在线影院| 不卡av播放| 欧美日韩高清在线一区| 免费在线观看成人av| 黄色a一级视频| 欧美性xxxx极品hd满灌| 青青草在线免费视频| 国产精品99一区| 操欧美老女人| 99国产精品久久久久久| 亚洲日本va在线观看| 亚洲第一免费视频| 国自在线精品视频| 伊人久久大香线蕉无限次| 不卡av免费在线| 国产精品久久精品日日| 国产精品一级二级| 欧美寡妇偷汉性猛交| 老汉色老汉首页av亚洲| 国产日韩一区二区在线观看| 国产欧美精品一区二区色综合 | 色哟哟一一国产精品| 欧美一级高清大全免费观看| 欧洲在线视频| 久久精品日产第一区二区三区 | 国产精品久久久久影院日本| 久久精品国产www456c0m| 日本r级电影在线观看| 亚洲国产毛片aaaaa无费看| 飘雪影院手机免费高清版在线观看| 日本一区二区在线播放| 日韩久久电影| 亚洲成人激情小说| 精品日本美女福利在线观看| 国产1区2区3区在线| 亚洲最大福利网站| 销魂美女一区二区三区视频在线| 公肉吊粗大爽色翁浪妇视频| 欧美美女网站色| av电影免费在线看| 日本一区二区三区在线视频| 精品一区二区三区日韩| 久久精品国产亚洲av高清色欲 | 国产成人精品无码免费看夜聊软件| 欧洲色大大久久| 特级毛片在线| 欧美亚洲免费在线| 国产一区二区伦理| 亚洲天堂一区在线观看| 久久激情视频久久| 天天躁日日躁狠狠躁欧美巨大小说| 欧美伦理片在线观看| 亚洲第一成人在线| 在线观看麻豆| 精品无码久久久久国产| 精品无码三级在线观看视频|