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

Redis中8種數據結構的底層數據結構源碼詳解

存儲 存儲軟件 Redis
Redis中的Key與Value在表層都是一個redisObject實例, 所以該結構有所謂的"類型", 即是ValueType. 對于每一種Value Type類型的redisObject;其底層至少支持兩種不同的底層數據結構來實現. 以應對在不同的應用場景中, Redis的運行效率, 或內存占用等。

[[280565]]

 redis存儲類型

主要提供了5種數據結構:字符串(String)、哈希(hash)、列表(list)、集合(set)、有序集合(short set);

redis底層實現的8種數據結構

  1. SDS simple synamic string:支持自動動態擴容的字節數組 
  2. list :鏈表 
  3. dict :使用雙哈希表實現的, 支持平滑擴容的字典 
  4. zskiplist :附加了后向指針的跳躍表 
  5. intset : 用于存儲整數數值集合的自有結構 
  6. ziplist :一種實現上類似于TLV, 但比TLV復雜的, 用于存儲任意數據的有序序列的數據結構 
  7. quicklist:一種以ziplist作為結點的雙鏈表結構, 實現的非常不錯 
  8. zipmap : 一種用于在小規模場合使用的輕量級字典結構 

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

其中5種存儲類型與8種數據結構的橋梁, 是redisObject;

Redis中的Key與Value在表層都是一個redisObject實例, 所以該結構有所謂的"類型", 即是ValueType. 對于每一種Value Type類型的redisObject;

其底層至少支持兩種不同的底層數據結構來實現. 以應對在不同的應用場景中, Redis的運行效率, 或內存占用等

底層數據結構分析

1、SDS - simple dynamic string

可以在安裝目錄的src文件夾下看到sds.c和sds.h的源碼文件

 

原創:redis中8種數據結構的底層數據結構源碼詳解
  1. typedef char *sds; 
  2.   
  3. /* Note: sdshdr5 is never used, we just access the flags byte directly. 
  4.  * However is here to document the layout of type 5 SDS strings. */ 
  5. struct __attribute__ ((__packed__)) sdshdr5 { 
  6.  unsigned char flags; /* 3 lsb of type, and 5 msb of string length */ 
  7.  char buf[]; 
  8. }; 
  9. struct __attribute__ ((__packed__)) sdshdr8 { 
  10.  uint8_t len; /* used */ 
  11.  uint8_t alloc; /* excluding the header and null terminator */ 
  12.  unsigned char flags; /* 3 lsb of type, 5 unused bits */ 
  13.  char buf[]; 
  14. }; 
  15. struct __attribute__ ((__packed__)) sdshdr16 { 
  16.  uint16_t len; /* used */ 
  17.  uint16_t alloc; /* excluding the header and null terminator */ 
  18.  unsigned char flags; /* 3 lsb of type, 5 unused bits */ 
  19.  char buf[]; 
  20. }; 
  21. struct __attribute__ ((__packed__)) sdshdr32 { 
  22.  uint32_t len; /* used */ 
  23.  uint32_t alloc; /* excluding the header and null terminator */ 
  24.  unsigned char flags; /* 3 lsb of type, 5 unused bits */ 
  25.  char buf[]; 
  26. }; 
  27. struct __attribute__ ((__packed__)) sdshdr64 { 
  28.  uint64_t len; /* used */ 
  29.  uint64_t alloc; /* excluding the header and null terminator */ 
  30.  unsigned char flags; /* 3 lsb of type, 5 unused bits */ 
  31.  char buf[]; 
  32. };s 

sdshdr的存儲結構

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

sdshdr是頭部, buf是真實存儲用戶數據的地方.(buf="數據" + "\0" );sds有四種不同的頭部. sdshdr5未 使用,未顯示

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

en分別以uint8, uint16, uint32, uint64表示用戶數據的長度(不包括末尾的\0)

