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

Go 語言下的 Redis 跳表設計與實現

系統 Redis
本文將詳細介紹如何使用 Go 語言從零開始實現一個類似于 Redis 的跳表。我們將探討跳表的基本原理、設計思路以及具體的實現方法。

在現代高性能數據庫和緩存系統中,跳表(Skip List)作為一種高效的有序數據結構,被廣泛應用于快速查找、插入和刪除操作。Redis 是一個開源的鍵值對存儲系統,它支持多種數據類型,并以其出色的性能而聞名。其中,Redis 使用了跳表來實現有序集合(Sorted Set),以保證其高效的數據處理能力。

本文將詳細介紹如何使用 Go 語言從零開始實現一個類似于 Redis 的跳表。我們將探討跳表的基本原理、設計思路以及具體的實現方法。通過本篇文章的學習,你不僅能夠了解跳表的工作機制,還能夠在實際項目中應用這一強大的數據結構。

定義基礎數據結構

redis中跳表通過score標識元素的大小,通過redis obj維護節點的信息,與此同時為了保證查詢的高效,它會為每個節點維護一份隨機高度的索引記錄當前節點的某個前驅節點:

對應我們給出節點的代碼實現:

/*
*
跳表節點的定義
*/
type zskiplistNode struct {
 //記錄元素的redis指針
 obj *robj
 //記錄當前元素的數值,代表當前元素的優先級
 score float64
 //指向當前元素的前驅節點,即小于當前節點的元素
 backward *zskiplistNode
 //用一個zskiplistLevel數組維護本屆點各層索引信息
 level    []zskiplistLevel
}

zskiplistLevel的代碼實現比較簡單,通過forward 記錄本層索引的前驅節點,并用span維護當前節點需要跨幾步才能走到該前驅節點:

type zskiplistLevel struct {
 //記錄本層索引的前驅節點的指針
 forward *zskiplistNode
 //標識節點的本層索引需要跨幾步才能到達該節點
 span    int64
}

通過上述概念構成無數個節點即稱為跳表,如下圖所示,各個節點都用一個level數組記錄本層索引到前驅節點的地址和跨度,而跳表也用一個header和tail指針維護跳表的頭尾節點:

對應的跳表結構體的代碼如下所示:

type zskiplist struct {
 //指向跳表的頭節點
 header *zskiplistNode
 //指向跳表的尾節點
 tail *zskiplistNode
 //維護跳表的長度
 length int64
 //維護跳表當前索引的最高高度
 level int
}

實現初始化方法

對應的我們也給出跳表的初始化代碼,大體邏輯是初始化跳表之后,初始化一個全空的索引和維護跳表的各種初始化信息,對應的筆者也對此代碼做了詳盡的注釋,讀者可自行參閱:

func zslCreate() *zskiplist {
 var j int
 //初始化跳表結構體
 zsl := new(zskiplist)
 //索引默認高度為1
 zsl.level = 1
 //跳表元素初始化為0
 zsl.length = 0
 //初始化一個頭節點socre為0,元素為空
 zsl.header = zslCreateNode(ZSKIPLIST_MAXLEVEL, 0, nil)

 /**
 基于跳表最大高度32初始化頭節點的索引,
 使得前驅指針指向null 跨度也設置為0
 */
 for j = 0; j < ZSKIPLIST_MAXLEVEL; j++ {
  zsl.header.level[j].forward = nil
  zsl.header.level[j].span = 0
 }
 //頭節點的前驅節點指向null,代表頭節點之前沒有任何元素
 zsl.header.backward = nil
 //初始化尾節點
 zsl.tail = nil
 return zsl
}

跳表插入操作

插入新節點時,本質上就是通過各層索引找到小于插入節點x的score的最大值,并記錄到update數組中,同時將頭節點跨到update數組元素的跨度值記錄到rank數組中,如下圖所示,假如我們插入節點1.5,那么對應各層索引的在update和rank兩個數組中維護的信息是:

  • level2級中update記錄header節點,所以跨度為0。
  • level1級中update記錄的是節點1,跨度為1。

然后基于此信息將x插入:

對應的代碼和上述圖解邏輯一致,對應的實現細節筆者都做好了標注:

func zslInsert(zsl *zskiplist, score float64, obj *robj) *zskiplistNode {
 //創建一個update數組,記錄插入節點每層索引中小于該score的最大值
 update := make([]*zskiplistNode, ZSKIPLIST_MAXLEVEL)
 //記錄各層索引走到小于score最大節點的跨區
 rank := make([]int64, ZSKIPLIST_MAXLEVEL)
 //x指向跳表走節點
 x := zsl.header
 var i int
 //從跳表當前最高層索引開始,查找每層小于當前score的節點的最大值節點
 for i = zsl.level - 1; i >= 0; i-- {
  //如果當前索引是最高層索引,那么rank從0開始算
  if i == zsl.level-1 {
   rank[i] = 0
  } else { //反之本層索引直接從上一層的跨度開始往后查找
   rank[i] = rank[i+1]
  }
  /**
  如果前驅節點不為空,且符合以下條件,則指針前移:
  1. 節點小于當前插入節點的score
  2. 節點score一致,且元素值小于或者等于當前score
  */
  if x.level[i].forward != nil &&
   (x.level[i].forward.score < score || (x.level[i].forward.score == score && x.level[i].forward.obj.String() < obj.String())) {
   //記錄本層索引前移跨度
   rank[i] += x.level[i].span
   //索引指針先前移動
   x = x.level[i].forward

  }
  //記錄本層小于當前score的最大節點
  update[i] = x
 }
 //隨機生成新插入節點的索引高度
 level := zslRandomLevel()
 /**
 如果大于當前索引高度,則進行初始化,將這些高層索引的update數組都指向header節點,跨度設置為跳表中的元素數
 意為這些高層索引小于插入節點的最大值就是header
 */
 if level > zsl.level {
  for i := zsl.level; i < level; i++ {
   rank[i] = 0
   update[i] = zsl.header
   update[i].level[i].span = zsl.length
  }
  //更新一下跳表索引的高度
  zsl.level = level
 }
 //基于入參生成一個節點
 x = zslCreateNode(level, score, obj)
 //從底層到當前最高層索引處理節點關系
 for i = 0; i < level; i++ {
  //將小于當前節點的最大節點的forward指向插入節點x,同時x指向這個節點的前向節點
  x.level[i].forward = update[i].level[i].forward
  update[i].level[i].forward = x
  //維護x和update所指向節點之間的跨度信息
  x.level[i].span = update[i].level[i].span - (rank[0] - rank[i])
  update[i].level[i].span = rank[0] - rank[i] + 1
 }
 /**
 考慮到當前插入節點生成的level小于當前跳表最高level的情況
 該邏輯會將這些區間的update索引中的元素到其前方節點的跨度+1,即代表這些層級索引雖然沒有指向x節點,
 但因為x節點插入的緣故跨度要加1
 */
 for i = level; i < zsl.level; i++ {
  update[i].level[i].span++
 }
 //如果1級索引是header,則x后繼節點不指向該節點,反之指向
 if update[0] == zsl.header {
  x.backward = nil
 } else {
  x.backward = update[0]
 }
 //如果x前向節點不為空,則讓前向節點指向x
 if x.level[0].forward != nil {
  x.level[0].forward.backward = x
 } else {//反之說明x是尾節點,tail指針指向它
  zsl.tail = x
 }
 //維護跳表長度信息
 zsl.length++
 return x
}

跳表查詢操作

有了插入操作的基礎后,查詢操作實現也比較容易了,即從頭節點的最高索引開始不斷向前找,如果沒有則往下一級索引前向找,找到后返回經過的跨度即可。

如下圖,我們希望查找元素2,直接從頭節點的2級索引開始看,就是元素2比對一致,返回跨度2,即跨2步就能到達:

對應代碼如下,和筆者說明一致,這里筆者也做了詳盡的標注提供參考:

func zslGetRank(zsl *zskiplist, score float64, obj *robj) int64 {
 var rank int64
 //從索引最高節點開始進行查找
 x := zsl.header
 for i := zsl.level - 1; i >= 0; i-- {
  //如果前向節點不為空且score小于查找節點,或者score相等,但是元素字符序比值小于或者等于則前移,同時用rank記錄跨度
  for x.level[i].forward != nil &&
   (x.level[i].forward.score < score || (x.level[i].forward.score == score && x.level[i].forward.obj.String() <= obj.String())) {
   rank += x.level[i].span
   x = x.level[i].forward
  }
  //上述循環結束,比對一直,則返回經過的跨度
  if x.obj != nil && x.obj.String() == obj.String() {
   return rank
  }
 }
 return 0
}

