精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人午夜电影小说| 99精品美女| 日本道免费精品一区二区三区| 久久久精品动漫| 中文字幕 欧美激情| 亚洲第一偷拍| 日韩精品在线免费| 中文字幕亚洲影院| 亚洲黄色免费av| 亚洲欧洲日产国码二区| 精品无人区一区二区三区| 中文天堂在线播放| 亚洲国产精品第一区二区| 在线视频日本亚洲性| 69xxx免费视频| av成人亚洲| 午夜欧美在线一二页| 亚洲免费精品视频| 五月婷婷深深爱| 国产在线精品一区二区夜色| 日本免费一区二区三区视频观看| 午夜写真片福利电影网| 欧美一级精品| 亚洲国产精品va在线观看黑人| 五月婷婷六月丁香激情| 欧美男男激情videos| 亚洲美女视频一区| 亚洲欧美国产不卡| 九色网友自拍视频手机在线| 国产成人精品一区二| 国产精品日韩专区| 好吊妞视频一区二区三区| 综合日韩在线| 中国人与牲禽动交精品| 一本色道久久综合亚洲精品图片| 高潮按摩久久久久久av免费| 91精品国产91久久久久久一区二区 | 波多野结衣欧美| 欧美日韩国产免费一区二区 | 亚洲成人激情社区| 婷婷久久综合九色国产成人 | 免费国产自线拍一欧美视频| 欧美国产日本在线| 日韩影院一区二区| 亚洲激情中文| 久久成人免费视频| 国产精品嫩草影院俄罗斯| 欧美系列电影免费观看| 国产亚洲综合久久| 51妺嘿嘿午夜福利| 精品久久一区| 一区二区三区精品99久久| wwwwxxxx国产| 欧美精品momsxxx| 精品亚洲aⅴ在线观看| 粉嫩av懂色av蜜臀av分享| 国产成人夜色高潮福利影视| 精品国产乱码久久久久久夜甘婷婷| 亚洲精品一二三四| 视频在线观看免费影院欧美meiju 视频一区中文字幕精品 | eeuss影院一区二区三区| 鬼打鬼之黄金道士1992林正英| 国产浮力第一页| 高清不卡一区二区在线| 国产欧美欧洲| 免费黄色片在线观看| 久久精品欧美日韩精品 | 午夜日本精品| 欧美精品18videosex性欧美| 国产做受高潮漫动| 六月天综合网| 国产精品91久久| 一本色道久久综合无码人妻| 国产一区三区三区| 国产精品国产三级欧美二区| 污污视频在线观看网站| 国产亚洲自拍一区| av电影一区二区三区| 欧美韩日亚洲| 欧美性猛交xxxx黑人| 欧美精品第三页| 亚洲欧美专区| 亚洲成人黄色网| 丁香激情五月少妇| 欧美一区国产在线| 欧美亚洲成人精品| 在线观看日韩一区二区| 国产精品中文欧美| 精品一区久久久久久| h网站在线免费观看| 亚洲蜜臀av乱码久久精品蜜桃| 欧美国产日韩激情| 电影亚洲精品噜噜在线观看| 欧美一二三四区在线| a级一a一级在线观看| 日本一区二区三区视频| 久久久免费观看视频| 欧美一区二区三区久久久| 国产一区视频网站| 免费国产一区| av在线免费网站| 色激情天天射综合网| 午夜影院免费版| 深爱激情综合网| 欧美成年人视频网站| 综合网在线观看| 国产麻豆成人精品| 青青影院一区二区三区四区| 青草影视电视剧免费播放在线观看| 一本一道波多野结衣一区二区| 视频区 图片区 小说区| 精品在线手机视频| 久久免费视频在线| 艳妇乳肉豪妇荡乳av| 久久一区二区三区四区| 欧美国产视频一区| 天堂综合在线播放| 亚洲天堂av在线免费| 动漫精品一区一码二码三码四码| 麻豆免费看一区二区三区| 久久99精品久久久久久青青日本| 中文av资源在线| 欧美日韩一级二级| 一区二区三区四区免费| 亚洲三级国产| av观看久久| 日本www在线观看视频| 色天天综合久久久久综合片| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 精品免费视频123区| 伊人电影在线观看| 欧美欧美欧美欧美首页| 91网站免费视频| 亚洲女同同性videoxma| 国产福利久久精品| 婷婷在线播放| 日韩一二三区视频| 26uuu成人网| 韩国av一区二区三区在线观看| 日本精品视频一区| 欧洲av不卡| 亚洲天堂久久av| 国产免费一级视频| 久久九九影视网| 欧美成人精品欧美一级乱| 天堂俺去俺来也www久久婷婷 | 欧美日韩在线免费观看视频| 成人国产激情| 在线国产精品视频| 中文字幕精品一区二区精| 国产肉丝袜一区二区| 成人性生生活性生交12| 精品国产乱码久久久久久1区2匹| 国产成人精彩在线视频九色| 青青国产在线| 色哟哟一区二区| 少妇无套高潮一二三区| 免费在线成人网| 亚洲一区综合| 秋霞一区二区| 久久久久久久久久久国产| 蜜臀久久99精品久久久| 亚洲大尺度视频在线观看| 麻豆国产精品一区| 日韩激情在线观看| 亚洲一区高清| 欧美日韩黄网站| 性欧美xxxx交| 四虎在线免费看| 91电影在线观看| 国产在线免费看| 国产69精品久久久久毛片 | 国语对白在线播放| 岛国av在线一区| 日批视频在线免费看| 国语产色综合| 91免费高清视频| 黄在线观看免费网站ktv| 亚洲精品在线看| 亚洲一线在线观看| 亚洲国产视频网站| 亚洲码无人客一区二区三区| 蜜臀av国产精品久久久久| 久久人妻无码一区二区| 日日狠狠久久偷偷综合色| 国产精品久久久久久网站| wwwav在线| 亚洲精选在线观看| 97精品久久人人爽人人爽| 亚洲线精品一区二区三区 | 中文字幕综合网| 欧美xxxxx精品| 蜜桃视频一区二区三区 | 免费精品视频最新在线| 国产一级不卡视频| 久久99蜜桃| 99久久伊人精品影院| 欧洲亚洲两性| 欧美大片在线免费观看| 国产精品99999| 日韩精品一区二区三区swag| 日韩精品一区不卡| 伊人色综合久久天天| www.黄色在线| 成人黄色av网站在线| 亚洲va综合va国产va中文| 亚洲国内精品| 手机在线视频你懂的| 九色精品国产蝌蚪| 国产精品播放| 亚洲爽爆av| 国产极品精品在线观看| 欧美wwww| 久久久精品国产一区二区| 免费动漫网站在线观看| 亚洲第一天堂av| 国产又大又粗又长| 91成人在线精品| 日韩伦理在线视频| 一区二区三区欧美亚洲| 一级免费黄色录像| 91麻豆视频网站| 人妖粗暴刺激videos呻吟| 国产在线看一区| 欧美男女交配视频| 欧美资源在线| 又粗又黑又大的吊av| 亚洲午夜91| 国产精品国产三级国产专区51| 四季av一区二区凹凸精品| 日本在线观看不卡| 国产精品一区二区av交换| 久久久久久久免费| 色吊丝一区二区| 国产一级精品aaaaa看| eeuss鲁片一区二区三区| 91精品国产91久久久久青草| 国产精品久久久久久久久久辛辛 | 亚洲成熟女性毛茸茸| 777a∨成人精品桃花网| 一级α片免费看刺激高潮视频| 欧美在线播放高清精品| 91丨九色丨海角社区| 色婷婷精品久久二区二区蜜臂av | 黑鬼狂亚洲人videos| ●精品国产综合乱码久久久久| 国产在线免费av| 国产精品久久久久影视| 黄色一级片一级片| 一区精品在线播放| 在线看的片片片免费| 亚洲精品乱码久久久久久黑人| 亚洲熟女www一区二区三区| 亚洲精品成人在线| 国产无遮挡又黄又爽在线观看| 亚洲国产精品自拍| 麻豆久久久久久久久久| 欧美性猛交xxxx富婆| 在线视频精品免费| 欧美男女性生活在线直播观看| 99精品国产99久久久久久97| 日韩视频在线观看一区二区| 欧美 日韩 国产 在线| 日韩国产欧美区| 国产小视频免费在线观看| 中文字幕日韩免费视频| 免费看美女视频在线网站| 欧美大成色www永久网站婷| 久久久久黄久久免费漫画| 97超碰国产精品女人人人爽| 欧美大胆性生话| 成人写真视频福利网| 136国产福利精品导航网址应用| 精品日韩电影| 波多野结衣一区| 国产激情在线看| 国产精品一区毛片| 国模私拍视频在线观看| 丁香婷婷综合激情五月色| 18禁裸乳无遮挡啪啪无码免费| 国产精品网友自拍| 欧美精品一区二区蜜桃| 日韩欧美在线国产| 国产一区二区三区在线观看| 精品国产在天天线2019| 蜜芽tv福利在线视频| 日韩中文字幕视频在线观看| 91吃瓜在线观看| 国产区亚洲区欧美区| 97久久超碰| 深夜福利成人| 亚洲大胆在线| 在线观看岛国av| 91在线看国产| 中文字幕电影av| 一本大道久久a久久精二百| 国产成人精品一区二区无码呦| 精品夜色国产国偷在线| 成人影欧美片| 国产极品精品在线观看| 韩国女主播一区二区三区| 一区二区三区四区五区视频| 99成人在线| 激情成人在线观看| 国产亚洲自拍一区| 久久高清免费视频| 91精品黄色片免费大全| 九色视频在线播放| 亚洲91av视频| 欧美电影在线观看一区| 亚洲精品在线观看免费| 亚洲一区免费| 中文字幕人妻一区| 日韩毛片视频在线看| www.av88| 亚洲欧美制服另类日韩| 久久一卡二卡| 成人av免费看| 91精品成人| 污污网站免费观看| 国产拍欧美日韩视频二区| 天天综合天天干| 精品福利一区二区三区| 最新超碰在线| 成人福利网站在线观看| 日韩在线观看| 日韩在线第三页| 久久久亚洲精品一区二区三区| 日本三级免费看| 欧美大片国产精品| 丝袜美女在线观看| 亚洲一区二区三区四区在线播放| 久久五月天小说| jizz大全欧美jizzcom| 国产欧美日韩在线看| 国产一级免费视频| 亚洲欧美日韩直播| 日韩精品一区二区三区| 鲁丝一区鲁丝二区鲁丝三区| 亚洲视频大全| 亚洲综合自拍网| 狠狠躁夜夜躁人人爽超碰91| 偷拍精品一区二区三区| 国内精品模特av私拍在线观看| 高清精品xnxxcom| 少妇人妻无码专区视频| 成人av中文字幕| 日本在线播放视频| 亚洲欧美制服第一页| 99re久久| 丰满女人性猛交| 国产成+人+日韩+欧美+亚洲| 精品少妇久久久| 亚洲精品美女在线观看播放| 校园春色亚洲| 日韩欧美精品一区二区三区经典| 免费久久99精品国产| 国产中文av在线| 精品久久久久久最新网址| segui88久久综合9999| 欧美日韩一区二| 免费成人在线观看| 久久久久久久久久网站| 亚洲精品一区二区三区精华液 | fc2ppv国产精品久久| 国产精华一区二区三区| 欧美亚洲专区| 亚洲国产精品一区二区久久hs| 欧美一区二区视频网站| 丰满的护士2在线观看高清| 美女黄毛**国产精品啪啪| 日韩电影在线免费观看| 秋霞欧美一区二区三区视频免费| 欧美一区二区免费视频| 国产在线美女| 亚洲乱码一区二区三区| 国产成人aaa| 无码一区二区三区在线观看| 久久视频国产精品免费视频在线| av综合网页| 狠狠热免费视频| 亚洲精品国产一区二区三区四区在线| 天天av天天翘| 国产精品视频网址| 亚洲国产婷婷| 蜜桃av免费观看| 亚洲精品福利免费在线观看| 日本黄色成人| 亚洲 高清 成人 动漫| 国产精品久久福利| 天堂在线资源8| 国产欧美精品一区二区三区介绍 | 亚洲天堂免费看| 少妇性bbb搡bbb爽爽爽欧美| 91亚洲精品久久久| 美女诱惑一区| jizz国产免费| 久久精品电影网站| 在线日本制服中文欧美| 韩国三级在线播放|