alloc分別以uint8, uint16, uint32, uint64表示整個SDS, 除過頭部與末尾的\0, 剩余的字節數.

flag始終為一字節, 以低三位標示著頭部的類型, 高5位未使用.

創建一個SDS實例的三個接口

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

2、list

鏈表實現, 鏈表結點不直接持有數據, 而是通過void *指針來間接的指向數據. 其實現位于 src/adlist.h與src/adlist.c中,

內存布局

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

list在Redis除了作為一些Value Type的底層實現外, 還廣泛用于Redis的其它功能實現中, 作為一種數據結構工具使用.

在list的實現中, 除了基本的鏈表定義外, 還額外增加了:迭代器listIter的定義, 與相關接口的實現.

由于list中的鏈表結點本身并不直接持有數據, 而是通過value字段, 以void *指針的形式間接持有, 所以數據的生命周期并不完全與鏈表及其結點一致. 這給了list的使用者相當大的靈活性. 比如可以多個結點持有同一份數據的地址. 但與此同時, 在對鏈表進行銷毀, 結點復制以及查找匹配時, 就需要list的使用者將相關的函數指針賦值于list.dup, list.free, list.match字段.

3、dict

dict類似于C++標準庫中的std::unordered_map, 其實現位于 src/dict.h 與 src/dict.c中

dict中存儲的鍵值對, 是通過dictEntry這個結構間接持有的, k通過指針間接持有鍵, v通過指針間接持有值. 注意, 若值是整數值的話, 是直接存儲在v字段中的, 而不是間接持有. 同時next指針用于指向, 在bucket索引值沖突時, 以鏈式方式解決沖突, 指向同索引的下一個dictEntry結構.

dict即為字典. 其中type字段中存儲的是本字典使用到的各種函數指針, 包括散列函數, 鍵與值的復制函數, 釋放函數, 以及鍵的比較函數. privdata是用于存儲用戶自定義數據. 這樣, 字典的使用者可以最大化的自定義字典的實現, 通過自定義各種函數實現, 以及可以附帶私有數據, 保證了字典有很大的調優空間.

字典為了支持平滑擴容, 定義了ht[2]這個數組字段. 其用意是這樣的:

一般情況下, 字典dict僅持有一個哈希表dictht的實例, 即整個字典由一個bucket實現.

隨著插入操作, bucket中出現沖突的概率會越來越大, 當字典中存儲的結點數目, 與bucket數組長度的比值達到一個閾值(1:1)時, 字典為了緩解性能下降, 就需要擴容

擴容的操作是平滑的, 即在擴容時, 字典會持有兩個dictht的實例, ht[0]指向舊哈希表, ht[1]指向擴容后的新哈希表.

內存布局

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

4、zskiplist

zskiplist是Redis實現的一種特殊的跳躍表. 跳躍表是一種基于線性表實現簡單的搜索結構, 其最大的特點就是: 實現簡單, 性能能逼近各種搜索樹結構.

zskiplist的核心設計要點:

頭結點不持有任何數據, 且其level[]的長度為32

每個結點, 除了持有數據的ele字段, 還有一個字段score, 其標示著結點的得分, 結點之間憑借得分來判斷先后順序, 跳躍表中的結點按結點的得分升序排列.

每個結點持有一個backward指針, 這是原版跳躍表中所沒有的. 該指針指向結點的前一個緊鄰結點.

每個結點中最多持有32個zskiplistLevel結構. 實際數量在結點創建時, 按冪次定律隨機生成(不超過32). 每個zskiplistLevel中有兩個字段.

內存布局

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

5、intset

用于存儲在序的整數的數據結構, 也底層數據結構中最簡單的一個, 其定義與實現在src/intest.h與src/intset.c中

inset結構中的encoding的取值有三個, 分別是宏INTSET_ENC_INT16, INTSET_ENC_INT32, INTSET_ENC_INT64. length代表其中存儲的整數的個數, contents指向實際存儲數值的連續內存區域

