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

面試官:說說Redis的Hash底層 我:......

存儲 存儲軟件 Redis
在Redis中Hash類型的應用非常廣泛,其中key到value的映射就通過字典結構來維護的。記筆記,此處要考。

 

本文轉載自微信公眾號「學習Java的小姐姐」,作者學習Java的小姐姐0618 。轉載本文請聯系學習Java的小姐姐公眾號。

[[332012]]

前言

hello,各位小可愛們,又見面了。今天這篇文章來自去年面試閱文的面試題,結果被虐了。這一part不說了,下次專門開一篇,寫下我面試被虐的名場面,尷尬的不行,全程尬聊。哈哈哈哈,話不多說,開始把。😂

 

在Redis中Hash類型的應用非常廣泛,其中key到value的映射就通過字典結構來維護的。記筆記,此處要考。

 

API使用

API的使用比較簡單,所以以下就粗略的寫了。

插入數據hset

使用hset命令往myhash中插入兩個key,value的鍵值對,分別是(name,zhangsan)和(age,20),返回值當前的myhash的長度。

 

獲取數據hget

使用hget命令獲取myhash中key為name的value值。

 

獲取所有數據hgetall

使用hgetall命令獲取myhash中所有的key和value值。

 

獲取所有key

使用hkeys命令獲取myhash中所有的key值。

 

獲取長度

使用hlen命令獲取myhash的長度。

 

獲取所有value

使用hvals命令獲取myhash中所有的value值。

 

具體邏輯圖

正文要開始了哈。hash的底層主要是采用字典dict的結構,整體呈現層層封裝。

 

首先dict有四個部分組成,分別是dictType(類型,不咋重要),dictht(核心),rehashidx(漸進式hash的標志),iterators(迭代器),這里面最重要的就是dictht和rehashidx。

接下來是dictht,其有兩個數組構成,一個是真正的數據存儲位置,還有一個用于hash過程,包括的變量分別是真正的數據table和一些常見變量。

最后數據節點,和上篇說的雙向鏈表一樣,每個節點都有next指針,方便指向下一個節點,這樣目的是為了解決hash碰撞。具體的可以看下圖。

這邊看不懂沒關系,后面會針對每個模塊詳細說明。(千萬不要看到這里就跳過啦)

 

雙向鏈表的定義

字典結構體dict

我們先看字典結構體dict,其包括四個部分,重點是dictht[2](真正的數據)和rehashidx(漸進式hash的標志)。具體圖如下。

 

具體代碼如下:

  1. //字典結構體 
  2. typedef struct dict { 
  3. dictType *type;//類型,包括一些自定義函數,這些函數使得key和value能夠存儲 
  4. void *privdata;//私有數據 
  5. dictht ht[2];//兩張hash表 
  6. long rehashidx; //漸進式hash標記,如果為-1,說明沒在進行hash 
  7. unsigned long iterators; //正在迭代的迭代器數量 
  8. } dict; 

數組結構體dictht

dictht主要包括四個部分,1是真正的數據dictEntry類型的數組,里面存放的是數據節點;2是數組長度size;3是進行hash運算的參數sizemask,這個不咋重要,只要記住等于size-1;4是數據節點數量used,當前有多少個數據節點。

 

具體代碼如下:

  1. //hash結構體 
  2. typedef struct dictht { 
  3. dictEntry **table;//真正數據的數組 
  4. unsigned long size;//數組的大小 
  5. unsigned long sizemask;//用戶將hash映射到table的位置索引,他的值總是等于size-1 
  6. unsigned long used;//已用節點數量 
  7. } dictht; 

數據節點dictEntry

dictEntry為真正的數據節點,包括key,value和next節點。

  1. //每個節點的結構體 
  2. typedef struct dictEntry { 
  3.    void *key; //key 
  4.    union { 
  5.           void *val; 
  6.           uint64_t u64; 
  7.           int64_t s64; 
  8.           double d; 
  9.    } v;//value 
  10.   struct dictEntry *next; //下一個數據節點的地址 
  11. } dictEntry; 

擴容過程和漸進式Hash圖解

我們先來第一個部分,dictht[2]為什么會要2個數組存放,真正的數據只要一個數組就夠了?

 