跳表刪除操作

刪除操作本質上也是找到要刪除節點索引的前后節點,然后將這些節點關聯,并修改其之間跨度,如下圖我們要刪除1.5節點,對應各層查找結果為:

  • 3級索引找到頭節點,因為前方不是1.5的節點索引,直接跨度減1即。
  • 2級索引找到頭節點,前方就是1.5的索引,刪除掉后跨度改為header索引到1.5+1.5到前向節點跨度減去1,這里的減去1代表刪除了節點1.5的跨步。
  • 1級索引同2級索引,不多做贅述。

對應的代碼示例如下,整體邏輯和筆者描述基本一致,先通過update找到刪除節點x的前一個元素,然后調用zslDeleteNode進行刪除:

func zslDelete(zsl *zskiplist, score float64, obj *robj) int64 {
 update := make([]*zskiplistNode, ZSKIPLIST_MAXLEVEL)
 //找到每層索引要刪除節點的前一個節點
 x := zsl.header
 for i := zsl.level - 1; i >= 0; i-- {
  for x.level[i].forward != nil &&
   (x.level[i].forward.score < score || (x.level[i].forward.score == score && x.level[i].forward.obj.String() < obj.String())) {
   x = x.level[i].forward
  }
  update[i] = x
 }
 //查看1級索引前面是否就是要刪除的節點,如果是則直接調用zslDeleteNode刪除節點,并斷掉前后節點關系
 x = x.level[0].forward
 if x != nil && x.obj.String() == obj.String() {
  zslDeleteNode(zsl, x, update)
  return 1
 }
 return 0
}

對應zslDeleteNode細節就如筆者上圖所講解的步驟,讀者可參考注釋進行閱讀:

func zslDeleteNode(zsl *zskiplist, x *zskiplistNode, update []*zskiplistNode) {

 var i int
 for i = 0; i < zsl.level; i++ {
  /*
  如果索引前方就是刪除節點,當前節點span為:
  當前節點到x +x到x前向節點 -1
   */
  if update[i].level[i].forward == x {
   update[i].level[i].span += x.level[i].span - 1
   update[i].level[i].forward = x.level[i].forward
  } else {
   //反之說明該節點前方不是x的索引,直接減去x的跨步1即
   update[i].level[i].span -= 1
  }
 }
 //維護刪除后的節點前后關系
 if x.level[0].forward != nil {
  x.level[0].forward.backward = x.backward
 } else {
  zsl.tail = x.backward
 }
 //將全空層的索引刪除
 for zsl.level > 1 && zsl.header.level[zsl.level-1].forward == nil {
  zsl.level--
 }
 //維護跳表節點信息
 zsl.length--

小結

通過本文的詳細講解,我們從零開始使用 Go 語言實現了一個類似于 Redis 的跳表。我們首先介紹了跳表的基本原理和設計思路,然后逐步實現了跳表的各種核心操作,包括插入、查找和刪除。最后,我們對跳表的性能進行了分析,并探討了其在 Redis 有序集合和其他場景中的應用。

責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2025-01-06 08:10:00

Redis跳表索引

2020-12-28 07:33:21

SkipListJava跳表

2021-09-30 09:21:28

Go語言并發編程

2017-06-27 09:43:43

Python機器學習

2023-05-17 00:15:11

TCCXA模式

2021-04-13 07:58:42

Go語言函數

2021-04-07 09:02:49

Go 語言變量與常量

2021-07-30 07:28:15

WorkerPoolGo語言

2025-05-22 08:15:00

2025-03-20 09:54:47

2025-02-25 09:29:34

2023-03-27 00:20:48

2025-08-28 02:12:00

2022-05-09 10:36:05

PythonPyScript開發者

2021-04-20 09:00:48

Go 語言結構體type

2025-03-27 00:45:00

2023-03-21 07:57:37

Go語言設計模式

2021-10-20 07:18:51

Go語言設計

2025-05-30 01:55:00

go語言Redis

2021-07-09 11:59:25

Redis有序集合
點贊
收藏

51CTO技術棧公眾號

国产麻豆精品久久| 黑人巨大亚洲一区二区久| 国产成人免费在线观看不卡| 久久久久久久久中文字幕| aa片在线观看视频在线播放| 456成人影院在线观看| 亚洲欧洲制服丝袜| 久久久久久草| 亚洲 另类 春色 国产| 熟妇人妻系列aⅴ无码专区友真希| 欧美久久久久| 亚洲性无码av在线| 中文字幕 欧美 日韩| 欧美少妇网站| 亚洲日本在线看| 久久精品magnetxturnbtih| 在线免费av网| 亚洲伊人观看| 久久国产精品久久久| 在线免费观看日韩av| 免费精品一区二区三区在线观看| 欧美色播在线播放| 国产精品12p| 九九九伊在人线综合| 国产白丝精品91爽爽久久 | 国产伦视频一区二区三区| 手机av免费观看| 亚洲专区一区| 久久久在线观看| 顶臀精品视频www| jiujiure精品视频播放| 日韩精品中文字幕久久臀| 女同性αv亚洲女同志| 亚洲青青一区| 欧美日韩日日摸| 国产一区二区视频免费在线观看| 123区在线| 亚洲一区二区在线视频| 超碰97在线看| 国产在线观看免费麻豆| 国产精品日产欧美久久久久| 日韩三级电影免费观看| 狠狠狠综合7777久夜色撩人| 91日韩在线专区| 国产精品加勒比| www.精品视频| 懂色av一区二区三区免费看| 4444kk亚洲人成电影在线| 91麻豆国产在线| 久久精品国产久精国产爱| 国产成人亚洲综合青青| 波多野结衣电车| 日韩经典一区二区| 国产精品国内视频| 中文字幕 视频一区| 秋霞午夜av一区二区三区| 国产精品观看在线亚洲人成网| 无码人妻精品一区二区50| 久久夜色精品| 国产精品女主播视频| 中文字幕有码视频| 国内精品国产三级国产a久久| 成人有码在线播放| aa视频在线免费观看| 国产成人aaaa| 精品一区二区三区免费毛片| 视频在线不卡| 国产亚洲va综合人人澡精品| 日产精品一线二线三线芒果| 亚洲1卡2卡3卡4卡乱码精品| 最新不卡av在线| 中文字幕人妻熟女人妻洋洋| 黑森林国产精品av| 在线看国产一区| 视频免费1区二区三区| 日韩精品视频在线看| 精品国产精品网麻豆系列| 久久午夜夜伦鲁鲁片| 精品国产一级毛片| 久久夜色精品亚洲噜噜国产mv| 九九热精品免费视频| 销魂美女一区二区三区视频在线| 国产精品第8页| 国产婷婷一区二区三区久久| 波多野结衣91| 亚洲国产精品综合| 91高清在线观看视频| 婷婷综合另类小说色区| www.99av.com| 国产suv精品一区| 中文字幕亚洲综合| 久久亚洲国产成人精品性色| 老司机精品视频网站| 亚洲999一在线观看www| 亚洲欧美日本在线观看| 国产精品天干天干在线综合| 成人av在线不卡| 精品123区| 精品久久久久99| 9.1成人看片免费版| 中文字幕一区二区三区乱码图片| 欧美最猛性xxxx| 国产普通话bbwbbwbbw| 26uuu久久天堂性欧美| 艳母动漫在线观看| 欧美日韩五码| 亚洲精品97久久| 欧美激情精品久久久久久免费| 国产亚洲亚洲| 成人免费看片网址| 日本中文字幕在线播放| 色综合色综合色综合| 国产吃瓜黑料一区二区| 日韩欧美一区二区三区在线视频| 97国产在线视频| aaa一区二区| 亚洲欧洲另类国产综合| 成人免费观看毛片| 久久国产精品免费精品3p| 久久这里只有精品99| 国产又粗又猛又黄视频| 91女神在线视频| 日韩在线视频在线| 国产电影一区二区| 尤物九九久久国产精品的特点| 国产精品日日夜夜| 国产伦精品一区二区三区免费 | 永久免费看片在线观看| 成人在线免费观看91| 78m国产成人精品视频| 丰满人妻一区二区三区无码av| 亚洲国产经典视频| 国产免费人做人爱午夜视频| 日韩美脚连裤袜丝袜在线| 欧美精品video| xxxwww在线观看| 亚洲精品中文字幕在线观看| 免费网站在线观看黄| 97欧美在线视频| 国产欧美日韩综合精品| h视频在线观看免费| 91福利视频网站| 波多野吉衣中文字幕| 国产精品主播| 久久艳妇乳肉豪妇荡乳av| а√在线天堂官网| 日韩高清有码在线| 国产精品久久久久久久久久久久久久久久久 | 国产一级在线观看| 色婷婷狠狠综合| 国产手机在线观看| 日韩成人精品在线观看| 亚洲精品白虎| 91精品国产色综合久久不卡粉嫩| 日韩中文字幕av| 一区二区三区亚洲视频| 国产精品久久久久桃色tv| 手机av在线免费| 亚洲区综合中文字幕日日| 亚洲淫片在线视频| 国产99re66在线视频| 亚洲成人激情在线| 久久国产黄色片| 久久精品亚洲精品国产欧美| 小泽玛利亚视频在线观看| 久久美女视频| 亚洲伊人一本大道中文字幕| 91高清视频在线观看| 亚洲精品日韩在线| 中文字幕视频一区二区| 亚洲免费av在线| av免费观看不卡| 久久久www| 天天成人综合网| 大陆精大陆国产国语精品| **欧美日韩vr在线| 成人在线观看网站| 欧美一级免费大片| 圆产精品久久久久久久久久久| 久久久久久久电影| 欧美日韩精品区别| 亚洲精品精选| 亚洲草草视频| 99精品国产高清一区二区麻豆| 青青久久av北条麻妃黑人| 在线观看国产原创自拍视频| 日韩欧美自拍偷拍| 亚洲乱码国产乱码精品| 亚洲伦在线观看| 国产熟妇搡bbbb搡bbbb| 久久超碰97人人做人人爱| av日韩一区二区三区| 欧美日韩在线观看视频小说| av观看久久| 精品免费av一区二区三区| 欧美激情在线观看| 3p在线观看| 亚洲国产高清高潮精品美女| 中文字幕在线观看第二页| 亚洲va天堂va国产va久| 国产又粗又猛又爽又黄的视频四季| 粉嫩高潮美女一区二区三区| 最近中文字幕一区二区| 亚洲国产精品一区制服丝袜| 永久免费精品视频网站| 羞羞色国产精品网站| 91中文字精品一区二区| 欧美日韩尤物久久| 韩国三级电影久久久久久| 国产最新在线| 色系列之999| 久久这里精品| 亚洲国产精品久久| 国产ts变态重口人妖hd| 精品视频一区二区不卡| 亚洲天堂一区在线观看| 亚洲国产视频网站| 成人性生活毛片| 中文字幕的久久| 中文字幕丰满乱子伦无码专区| 成人免费高清在线| a级大片免费看| 国内精品国产成人| 91视频这里只有精品| 日韩av午夜在线观看| 色综合av综合无码综合网站| 亚洲国产电影| 免费人成自慰网站| 国产精品二区影院| 亚洲高潮无码久久| 亚洲综合专区| 亚洲一区 在线播放| 91成人免费| 一区二区三区日韩视频| 天天操夜夜操国产精品| 亚洲人成人77777线观看| 欧洲乱码伦视频免费| 日韩欧美精品在线不卡| 国产麻豆精品久久| 神马影院午夜我不卡影院| 最新国产一区| 欧美日韩国产综合在线| 五月国产精品| 欧美激情第六页| 夜色77av精品影院| 天堂资源在线亚洲视频| 欧洲激情综合| 中文字幕色一区二区| 国产精品久久久久久影院8一贰佰| 亚洲一区二区高清视频| 激情婷婷综合| 亚洲激情图片| 欧美aa国产视频| 免费在线观看视频a| 国产亚洲毛片| 黄色aaa级片| 精久久久久久久久久久| 一级黄色免费毛片| 成人综合婷婷国产精品久久| 在线视频 日韩| 久久久久久久久久看片| 亚洲成人黄色av| 国产精品久久久久久久久果冻传媒| 日本少妇aaa| 一区二区三区四区在线免费观看 | avtt在线播放| 欧美www在线| 国产免费拔擦拔擦8x在线播放| 91a在线视频| 日韩一区精品| 亚洲伊人第一页| 天天躁日日躁狠狠躁欧美| 色一情一乱一伦一区二区三区丨 | 北条麻妃在线视频观看| 久久精品一区二区国产| 精品国产乱码久久久久久1区二区| 国产福利精品导航| 国产精品一区二区入口九绯色| 国产欧美1区2区3区| 东方av正在进入| 天天av天天翘天天综合网 | 日韩avvvv在线播放| 北条麻妃亚洲一区| 久久中文字幕电影| 特一级黄色录像| 欧美日韩国产一区二区| 亚洲天堂视频在线| 亚洲精品不卡在线| 日本高清在线观看wwwww色| 国内精品视频一区| 国产精品伦一区二区| 国产久一道中文一区| 色喇叭免费久久综合| 秋霞无码一区二区| 寂寞少妇一区二区三区| 亚洲成人网在线播放| 亚洲精品中文在线影院| 亚洲午夜18毛片在线看| 91精品国产全国免费观看| 国产在线超碰| 国产69精品99久久久久久宅男| 韩国理伦片久久电影网| 久久国产精品-国产精品| 亚洲h色精品| 欧美三级理论片| ww久久中文字幕| 校园春色 亚洲| 欧美偷拍一区二区| 五月婷婷免费视频| 欧美黄色成人网| 亚洲一区av| 亚洲 国产 欧美一区| 国产精品综合色区在线观看| 免费黄色av网址| 亚洲男人天堂一区| 中文亚洲av片在线观看| 亚洲欧洲黄色网| 交100部在线观看| 国产伦精品一区二区三毛| 性欧美欧美巨大69| www.夜夜爽| 中文字幕乱码日本亚洲一区二区| 久久99精品波多结衣一区| 日韩精品一区二区三区中文不卡| 色三级在线观看| 国产精品白嫩美女在线观看| 亚洲+变态+欧美+另类+精品| 国产www免费| 成人福利在线看| 免费一级a毛片夜夜看 | 性色av浪潮av| 最新久久zyz资源站| 亚洲一二区视频| 夜夜嗨av色综合久久久综合网| 樱桃视频成人在线观看| 久草热久草热线频97精品| 一区二区福利| 激情综合丁香五月| 欧美日韩国产中文字幕 | 最近2019年日本中文免费字幕 | 刘亦菲国产毛片bd| 在线精品视频一区二区| www.黄在线观看| 国产精品视频最多的网站| 欧美国产美女| 国产又大又黄又粗又爽| 国产精品乱码人人做人人爱| 91精品人妻一区二区三区果冻| 色爱av美腿丝袜综合粉嫩av| 成人av色网站| 久久久国产精华液999999| 国产九色精品成人porny| 欧美精品入口蜜桃| 亚洲第一区中文字幕| 日韩激情电影免费看| 日本一区二区三区四区在线观看| 老司机精品视频网站| 国产精品视频看看| 欧美videos大乳护士334| av中文资源在线资源免费观看| 精品久久久久久中文字幕动漫| 亚洲欧美日韩视频二区| 无码人妻丰满熟妇啪啪欧美| 欧美日韩一级二级| 天使と恶魔の榨精在线播放| 国产精品成人一区二区三区| 国产精品乱看| 2017亚洲天堂| 欧美精品一区二区三区一线天视频| 狠狠操一区二区三区| 性欧美大战久久久久久久免费观看 | 国产精品成人在线| 综合久久精品| 亚洲第九十七页| 欧美三级日韩在线| 草美女在线观看| 欧美尤物一区| 国产一区二区福利视频| 久久久精品免费看| 久久亚洲一区二区三区四区五区高| jazzjazz国产精品麻豆| 欧美日韩怡红院| 亚洲成人黄色影院| eeuss影院www在线播放| 超碰97在线人人| 日韩av午夜在线观看| 精品无码久久久久久久久| 亚洲视频欧洲视频| 77成人影视| 天天色综合社区| 精品毛片三在线观看| 黄色成人影院| 日本一区二区三区www| 国产宾馆实践打屁股91| 国产男人搡女人免费视频| 欧美激情一区二区三区久久久| 成人一区不卡| 中文成人无字幕乱码精品区| 欧美二区三区91| 性欧美1819sex性高清|