內存布局

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

intset中各字段, 包括contents中存儲的數值, 都是以主機序(小端字節序)存儲的. 這意味著Redis若運行在PPC這樣的大端字節序的機器上時, 存取數據都會有額外的字節序轉換開銷

當encoding == INTSET_ENC_INT16時, contents中以int16_t的形式存儲著數值. 類似的, 當encoding == INTSET_ENC_INT32時, contents中以int32_t的形式存儲著數值.

但凡有一個數值元素的值超過了int32_t的取值范圍, 整個intset都要進行升級, 即所有的數值都需要以int64_t的形式存儲. 顯然升級的開銷是很大的.

intset中的數值是以升序排列存儲的, 插入與刪除的復雜度均為O(n). 查找使用二分法, 復雜度為O(log_2(n))

intset的代碼實現中, 不預留空間, 即每一次插入操作都會調用zrealloc接口重新分配內存. 每一次刪除也會調用zrealloc接口縮減占用的內存. 省是省了, 但內存操作的時間開銷上升了.

intset的編碼方式一經升級, 不會再降級.

總之, intset適合于如下數據的存儲:

所有數據都位于一個穩定的取值范圍中. 比如均位于int16_t或int32_t的取值范圍中

數據穩定, 插入刪除操作不頻繁. 能接受O(lgn)級別的查找開銷

6、ziplist

ziplist是Redis底層數據結構中, 最茍的一個結構. 它的設計宗旨就是: 省內存, 從牙縫里省內存. 設計思路和TLV一致, 但為了從牙縫里節省內存, 做了很多額外工作.

ziplist的內存布局與intset一樣: 就是一塊連續的內存空間. 但區域劃分比較復雜

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

和intset一樣, ziplist中的所有值都是以小端序存儲的

zlbytes字段的類型是uint32_t, 這個字段中存儲的是整個ziplist所占用的內存的字節數

zltail字段的類型是uint32_t, 它指的是ziplist中最后一個entry的偏移量. 用于快速定位最后一個entry, 以快速完成pop等操作

zllen字段的類型是uint16_t, 它指的是整個ziplit中entry的數量. 這個值只占16位, 所以蛋疼的地方就來了: 如果ziplist中entry的數目小于65535, 那么該字段中存儲的就是實際entry的值. 若等于或超過65535, 那么該字段的值固定為65535, 但實際數量需要一個個entry的去遍歷所有entry才能得到.

zlend是一個終止字節, 其值為全F, 即0xff. ziplist保證任何情況下, 一個entry的首字節都不會是255

在畫圖展示entry的內存布局之前, 先講一下entry中都存儲了哪些信息:

每個entry中存儲了它前一個entry所占用的字節數. 這樣支持ziplist反向遍歷.

每個entry用單獨的一塊區域, 存儲著當前結點的類型: 所謂的類型, 包括當前結點存儲的數據是什么(二進制, 還是數值), 如何編碼(如果是數值, 數值如何存儲, 如果是二進制數據, 二進制數據的長度)最后就是真實的數據了

7、quicklist

如果說ziplist是整個Redis中為了節省內存, 而寫的最茍的數據結構, 那么稱quicklist就是在最茍的基礎上, 再茍了一層. 這個結構是Redis在3.2版本后新加的, 在3.2版本之前, 我們可以講, dict是最復雜的底層數據結構, ziplist是最茍的底層數據結構. 在3.2版本之后, 這兩個記錄被雙雙刷新了.

這是一種, 以ziplist為結點的, 雙端鏈表結構. 宏觀上, quicklist是一個鏈表, 微觀上, 鏈表中的每個結點都是一個ziplist.

它的定義與實現分別在src/quicklist.h與src/quicklist.c中

這里定義了五個結構體:

quicklistNode, 宏觀上, quicklist是一個鏈表, 這個結構描述的就是鏈表中的結點. 它通過zl字段持有底層的ziplist. 簡單來講, 它描述了一個ziplist實例