這其實和Java的HashMap相似,都是數據加鏈表的結構,隨著數據量的增加,hash碰撞發生的就越頻繁,每個數組后面的鏈表就越長,整個鏈表顯得非常累贅。如果業務需要大量查詢操作,因為是鏈表,只能從頭部開始查詢,等一個數組的鏈表全部查詢完才能開始下一個數組,這樣查詢時間將無限拉長。

這無疑是要進行擴容,所以第一個數組存放真正的數據,第二個數組用于擴容用。第一個數組中的節點經過hash運算映射到第二個數組上,然后依次進行。那么過程中還能對外提供服務嗎?答案是可以的,因為他可以隨時停止,這就到了下一個變量rehashidx。(一點都不生硬的轉場,哈哈哈)

 

rehashidx其實是一個標志量,如果為-1說明當前沒有擴容,如果不為-1則表示當前擴容到哪個下標位置,方便下次進行從該下標位置繼續擴容。

 

這樣說是不是太抽象了,還是一臉懵逼,貼心的送上擴容過程全解,一定要點贊評論多夸夸我哦。

 

步驟1

首先是未擴容前,rehashidx為-1,表示未擴容,第一個數組的dictEntry長度為4,一共有5個節點,所以used為5。

 

步驟2

當發生擴容了,rahashidx為第一個數組的第一個下標位置,即0。擴容之后的大小為大于used*2的2的n次方的最小值,即能包含這些節點*2的2的倍數的最小值。因為當前為5個數據節點,所以used*2=10,擴容后的數組大小為大于10的2的次方的最小值,為16。從第一個數組0下標位置開始,查找第一個元素,找到key為name,value為張三的節點,將其hash過,找到在第二個數組的下標為1的位置,將節點移過去,其實是指針的移動。這邊就簡單說了。

 

步驟3

key為name,value為張三的節點移動結束后,繼續移動第一個數組dictht[0]的下標為0的后續節點,移動步驟和上面相同。

 

步驟4

繼續移動第一個數組dictht[0]的下標為0的后續節點都移動完了,開始移動下標為1的節點,發現其沒有數據,所以移動下標為2的節點,同時修改rehashidx為2,移動步驟和上面相同。

 

整個過程的重點在于rehashidx,其為第一個數組正在移動的下標位置,如果當前內存不夠,或者操作系統繁忙,擴容的過程可以隨時停止。

停止之后如果對該對象進行操作,那是什么樣子的呢?

  • 如果是新增,則直接新增后第二個數組,因為如果新增到第一個數組,以后還是要移過來,沒必要浪費時間
  • 如果是刪除,更新,查詢,則先查找第一個數組,如果沒找到,則再查詢第二個數組。

字典的實現(源碼分析)

創建并初始化字典

首先分配內存,接著調用初始化方法_dictInit,主要是賦值操作,重點看下rehashidx賦值為-1(這驗證了剛才的圖解,-1表示未進行hash擴容),最后返回是否創建成功。

  1. /* 創建并初始化字典 */ 
  2. dict *dictCreate(dictType *type,void *privDataPtr) 
  3.      dict *d = zmalloc(sizeof(*d)); 
  4.      _dictInit(d,type,privDataPtr); 
  5.      return d; 
  6.  
  7. /* Initialize the hash table */ 
  8. int _dictInit(dict *d, dictType *type,void *privDataPtr) 
  9.      _dictReset(&d->ht[0]); 
  10.      _dictReset(&d->ht[1]); 
  11.      d->type = type; 
  12.      d->privdata = privDataPtr; 
  13.      d->rehashidx = -1;//賦值為-1,表示未進行hash 
  14.      d->iterators = 0; 
  15. return DICT_OK; 

擴容

dict里面有一個靜態方法_dictExpandIfNeed,判斷是否需要擴容。

首先判斷通過dictIsRehashing方法,判斷是否處于hash狀態,其調用的是宏常量#define dictIsRehashing(d) ((d)->rehashidx != -1),即判斷rehashidx是否為-1,如果為-1,即不處于hash狀態,if條件為false,可以進行擴容,如果不為-1,即處于hash狀態,if條件為true,不可以進行擴容,直接返回常量DICT_OK。

接著判斷第一個數組的size是否為0,如果為0,則擴容為默認大小4,如果不為0,則執行下面的代碼。

再接著判斷是否需要擴容,if中有三個條件,具體的分析如下。