quicklistLZF, ziplist是一段連續的內存, 用LZ4算法壓縮后, 就可以包裝成一個quicklistLZF結構. 是否壓縮quicklist中的每個ziplist實例是一個可配置項. 若這個配置項是開啟的, 那么quicklistNode.zl字段指向的就不是一個ziplist實例, 而是一個壓縮后的quicklistLZF實例

quicklist. 這就是一個雙鏈表的定義. head, tail分別指向頭尾指針. len代表鏈表中的結點. count指的是整個quicklist中的所有ziplist中的entry的數目. fill字段影響著每個鏈表結點中ziplist的最大占用空間, compress影響著是否要對每個ziplist以LZ4算法進行進一步壓縮以更節省內存空間.

quicklistIter是一個迭代器

quicklistEntry是對ziplist中的entry概念的封裝. quicklist作為一個封裝良好的數據結構, 不希望使用者感知到其內部的實現, 所以需要把ziplist.entry的概念重新包裝一下.

quicklist的內存布局圖如下所示:

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

下面是有關quicklist的更多額外信息:

quicklist.fill的值影響著每個鏈表結點中, ziplist的長度.

當數值為負數時, 代表以字節數限制單個ziplist的最大長度. 具體為:

-1 不超過4kb

-2 不超過 8kb

-3 不超過 16kb

-4 不超過 32kb

-5 不超過 64kb

當數值為正數時, 代表以entry數目限制單個ziplist的長度. 值即為數目. 由于該字段僅占16位, 所以以entry數目限制ziplist的容量時, 最大值為2^15個

quicklist.compress的值影響著quicklistNode.zl字段指向的是原生的ziplist, 還是經過壓縮包裝后的quicklistLZF

0 表示不壓縮, zl字段直接指向ziplist

1 表示quicklist的鏈表頭尾結點不壓縮, 其余結點的zl字段指向的是經過壓縮后的quicklistLZF

2 表示quicklist的鏈表頭兩個, 與末兩個結點不壓縮, 其余結點的zl字段指向的是經過壓縮后的quicklistLZF

以此類推, 最大值為2^16

quicklistNode.encoding字段, 以指示本鏈表結點所持有的ziplist是否經過了壓縮. 1代表未壓縮, 持有的是原生的ziplist, 2代表壓縮過

quicklistNode.container字段指示的是每個鏈表結點所持有的數據類型是什么. 默認的實現是ziplist, 對應的該字段的值是2, 目前Redis沒有提供其它實現. 所以實際上, 該字段的值恒為2

quicklistNode.recompress字段指示的是當前結點所持有的ziplist是否經過了解壓. 如果該字段為1即代表之前被解壓過, 且需要在下一次操作時重新壓縮.

quicklist的具體實現代碼篇幅很長, 這里就不貼代碼片斷了, 從內存布局上也能看出來, 由于每個結點持有的ziplist是有上限長度的, 所以在與操作時要考慮的分支情況比較多. 想想都蛋疼.

quicklist有自己的優點, 也有缺點, 對于使用者來說, 其使用體驗類似于線性數據結構, list作為最傳統的雙鏈表, 結點通過指針持有數據, 指針字段會耗費大量內存. ziplist解決了耗費內存這個問題. 但引入了新的問題: 每次寫操作整個ziplist的內存都需要重分配. quicklist在兩者之間做了一個平衡. 并且使用者可以通過自定義quicklist.fill, 根據實際業務情況, 經驗主義調參.

8、zipmap

dict作為字典結構, 優點很多, 擴展性強悍, 支持平滑擴容等等, 但對于字典中的鍵值均為二進制數據, 且長度都很小時, dict的中的一坨指針會浪費不少內存, 因此Redis又實現了一個輕量級的字典, 即為zipmap.

zipmap適合使用的場合是:

鍵值對量不大, 單個鍵, 單個值長度小