最后就是調用dictExpand擴容方法了,參數為數據節點的雙倍大小ht[0].used*2。此處驗證了上面擴容過程的數組大小16。

擴容方法比較簡單點,獲取擴容后的大小,將第二個設置新的大小。

這樣講感覺有點空,看下流程圖。

擴容流程圖

 

具體代碼:

  1. static int _dictExpandIfNeeded(dict *d) 
  2.       //判斷是否處于擴容狀態中,通過調用宏常量#define                                                  
  3.       dictIsRehashing(d) ((d)->rehashidx != -1) 
  4.       //來判斷是否可以擴容 
  5.       if (dictIsRehashing(d)) return DICT_OK; 
  6.  
  7.       //判斷第一個數組size是否為0,如果為0,則調用擴容方法,大小為宏常量 
  8.       //#define DICT_HT_INITIAL_SIZE 4 
  9.       if (d->ht[0].size == 0)  
  10.              return dictExpand(d, DICT_HT_INITIAL_SIZE); 
  11.  
  12.       //下面先列出if條件中所使用到的參數 
  13.       // static int dict_can_resize = 1;數值為1表示可以擴容 
  14.       //static unsigned int dict_force_resize_ratio = 5; 
  15.       //我們來分析if條件,如果第一個數組的所有節點數量大于等于第一個數組的大小(表      示節點數據已經有些多) 
  16.       //并且可用擴容(數值為1)或者所有節點數量除以數組大小大于5 
  17.       //這個條件表示擴容那個的條件,第一個就是節點必要大于等于數組長度, 
  18.       //第二點就再可以擴容和數據太多,超過5兩個中選其一 
  19.       if (d->ht[0].used >= d->ht[0].size &&(dict_can_resize || 
  20.       d->ht[0].used/d->ht[0].size > dict_force_resize_ratio)) 
  21.       { 
  22.             //調用擴容方法 
  23.             return dictExpand(d, d->ht[0].used*2); 
  24.       } 
  25. return DICT_OK; 
  26.  
  27. int dictExpand(dict *d, unsigned long size
  28.       dictht n; 
  29.       //獲取擴容后真正的大小,找到比size大的最小值,且是2的倍數 
  30.       unsigned long realsize = _dictNextPower(size); 
  31.  
  32.       //一些判斷條件 
  33.       if (dictIsRehashing(d) || d->ht[0].used > size
  34.             return DICT_ERR; 
  35.  
  36.       if (realsize == d->ht[0].sizereturn DICT_ERR; 
  37.  
  38.       n.size = realsize; 
  39.       n.sizemask = realsize-1; 
  40.       n.table = zcalloc(realsize*sizeof(dictEntry*)); 
  41.       n.used = 0; 
  42.  
  43.       //第一個hash為null,說明在初始化 
  44.       if (d->ht[0].table == NULL) { 
  45.             d->ht[0] = n; 
  46.       return DICT_OK; 
  47.       } 
  48.  
  49.       //正在hash,給第二個hash的長度設置新的, 
  50.       d->ht[1] = n; 
  51.       d->rehashidx = 0;//設置當前正在hash 
  52. return DICT_OK; 
  53.  
  54. /* 找到比size大的最小值,且是2的倍數 */ 
  55. static unsigned long _dictNextPower(unsigned long size
  56.       unsigned long i = DICT_HT_INITIAL_SIZE; 
  57.  
  58.       if (size >= LONG_MAX) return LONG_MAX; 
  59.       while(1) { 
  60.             if (i >= size
  61.                   return i; 
  62.       i *= 2; 
  63.       } 

漸進式hash

漸進式hash過程已經通過上面圖解說明,以下主要看下代碼是如何實現的,以及過程是不是對的。

擴容之后就是執行dictRehash方法,參數包括待移動的哈希表d和步驟數字n。

首先判斷標志量rehashidx是否等于-1,如果等于-1,則表示hash完成,如果不等于-1,則執行下面的代碼。

接著進行循環,遍歷第一個數組上的每個下標,每次移動下標位置,都需要更新rehashidx值,每次加1。

再接著進行第二個循環,遍歷下標的鏈表每個節點,完成數據的遷移,主要是指針的移動和一些參數的修改。

最后,返回int數值,如果為0表示整個數據全部hash完成,如果返回1則表示部分hash結束,并沒有全部完成,下次可以通過rehashidx值繼續hash。

具體代碼如下:

  1.      //重新hash這個哈希表 
  2. // Redis的哈希表結構共有兩個table數組,t0和t1,平常只使用一個t0,當需要重hash時則重hash到另一個table數組中 
  3. //參數列表 
  4. // 1. d: 待移動的哈希表,結構中存有目前已經重hash到哪個桶了 
  5. // 2. n: N步進行rehash 
  6. // 返回值 返回0說明整個表都重hash完成了,返回1代表未完成 
  7. int dictRehash(dict *d, int n) { 
  8.       int empty_visits = n*10; 
  9.       //如果當前rehashidx=-1,則返回0,表示hash完成 
  10.       if (!dictIsRehashing(d)) return 0; 
  11.       //分n步,而且ht[0]還有沒有移動的節點 
  12.       while(n-- && d->ht[0].used != 0) { 
  13.             dictEntry *de, *nextde; 
  14.             assert(d->ht[0].size > (unsigned long)d->rehashidx); 
  15.             //第一個循環用來更新 rehashidx 的值,因為有些桶為空,所以 rehashidx并非每次都比原來前進一個位置,而是有可能前進幾個位置,但最多不超過 10。 
  16.             //將rehashidx移動到ht[0]有節點的下標,也就是table[d->rehashidx]非空 
  17.       while(d->ht[0].table[d->rehashidx] == NULL) { 
  18.             d->rehashidx++; 
  19.             if (--empty_visits == 0) return 1; 
  20.       } 
  21.      //第二個循環用來將ht[0]表中每次找到的非空桶中的鏈表(或者就是單個節點)拷貝到ht[1]中 
  22.       de = d->ht[0].table[d->rehashidx];  
  23.  
  24.      /* 利用循環將數據節點移過去 */ 
  25.      while(de) { 
  26.           unsigned int h; 
  27.  
  28.           nextde = de->next
  29.           h = dictHashKey(d, de->key) & d->ht[1].sizemask; 
  30.           de->next = d->ht[1].table[h]; 
  31.           d->ht[1].table[h] = de; 
  32.           d->ht[0].used--; 
  33.           d->ht[1].used++; 
  34.           de = nextde; 
  35.           } 
  36.      d->ht[0].table[d->rehashidx] = NULL
  37.      d->rehashidx++; 
  38.     } 
  39.  
  40.      if (d->ht[0].used == 0) { 
  41.           zfree(d->ht[0].table); 
  42.           d->ht[0] = d->ht[1]; 
  43.           _dictReset(&d->ht[1]); 
  44.      d->rehashidx = -1; 
  45.      return 0; 
  46.  
  47. return 1; 

總結

 

該篇主要講了Redis的Hash數據類型的底層實現字典結構Dict,先從Hash的一些API使用,引出字典結構Dict,剖析了其三個主要組成部分,字典結構體Dict,數組結構體Dictht,數據節點結構體DictEntry,進而通過多幅過程圖解釋了擴容過程和rehash過程,最后結合源碼對字典進行描述,如創建過程,擴容過程,漸進式hash過程,中間穿插流程圖講解。

 

責任編輯:武曉燕 來源: 學習Java的小姐姐
相關推薦

2025-04-08 00:00:00

@AsyncSpring異步

2024-02-29 16:49:20

volatileJava并發編程

2024-08-29 16:30:27

2024-03-14 14:56:22

反射Java數據庫連接

2024-03-06 15:38:06

Spring微服務架構擴展組件

2024-09-04 17:35:09

2024-11-19 15:13:02

2025-04-16 00:00:01

JWT客戶端存儲加密令

2023-12-27 18:16:39

MVCC隔離級別幻讀

2021-05-28 11:18:50

MySQLbin logredo log

2024-08-22 10:39:50

@Async注解代理

2024-03-05 10:33:39

AOPSpring編程

2024-05-30 08:04:20

Netty核心組件架構

2022-06-15 15:14:17

Java公平鎖非公平鎖

2024-12-06 07:00:00

2024-07-31 08:28:37

DMAIOMMap

2021-11-25 10:18:42

RESTfulJava互聯網

2024-02-20 08:13:35

類加載引用Class

2024-09-20 08:36:43

零拷貝數據傳輸DMA

2024-03-11 18:18:58

項目Spring線程池
點贊
收藏

51CTO技術棧公眾號

成人性生交xxxxx网站| 精品亚洲男同gayvideo网站| 久久久久久久久久久久久国产| 国产aⅴ一区二区三区| 亚洲人成在线影院| 国产亚洲一级高清| 日本黄色www| 综合日韩av| 中文字幕日韩精品一区| 国产欧美日韩在线播放| 中文无码精品一区二区三区| 国内激情久久| 色狠狠久久aa北条麻妃| 欧美激情 亚洲| 人人精品久久| 精品人伦一区二区三区蜜桃免费| 宅男噜噜99国产精品观看免费| 色综合免费视频| 久久电影网电视剧免费观看| 97精品一区二区三区| 潮喷失禁大喷水aⅴ无码| xvideos.蜜桃一区二区| 欧美日韩国产成人在线免费| 欧美三级一级片| 色呦呦呦在线观看| 国产精品国产a| 蜜桃日韩视频| 人人妻人人玩人人澡人人爽| 韩国精品久久久| 国产精品成人国产乱一区 | 午夜精品视频在线| 黄色香蕉视频在线观看| 欧美日韩国产在线观看网站| 亚洲国产成人精品久久| 天天操精品视频| 成人在线视频免费| 欧美性生活大片免费观看网址| 4444在线观看| 成人高清免费在线| 国产精品视频一二| 日本婷婷久久久久久久久一区二区 | 免费黄色在线| 国产精品久久三区| 日韩福利影院| 国产福利在线| 国产午夜三级一区二区三| 好看的日韩精品| 欧美一区二区在线观看视频| 成人爱爱电影网址| 国产精品区一区二区三在线播放 | 欧美成人毛片| 欧美日韩国产综合一区二区| 91香蕉视频污版| 欧美三区四区| 色婷婷激情久久| 国产免费视频传媒| 91超碰碰碰碰久久久久久综合| 在线观看区一区二| 免费看污黄网站| 精品176极品一区| 欧美年轻男男videosbes| 亚洲天堂2018av| 国产精品美女久久久久人| 91精品国产综合久久精品麻豆 | 日本www在线视频| 欧美激情网站| 色菇凉天天综合网| 蜜桃免费在线视频| 精品国产三区在线| 精品国产制服丝袜高跟| 星空大象在线观看免费播放| 亚洲人成网77777色在线播放| 亚洲欧美资源在线| 国产aaaaaaaaa| 欧美人成网站| 欧美做受高潮1| 亚洲一级av毛片| 国产精品白丝jk黑袜喷水| 成人欧美一区二区三区视频xxx| 欧美 中文字幕| 久久久国产一区二区三区四区小说| 日韩电影免费网站| 538prom精品视频线放| 色哟哟免费视频| 欧美a大片欧美片| 永久免费精品影视网站| 欧美在线视频第一页| 在线观看日韩av电影| 国产mv免费观看入口亚洲| 亚洲一级在线播放| 成人国产视频在线观看| 日本一区二区久久精品| 菠萝蜜视频国产在线播放| 欧美日韩在线免费观看| 国产日韩欧美久久| 牛牛精品成人免费视频| 在线成人激情视频| 国产真实的和子乱拍在线观看| 久久美女性网| 国产精品久久久久免费| 第一页在线观看| 亚洲国产日日夜夜| 亚洲欧洲日本精品| 大奶一区二区三区| www日韩欧美| 久久久久久久久久久影院| 国产在线麻豆精品观看| 欧美日韩国产精品一卡| 欧美aaaxxxx做受视频| 欧美中文字幕一区二区三区亚洲| 中文字幕18页| 久久久久久久久丰满| 欧洲精品在线视频| 亚洲av无码乱码国产麻豆| 中文字幕欧美激情| 日本毛片在线免费观看| 视频欧美一区| 久久天天躁狠狠躁夜夜爽蜜月| 综合网在线观看| 成人免费高清在线观看| 精品国产三级a∨在线| 国产亚洲一区二区手机在线观看 | 91人人澡人人爽| 日韩欧美中文| 国产精品第七影院| 深夜影院在线观看| 亚洲aⅴ怡春院| 国产欧美日韩专区发布| 国产一区二区在线免费播放| 成人18夜夜网深夜福利网| 久久色在线播放| 国产精品无码一区| 国产亚洲成aⅴ人片在线观看| 三上悠亚久久精品| 999精品视频在这里| 久久亚洲一区二区三区四区五区高| 日韩久久久久久久久久| 久久奇米777| 日韩a在线播放| 亚洲性视频大全| 欧美伊久线香蕉线新在线| 日本波多野结衣在线| 亚洲一区二区三区在线看| 中文字幕久久久久久久| 欧美成人午夜| 成人黄色片视频网站| 4438x成人网全国最大| 91精品在线麻豆| 国产女片a归国片aa| 国产一区二区在线观看免费 | 给我看免费高清在线观看| 99国产精品久久久久久久| 成人欧美一区二区| sm性调教片在线观看| 精品成人一区二区| 日韩精品人妻中文字幕| 久久综合色天天久久综合图片| 欧美色图另类小说| av资源久久| 国产精品专区一| 哥也色在线视频| 精品日韩一区二区| 日本中文字幕网| 91美女在线视频| 国产又猛又黄的视频| 欧美国产美女| 懂色中文一区二区三区在线视频| 成年人视频免费在线播放| 日韩av网站电影| 一级一片免费看| 最新国产成人在线观看| 曰本三级日本三级日本三级| 在线日韩欧美| 青青成人在线| 国产日韩在线观看视频| 久久久久久久久久亚洲| 国产在线观看网站| av不卡一区二区三区| 制服.丝袜.亚洲.中文.综合| 国产成人精品无码免费看夜聊软件| 日韩高清不卡一区二区| 麻豆传媒网站在线观看| 欧美成人午夜77777| 国产精品白嫩美女在线观看| 4438x成人网全国最大| 日韩精品在线看| 国产精品视频久久久久久| 欧美日韩国产影院| 亚洲精品卡一卡二| 91美女蜜桃在线| 中文字幕日韩久久| 久久欧美肥婆一二区| 黑人巨大国产9丨视频| 日韩电影在线观看完整免费观看| 国产精品欧美一区二区三区奶水| 秋霞在线视频| 中文字幕亚洲字幕| 日韩一区免费视频| 欧美区在线观看| 国产成人亚洲精品自产在线 | 亚洲一区网站| 色香蕉在线观看| 亚洲免费专区| 亚洲mm色国产网站| 日韩av一级| 97久久精品视频| 爆操欧美美女| 一个人看的www久久| 高清乱码毛片入口| 欧美精品 国产精品| 亚洲 欧美 成人| 亚洲国产精品久久不卡毛片| 亚洲少妇xxx| 久久久久久免费毛片精品| 美女露出粉嫩尿囗让男人桶| 美女视频一区二区| 国模杨依粉嫩蝴蝶150p| 伊人久久亚洲热| 四虎4hu永久免费入口| 第一会所亚洲原创| 欧美日韩免费精品| 极品束缚调教一区二区网站 | 亚洲精品成人电影| 在线播放视频一区| 又污又黄的网站| 色婷婷综合久久久中文字幕| 国产毛片aaa| 黄色精品在线看| 久久精品人妻一区二区三区| 亚洲免费av高清| 五月天激情丁香| 中文字幕亚洲综合久久菠萝蜜| 日韩欧美第一页| 国产农村妇女精品一区| 久久久亚洲午夜电影| 黄色性生活一级片| 26uuu精品一区二区| 在线观看免费视频黄| 丰满放荡岳乱妇91ww| 搡的我好爽在线观看免费视频| 久久www免费人成看片高清| xxxx一级片| 美女视频黄免费的久久| 国产精品99久久免费黑人人妻| 国产精品婷婷| 欧美日韩中文在线视频| 国产亚洲精品v| 久久久999免费视频| 亚洲理伦在线| 丝袜老师办公室里做好紧好爽| 性8sex亚洲区入口| 国产无套粉嫩白浆内谢的出处| 久久亚洲风情| 精品亚洲一区二区三区四区| 久久69国产一区二区蜜臀| 91高清国产视频| 国产在线播精品第三| 欧美色图校园春色| 成人黄色在线视频| jizz欧美性20| 欧美国产日韩一二三区| 亚洲女人久久久| 亚洲精品老司机| 天天插天天操天天干| 欧美性猛交xxx| 在线免费观看一级片| 91精品国产综合久久精品| 亚洲精品视频网| 亚洲欧美日韩中文视频| av网站在线免费播放| 久久综合免费视频影院| av电影在线免费| 国产精品成人一区二区三区吃奶| 看片一区二区| 国产伦精品一区二区三区| 牲欧美videos精品| 一本一本久久a久久精品综合妖精| 婷婷综合五月| 国产精品专区在线| 日韩 欧美一区二区三区| 亚洲一区二区福利视频| 成人性生交大片免费看视频在线| 90岁老太婆乱淫| 亚洲欧美韩国综合色| 国产成人精品a视频一区| 欧亚一区二区三区| 粉嫩av一区二区夜夜嗨| 一区二区福利视频| 日本性爱视频在线观看| 国产精品aaa| 成人自拍在线| 视频二区一区| 亚洲巨乳在线| 欧美第一页在线| 国产视频www| 亚洲老头老太hd| av免费在线免费| 国产成人精品一区| 中文一区二区三区四区| 日韩av电影免费播放| 好吊日精品视频| 在线免费av播放| 99久久国产综合精品麻豆| 日韩在线一卡二卡| 色噜噜狠狠一区二区三区果冻| а√天堂资源在线| 神马国产精品影院av| 亚洲精品动漫| 国产精品yjizz| 久久精品亚洲人成影院| 青青草av网站| 91免费国产视频网站| 久久久久人妻一区精品色欧美| 欧美亚洲国产一区在线观看网站 | 东方欧美亚洲色图在线| 黄色一级片一级片| 在线观看一区日韩| 香蕉视频黄在线观看| 欧美激情在线观看| 欧美三级一区| 亚洲一区二区自拍偷拍| 久久精品官网| 国产三级国产精品| 天天操天天干天天综合网| 俄罗斯嫩小性bbwbbw| 欧美成人精品一区二区| 美女久久久久久| 亚洲人成人77777线观看| 久久国产主播| 久久精品一区二区免费播放| 一区二区三区视频在线看| 国产精品毛片久久久久久久av| 一区二区三区在线播放欧美| 天天免费亚洲黑人免费| 蜜桃精品久久久久久久免费影院| 亚洲韩日在线| 李丽珍裸体午夜理伦片| 亚洲夂夂婷婷色拍ww47| 成人av手机在线| 欧美高清一级大片| 视频二区欧美| 97超碰在线人人| 成人精品亚洲人成在线| 久久中文字幕在线观看| 欧美r级电影在线观看| 蜜桃传媒在线观看免费进入| 成人在线视频网址| 影音先锋日韩资源| 中文字幕在线视频播放| 午夜久久久久久| 天堂影院在线| 91av在线免费观看| 欧美人妖在线| 国产免费又粗又猛又爽| 国产精品高潮呻吟| 国产精品伦理一区| 久久久久久中文| 日本福利一区| 亚洲免费av一区二区三区| 欧美国产精品劲爆| 国产情侣激情自拍| 欧美激情一区二区三区高清视频 | 成人免费视屏| 亚洲一区二区三区在线免费观看| 欧美女人交a| 插吧插吧综合网| 欧美自拍偷拍午夜视频| 日本美女在线中文版| 亚洲影视九九影院在线观看| 1000部精品久久久久久久久| xxx在线播放| 在线不卡中文字幕| heyzo在线欧美播放| 久久久影院一区二区三区| 秋霞影院一区二区| 欧美人与禽zozzo禽性配| 日韩精品福利在线| 国产一区二区三区四区五区3d| 精品国产无码在线| 不卡一区二区在线| 免费看av在线| 欧美日韩国产成人在线| 蜜臀av免费一区二区三区| 午夜精品久久久久久久99热影院| 亚洲影视在线播放| 国产黄在线看| aa日韩免费精品视频一| 久久婷婷久久| 欧美成人综合色| 亚洲人成网站999久久久综合| 中文字幕日本一区| av7777777| 亚洲视频一区在线| 日本一区视频| 91入口在线观看| 美女网站色91| 在线能看的av| 久热精品视频在线| 国产一区二区三区四区大秀| 91超薄肉色丝袜交足高跟凉鞋|