鍵值均是二進制數據, 而不是復合結構或復雜結構. dict支持各種嵌套, 字典本身并不持有數據, 而僅持有數據的指針. 但zipmap是直接持有數據的.

zipmap的定義與實現在src/zipmap.h與src/zipmap.c兩個文件中, 其定義與實現均未定義任何struct結構體, 因為zipmap的內存布局就是一塊連續的內存空間. 其內存布局如下所示:

 

原創:redis中8種數據結構的底層數據結構源碼詳解

 

zipmap起始的第一個字節存儲的是zipmap中鍵值對的個數. 如果鍵值對的個數大于254的話, 那么這個字節的值就是固定值254, 真實的鍵值對個數需要遍歷才能獲得.

zipmap的最后一個字節是固定值0xFF

zipmap中的每一個鍵值對, 稱為一個entry, 其內存占用如上圖, 分別六部分:

len_of_key, 一字節或五字節. 存儲的是鍵的二進制長度. 如果長度小于254, 則用1字節存儲, 否則用五個字節存儲, 第一個字節的值固定為0xFE, 后四個字節以小端序uint32_t類型存儲著鍵的二進制長度.

key_data為鍵的數據

len_of_val, 一字節或五字節, 存儲的是值的二進制長度. 編碼方式同len_of_key

len_of_free, 固定值1字節, 存儲的是entry中未使用的空間的字節數. 未使用的空間即為圖中的free, 它一般是由于鍵值對中的值被替換發生的. 比如, 鍵值對hello <-> word被修改為hello <-> w后, 就空了四個字節的閑置空間

val_data, 為值的數據

free, 為閑置空間. 由于len_of_free的值最大只能是254, 所以如果值的變更導致閑置空間大于254的話, zipmap就會回收內存空間.

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2019-04-17 15:35:37

Redis數據庫數據結構

2023-09-15 08:14:48

HashMap負載因子

2023-03-06 08:40:43

RedisListJava

2025-01-13 06:10:00

2025-05-13 08:05:00

Redis數據類型數據庫

2022-05-23 08:19:19

Redis數據結構內存

2023-04-11 08:00:56

Redis類型編碼

2023-04-28 08:53:09

2023-06-08 07:25:56

數據庫索引數據結構

2019-06-12 22:51:57

Redis軟件開發

2020-06-29 07:44:36

Redis

2025-01-15 12:20:41

2025-01-14 08:00:00

RedisList數據結構

2021-08-29 07:41:48

數據HashMap底層

2023-01-09 08:42:04

String數據類型

2023-11-12 21:49:10

Redis數據庫

2013-11-18 14:23:14

Json數據結構

2023-09-06 13:16:00

數據庫數據

2020-03-20 10:47:51

Redis數據庫字符串

2021-08-31 07:36:22

LinkedListAndroid數據結構
點贊
收藏

51CTO技術棧公眾號

欧美国产日韩精品| 欧美精品久久99久久在免费线 | 亚洲精品一区二区三区影院 | 欧美美女性生活视频| 国产精品久久久久久妇女| 亚洲品质自拍视频| 精品日产一区2区三区黄免费| 狠狠人妻久久久久久综合| 日韩毛片视频| 欧美精品一区二区在线观看| 日韩免费高清在线| 香蕉久久aⅴ一区二区三区| av一区二区不卡| 国产精品普通话| 久久婷婷一区二区| 精品视频免费在线观看| 欧美va天堂va视频va在线| 人妻内射一区二区在线视频 | 91丨porny丨在线中文| 国产一区亚洲| 亚洲最新中文字幕| www.啪啪.com| 久久精品97| 欧美日韩国产精品一区二区三区四区| 亚洲图片欧洲图片日韩av| 人妻少妇精品无码专区| 久久 天天综合| 欧美一级高清免费| 欧美日韩激情在线观看| 成人在线国产| 精品视频偷偷看在线观看| 在线免费看v片| 日韩电影大全网站| 亚洲国产精品久久人人爱蜜臀 | 国产三级视频在线| 国产91精品在线观看| 国产精品视频在线播放| 久热这里只有精品6| 欧美91精品| 日韩中文视频免费在线观看| 永久免费看mv网站入口78| 成人av动漫| 日韩一级二级三级精品视频| 美女在线视频一区二区| 精品91久久| 亚洲电影第三页| 男女h黄动漫啪啪无遮挡软件| 国产天堂素人系列在线视频| 99久久久久久99| 国产欧美一区二区在线播放| 精品久久久无码中文字幕| 捆绑变态av一区二区三区| 国产成人福利网站| 国产原创视频在线| 99精品热视频只有精品10| 欧美激情视频三区| 国产精品三区在线观看| 国产韩日影视精品| 中文字幕在线观看亚洲| 三年中国中文观看免费播放| 国产亚洲欧美日韩在线观看一区二区| 日韩电影中文字幕一区| 国产草草浮力影院| 国产欧美自拍一区| 亚洲福利在线看| 久草视频福利在线| 精品三级av在线导航| 亚洲国产精品中文| 国产精品伦子伦| 神马日本精品| 国产亚洲成精品久久| 日韩免费成人av| 精品久久国产| 久久久97精品| 欧美激情图片小说| 亚洲一级黄色| 日本不卡高字幕在线2019| 亚洲自拍一区在线观看| 日韩av中文字幕一区二区三区 | 国产一区二区| 日韩欧美另类在线| 中国极品少妇videossexhd| 色婷婷av一区二区三区丝袜美腿| 亚洲欧美综合精品久久成人| 黄色片在线观看免费| 亚洲影视一区二区三区| 久久久久久久久电影| 国产精品视频免费播放| 免费观看在线综合| 亚洲字幕一区二区| 天天干视频在线观看| 久久精品视频免费观看| 伊人狠狠色丁香综合尤物| www在线免费观看视频| 亚洲国产精品久久不卡毛片| 国产无套内射久久久国产| 国产第一亚洲| 精品黑人一区二区三区久久 | 牛牛精品成人免费视频| 亚洲欧美中文字幕| 国产av 一区二区三区| 亚洲美女91| 国产精品免费电影| 亚洲精品18在线观看| 久久久久成人黄色影片| 性做爰过程免费播放| 天堂av中文在线观看| 69成人精品免费视频| 99re这里只有| 婷婷综合在线| 91大神在线播放精品| 一二区在线观看| 99精品欧美一区二区三区综合在线| 日韩福利影院| 91美女精品| 欧美二区三区91| 最近中文字幕无免费| 中文字幕一区二区三三| 国产精品成人一区| 亚洲AV无码精品色毛片浪潮| 中文子幕无线码一区tr| 青青草精品视频在线| 国产精品国产三级在线观看| 亚洲一二三在线| 97超碰人人干| 国产精品一品二品| 亚洲国产日韩综合一区| 乡村艳史在线观看| 精品国产一区a| 91高清免费看| 久久精品国产77777蜜臀| 欧美lavv| 啊啊啊久久久| 欧美r级电影在线观看| 美女网站视频色| 久久国产精品久久w女人spa| 国产在线资源一区| 欧美理论片在线播放| 欧美精品久久久久久久久老牛影院 | 免费中文字幕视频| 精品亚洲成a人在线观看| 日本一区免费观看| 最新中文字幕在线播放| 亚洲国产精品久久91精品| 日本妇女毛茸茸| 精品一区二区在线观看| 欧美一区二区三区精美影视| 亚洲欧洲美洲av| 亚洲精品福利视频| 国产精品成人国产乱| 国产1区2区3区精品美女| 日本丰满大乳奶| 精品国产亚洲一区二区三区在线 | 97免费高清电视剧观看| 成人区精品一区二区不卡| 欧美日韩精品欧美日韩精品一| 国产美女免费网站| 青青草国产精品97视觉盛宴| 日韩欧美一区二区三区四区五区| 成人国产二区| 亚洲日本中文字幕| 精品无码一区二区三区的天堂| 久久青草国产手机看片福利盒子| 国产精品动漫网站| 国产日产一区| 国产精品免费久久久久影院| 日本在线观看视频| 欧美精品欧美精品系列| 疯狂试爱三2浴室激情视频| 国产伦精品一区二区三区在线观看| 色乱码一区二区三区熟女| 国产午夜亚洲精品一级在线| 久久久久国色av免费观看性色| 亚洲爱情岛论坛永久| 亚洲va在线va天堂| www.久久av| 免费观看在线综合色| 黄色影视在线观看| 99精品国产一区二区三区2021| 午夜精品国产精品大乳美女| 欧美zozo| 欧美性色aⅴ视频一区日韩精品| 欧美性生交大片| 国产精品123| 波多野结衣乳巨码无在线| 性人久久久久| 成人精品久久久| 超碰97免费在线| 亚洲人午夜精品| 国产欧美久久久精品免费| 亚洲午夜激情av| 微拍福利一区二区| 国产成人综合在线播放| 欧美三级一级片| 不卡在线一区二区| 91精品在线一区| 欧美xxxhd| www.99久久热国产日韩欧美.com| 风流老熟女一区二区三区| 在线免费观看日韩欧美| 岛国毛片在线观看| 久久久777精品电影网影网| 性生生活大片免费看视频| 亚洲精品日本| 性欧美18一19内谢| 亚洲综合图色| 91久久精品一区二区别| 国产精品迅雷| 欧美疯狂xxxx大交乱88av| 国产女人在线观看| 日韩精品资源二区在线| 国产黄色免费视频| 亚洲一区二区在线免费看| 四季av中文字幕| 91视频一区二区三区| 中文字幕一二三区| 麻豆精品新av中文字幕| 免费看日本毛片| 欧美~级网站不卡| 一区二区三区欧美在线| 欧美日韩一区二区三区不卡视频| 成人国产在线视频| av成人免费看| 日本欧美精品在线| heyzo高清国产精品| 久久影院中文字幕| 91在线导航| 国产香蕉一区二区三区在线视频 | 四虎精品永久在线| 一区二区国产盗摄色噜噜| 国产小视频你懂的| 国产目拍亚洲精品99久久精品| 中文字幕乱码在线| 国产成人精品1024| 99中文字幕在线| 免费成人在线影院| 欧美激情成人网| 一本色道久久综合亚洲精品高清| 欧美a级免费视频| 伊人久久大香线蕉综合四虎小说 | av大片在线看| 亚洲午夜av久久乱码| 青青色在线视频| 日韩久久午夜影院| 欧美 日韩 中文字幕| 欧美xxxxxxxx| www.超碰在线.com| 欧美一二三区在线观看| 91精品在线视频观看| 欧美日韩一级大片网址| 最近中文字幕在线观看视频| 在线视频国内自拍亚洲视频| 91午夜精品亚洲一区二区三区| 大荫蒂欧美视频另类xxxx| 五月婷婷中文字幕| 精品久久久久久| 毛片毛片女人毛片毛片| 欧美日韩亚洲国产一区| 亚洲伊人成人网| 色综合天天狠狠| 久久久久久久久久一级| 欧美午夜电影在线播放| 国产精品自偷自拍| 欧美一区二区三区的| www黄色在线观看| 亚洲国产精品久久久久秋霞蜜臀| 天堂91在线| 一夜七次郎国产精品亚洲| 97在线观看免费观看高清| 日韩亚洲成人av在线| 在线看一级片| 久久久之久亚州精品露出| 亚洲最大网站| 国产精品色视频| 久久免费福利| 精品国产电影| 欧美一区二区三区高清视频| 这里只有精品66| 亚洲无毛电影| 国产极品美女高潮无套久久久| 免费av网站大全久久| 久久久久亚洲av无码麻豆| bt7086福利一区国产| 91在线无精精品白丝| 亚洲精品视频在线| 日韩精品一区二区av| 欧美午夜在线观看| 亚洲大尺度视频| 亚洲男人天堂2019| 黄色在线论坛| 97在线免费观看视频| 成人涩涩视频| 国产伦精品一区二区三区四区免费| 亚洲人成亚洲精品| a级黄色片网站| 99在线精品视频在线观看| xxxx一级片| 成熟亚洲日本毛茸茸凸凹| 国产毛片久久久久久久| 亚洲精品中文字幕在线观看| 天天操天天摸天天干| 欧美酷刑日本凌虐凌虐| 亚洲 小说区 图片区 都市| www.久久色.com| 国内激情视频在线观看| 成人国产精品一区二区| 西野翔中文久久精品国产| 在线观看免费91| 奶水喷射视频一区| 国产无套精品一区二区三区| 欧美激情在线一区二区三区| 久久精品美女视频| 欧美日韩另类一区| 天天躁日日躁狠狠躁伊人| 亚洲精品进入| 亚洲欧洲高清在线| 婷婷在线视频观看| 97国产精品视频| www一区二区三区| 日本一区高清不卡| 日韩视频中文| 91网址在线观看精品| 久久香蕉国产线看观看99| 麻豆疯狂做受xxxx高潮视频| 欧美无人高清视频在线观看| 四虎免费在线观看| 久久精品成人欧美大片| 不卡福利视频| 高清免费日韩| 在线精品视频在线观看高清| 日韩av片网站| 久久久久久久久99精品| 日韩成人免费在线视频| 欧美一级淫片007| 三区四区电影在线观看| 国产成人综合久久| 爽爽窝窝午夜精品一区二区| cao在线观看| 高清在线观看日韩| 亚洲国产美女视频| 欧美日韩国产高清一区| 国产色a在线| 国产精品成av人在线视午夜片| 日韩啪啪网站| 两根大肉大捧一进一出好爽视频| 国产伦精品一区二区三区免费迷| 日本不卡一二区| 欧美片在线播放| 日本最新在线视频| 国产美女精品视频| 99久久夜色精品国产亚洲96 | 97影院秋霞午夜在线观看| 国产日韩欧美视频在线| 成人激情免费视频| 免费涩涩18网站入口| 中文字幕第一页久久| 一区二区视频播放| 丝袜美腿精品国产二区| 欧美综合影院| 麻豆映画在线观看| 国产福利一区二区三区在线视频| 国产波霸爆乳一区二区| 日韩欧美国产一区在线观看| 麻豆蜜桃在线| 久久精品第九区免费观看| 亚洲在线一区| 欧美三级视频网站| 欧美精品日韩精品| 中文字幕在线观看网站| 国产成人看片| 久久久久久亚洲精品杨幂换脸| 中字幕一区二区三区乱码| 欧美三级一区二区| www红色一片_亚洲成a人片在线观看_| 91国产在线免费观看| 在线国产欧美| 精品人妻互换一区二区三区| 色综合久久久久综合99| aaa在线免费观看| 91在线看网站| 一本色道久久综合| 天天干天天操天天拍| 欧美一区在线视频| 91在线超碰| 水蜜桃亚洲精品| 国产精品1024久久| √资源天堂中文在线| 自拍偷拍亚洲精品| 日韩精品中文字幕一区二区| 色综合久久久久无码专区| 中文字幕精品综合| 成 人 黄 色 片 在线播放 | 国产综合色区在线观看| 在线国产伦理一区| 成人国产在线观看| 亚洲手机在线观看| 久久免费国产精品1| 欧美另类69xxxxx| 最新版天堂资源在线| 欧美伊人久久久久久久久影院|