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

面試官問我Redis的數據類型,我回答了8種

數據庫 其他數據庫 Redis
知道 redis 的編碼類型這個概念,并按照源碼級的深度去理解為什么要設置不同的編碼類型,但不會過多展開各種底層數據結構的細節。

面試官:小明呀,redis 有幾種數據結構呀?

小明:8 種

面試官:那你說一下分別是什么?

小明:raw,int,ht,zipmap,linkedlist,ziplist,intset,skiplist,embstr

面試官:額,你在說什么?

小明:在回答你的問題呀,這個問題我可是有過研究的,不會錯的

面試官:好吧,今天的面試先到這里,你回去等通知吧

小明:...

上面發生的對話,到底是面試官有問題,還是小明有問題呢?其實是都有問題的,面試官的提問不準確,小明的回答也不準確。

但可以看出,面試官的水平一般,因為聽到這些名詞并不知道小明說的是 redis 底層的編碼類型,進而錯失了深入挖掘小明技術潛力的機會。而小明也有些自作聰明,忽略了面試官想考察的知識點,把自己最近看的一些皮毛拿出來秀了秀,結果導致了一場誤會。

就著上面這個引子,我們本篇文章就來聊聊,redis 中的數據結構那些事。

redis 源碼選取的版本:3.0.0

本篇文章的目標:知道 redis 的編碼類型這個概念,并按照源碼級的深度去理解為什么要設置不同的編碼類型,但不會過多展開各種底層數據結構的細節

redis 的對象類型與編碼類型

redis 的對象類型,就是面試中常考的 redis 數據類型有哪些 這個問題所問的準確說法,這個對于我們這些只會面試不會開發的程序員來說,簡直再熟悉不過啦,就是字符串、哈希、列表、集合、有序集合,這個在 redis 源碼中能找到準確的定義:

redis.c 

  1. /* Object types */  
  2. #define REDIS_STRING 0  
  3. #define REDIS_LIST 1  
  4. #define REDIS_SET 2  
  5. #define REDIS_ZSET 3  
  6. #define REDIS_HASH 4 

好多人對 redis 數據結構的理解可能就止步于此了,但其實這只是 redis 對外暴露的抽象結構,其底層實現要看其編碼類型來決定使用該編碼類型對應的數據結構。

如果一個對象類型只有一種底層數據結構的實現方式,那么這個編碼類型就完全多余了,早期的 redis 的確沒有這個概念。但后來為了優化性能,一種對象類型可能對應多種不同的編碼實現,于是乎關于 redis 底層數據結構的知識點,就開始復雜起來了。編碼類型在 redis 源碼中也有準確定義:

redis.c 

  1. /* Objects encoding. Some kind of objects like Strings and Hashes can be  
  2.  * internally represented in multiple ways. The 'encoding' field of the object  
  3.  * is set to one of this fields for this object. */  
  4. #define REDIS_ENCODING_RAW 0     /* Raw representation */  
  5. #define REDIS_ENCODING_INT 1     /* Encoded as integer */  
  6. #define REDIS_ENCODING_HT 2      /* Encoded as hash table */  
  7. #define REDIS_ENCODING_ZIPMAP 3  /* Encoded as zipmap */  
  8. #define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */  
  9. #define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */  
  10. #define REDIS_ENCODING_INTSET 6  /* Encoded as intset */  
  11. #define REDIS_ENCODING_SKIPLIST 7  /* Encoded as skiplist */  
  12. #define REDIS_ENCODING_EMBSTR 8  /* Embedded sds string encoding */ 

其實我們不用尋找任何額外的二手資料來解釋編碼類型的作用,直接看源碼中的英文注釋即可。

對象編碼(編碼類型):有些對象類型如字符串、哈希,其內部實現可以有多種方式,一個 redis 對象的 encoding 字段可以設置下面幾個值來表示這個對象的底層編碼類型

同一個對象類型,可以有不同的編碼類型作為底層實現。而同一種編碼類型,也可以支持上層的多種對象類型。他們的關系如下:

redis對象類型與編碼類型

讀到這里你一定有至少三個疑問:

  •  為什么一種對象類型要對應多種編碼類型,是為了解決什問題?
  •  redis 怎么知道什么時候該用這種編碼類型,什么時候該用那種編碼類型呢,并且編碼類型可以隨時改變么?
  •  各種編碼類型的實現原理是什么?(本章不做重點,會貫穿全文介紹一些基本思想,具體的各種實現會在其他篇章專門講解)

別急,這一部分只是讓你知道,redis 面對使用者暴露的只是一個抽象的數據結構,并不代表其底層的具體實現。接下來帶你慢慢深入。

為什么一種對象類型要對應多種編碼類型

寫 redis 的大牛也是程序員,總不能他給自己增加了代碼的復雜性,又對性能提升毫無幫助吧?畢竟 redis 這種中間組件必須以性能來取勝同類產品。沒錯,就是為了 性能提升。

直觀感受編碼類型的不同

首先我們來直觀感受一下同一對象對應不同編碼類型這一場景,這里用到了 object encoding xxx 這個 redis 命令來查看某一個 key 其 value 對象所使用的編碼類型 

  1. 127.0.0.1:6379> set number 100  
  2. OK  
  3. 127.0.0.1:6379> object encoding number  
  4. "int"  
  5. 127.0.0.1:6379> set number "100"  
  6. OK  
  7. 127.0.0.1:6379> object encoding number  
  8. "int"  
  9. 127.0.0.1:6379> set number abc  
  10. OK  
  11. 127.0.0.1:6379> object encoding number  
  12. "embstr"  
  13. 127.0.0.1:6379> set number aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa  
  14. OK  
  15. 127.0.0.1:6379> object encoding number  
  16. "raw"  
  17. 127.0.0.1:6379> set number 9999999999999999999999999  
  18. OK  
  19. 127.0.0.1:6379> object encoding number  
  20. "embstr"  
  21. 127.0.0.1:6379> set number 99999999999999999999999999999999999999999999999999999999999999  
  22. OK  
  23. 127.0.0.1:6379> object encoding number  
  24. "raw" 

我們用我們最常使用的字符串做了測試,觀察到其編碼類型隨著我設置的 value 值不同而改變,我整理了如下表格來表示上面的測試結果

value 編碼類型
100 int
"100" int
abc embstr
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa raw
9999999999999999999999999 embstr
99999999999999999999999999999999999999999 raw

當然,我是因為知道字符串的編碼類型的條件,踩專門選取了這些有代表性的值進行測試,我們可以總結出一個規律

  •  不論是 100 還是 "100",編碼類型都是 int,說明 redis 在判斷是否可以用整數這個編碼類型表示對象的時候,就只是看這個值是否能轉換成一個整數
  •  比較短的字符串 abc 被編碼為 embstr,比較長的字符串 aaaaaaa..a 被編碼為 raw,說明長短字符串的編碼類型不一樣,由此可以猜測 redis 可能是對短的字符串進行了存儲上的優化策略(當然目前只是合理猜測,還有可能是對長字符串進行了某種優化)
  •  整數 999...9 和更長的整數 9999999...9 也都被轉換成了相應的表示字符串的類型,說明可以用整數編碼類型表示的值,是有一定大小限制的

redis 對字符串編碼類型的優化淺析

上面的實驗我們了解到,字符串對象的編碼類型確實有三種:int,raw,embstr。

int 類型分析起來沒什么意思,想想就知道肯定是能用整型存儲的,盡量用整型存儲,一定比字符串方式更節省空間嘛。下面我們分析一下,長字符串和短字符串的編碼類型做了區分,這是為什么呢?

不只是字符串類型,包括哈希、列表這些對象類型,都是用一個統一的結構體 redisObject 來表示的。他的結構如下:

redis.h 

  1. typedef struct redisObject {  
  2.     unsigned type:4; // 對象類型  
  3.     unsigned encoding:4; // 編碼類型  
  4.     void *ptr; // 值的指針  
  5.     ...(省略一些不重要的字段)  
  6. } robj; 

占了 4 位的 type 表示 對象類型(5 種那個),同樣占了 4 位的 encoding 字段表示 編碼類型(8 種那個),指針字段 ptr 表示實際值的 內存地址。

如果該對象的編碼類型為整數(encoding=REDIS_ENCODING_INT),那么這個 ptr 指向的將會是一個 long 類型的變量。

util.c 

  1. if (!string2ll(s,slen,&llval))  
  2.     return 0;  
  3. ...  
  4. *lval = (long)llval;  
  5. return 1; 

object.c 

  1. ...  
  2. o->ptr = (void*) value; 

如果該對象的編碼類型為 raw 或者 embstr,那么這個 ptr 指向的將會是一個 sdshdr 結構的變量

sds.h 

  1. struct sdshdr {  
  2.     unsigned int len; // 字符串長度  
  3.     unsigned int free; // buf空閑數  
  4.     char buf[]; // 字符數組  
  5. }; 

既然都是指向同一個結構,那是怎么優化的呢?那就得進入如下兩個方法具體看看了

object.c 

  1. robj *createStringObject(char *ptr, size_t len) {  
  2.     if (len <= 39)  
  3.         return createEmbeddedStringObject(ptr,len);  
  4.     else  
  5.         return createRawStringObject(ptr,len);  

你看,這段代碼非常清晰,字符串長度 <=39 時,就創建 embstr 類型的字符串對象,否則創建 raw 類型的字符串對象。那么這兩個創建方式的區別,一定就隱藏在這兩個方法里,我們點進去!

embstr 類型 

  1. robj *createEmbeddedStringObject(char *ptr, size_t len) {  
  2.     robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr)+len+1);  
  3.     struct sdshdr *sh = (void*)(o+1);  
  4.     o->type = REDIS_STRING 
  5.     o->encoding = REDIS_ENCODING_EMBSTR 
  6.     o->ptr = sh+1;  
  7.     ... (一些賦值操作)  
  8.     return o;  

raw 類型 

  1. robj *createRawStringObject(char *ptr, size_t len) {  
  2.     return createObject(REDIS_STRING,sdsnewlen(ptr,len));  
  3.  
  4. sds sdsnewlen(const void *init, size_t initlen) { 
  5.     ...  
  6.     struct sdshdr *sh = zmalloc(sizeof(struct sdshdr)+initlen+1);  
  7.     ...  
  8.  
  9. robj *createObject(int type, void *ptr) {  
  10.     robj *o = zmalloc(sizeof(*o));  
  11.     o->typetype = type;  
  12.     o->encoding = REDIS_ENCODING_RAW 
  13.     o->ptrptr = ptr; 
  14.     ...(一些賦值操作)  
  15.     return o;  

對于閱讀源碼比較多的同學,可能立刻就察覺到了他們的區別。其實很簡單,就是 raw 類型這種方式,為 redisObject 和 sdshdr 結構分別申請了內存空間,而 embstr 只申請了一次內存空間,然后將這兩個結構緊挨著放。除此之外沒有其他任何區別了。直觀圖如下:

看到這,一切就都解釋通了,非常簡單,就只是申請內存這一步的區別而已。但對于我們這些什么簡單的事情都要包裝成高端大氣話術的程序員來說,還是要想辦法裝一下,我們總結出使用 embstr 編碼相比于 raw 編碼的好處:

  •  embstr 只申請了一次內存,而 raw 需要申請兩次,因此節約了一次申請內存的消耗
  •  釋放 embstr 只需要釋放一次內存,而 raw 需要兩次,因此節約了一次釋放內存的消耗
  •  embstr 的 redisObject 和 sdshdr 放在一塊連續的內存里,因此更能利用 緩存 帶來的優勢

怎么樣,源碼級的理解,加上迷倒面試官的總結話術,夠意思吧。

不同編碼類型的條件

上個部分我們通過字符串,觀察了不同的編碼類型,也理解了為什么要有不同的編碼類型的實現。接下來我們總結下其他的對象與編碼類型,原理就不深入源碼分析了,和字符串的基本思想是一樣的。

字符串的編碼類型

  •  int:8 個字節的長整型
  •  embstr:小于等于 39 字節的字符串
  •  raw:大于 39 字節的字符串

哈希的編碼類型

  •  ziplist:元素個數小于 512,且所有值都小于 64 字節
  •  hashtable:除上述條件外

列表的編碼類型

  •  ziplist:元素個數小于 512,且所有值都小于 64 字節
  •  hashtable:除上述條件外

集合的編碼類型

  •  intset:元素個數小于 512,且所有值都是整數
  •  hashtable:除上述條件外

有序集合的編碼類型

  •  ziplist:元素個數小于 128,且所有值都小于 64 字節
  •  hashtable:除上述條件外

由于不展開講解,純記憶的東西我覺得用最干凈的辦法描述給大家即可,無多余部分。具體數據結構的細節,我會用其他文章來講解。

此時,經過一番修煉的小明,再次遇到了一位專業的面試官

專業的面試官:小明呀,redis 有幾種數據結...

進化的小明:面試官面試官,你這個問題分兩種情況,redis 的對象類型,也就是我們常說的對外暴露的數據類型,有 5 種,分別是.... 底層對應的編碼類型,在 3.0.0 源碼中有 8 種,分別是....

專業的面試官:誰讓你搶答了?

進化的小明:...

專業的面試官:行了,今天的面試先到這里,你回去等通知吧

進化的小明:... 

 

責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2021-12-02 08:19:06

MVCC面試數據庫

2022-04-10 18:10:24

CURD鏈表

2022-04-19 07:31:28

事務隔離機制數據庫

2020-04-16 08:22:11

HTTPS加解密協議

2019-08-12 15:40:26

Redis數據庫數據類型

2019-08-23 09:20:35

Spring 5編程Java

2021-02-25 07:08:30

JavaScript 前端面試題

2024-04-10 09:47:59

Java調度虛擬線程

2021-11-24 10:10:32

axios前端攔截器

2021-05-27 07:14:52

ZooKeeper節點類型

2020-12-03 07:39:50

HashMap底層數據

2021-03-24 10:25:24

優化VUE性能

2020-07-02 07:52:11

RedisHash映射

2022-05-24 08:03:28

InnoDBMySQL數據

2021-05-08 07:53:33

面試線程池系統

2024-11-14 09:29:38

2021-10-25 08:49:32

索引數據庫MySQL

2021-04-01 08:12:20

zookeeper集群源碼

2021-12-06 08:30:49

SpringSpring Bean面試題

2021-05-20 08:54:16

Go面向對象
點贊
收藏

51CTO技術棧公眾號

亚洲网址你懂得| 一本色道久久加勒比精品| 91网免费观看| 亚洲国产成人无码av在线| 精品香蕉视频| 日韩久久久精品| 午夜精品久久久内射近拍高清| chinese偷拍一区二区三区| 国产最新精品精品你懂的| 韩国国内大量揄拍精品视频| 久久久久久成人网| silk一区二区三区精品视频| 欧洲另类一二三四区| 国产青草视频在线观看| 久草在线免费福利资源| 韩国理伦片一区二区三区在线播放| 欧美激情中文字幕在线| 69xxx免费| 大伊香蕉精品在线品播放| 欧美在线|欧美| 成年人午夜视频在线观看| 午夜在线视频| 久久久久国产精品麻豆ai换脸 | 中文字幕亚洲一区二区三区五十路| 亚洲三级在线视频| 色综合一本到久久亚洲91| 一区二区免费在线| 一本一道久久a久久精品综合 | 中文字幕av一区中文字幕天堂| 深夜视频在线观看| 久久亚洲人体| 在线观看免费视频综合| 欧美在线一区视频| 在线网址91| 中文欧美字幕免费| 欧美连裤袜在线视频| 手机在线观看免费av| 国产久卡久卡久卡久卡视频精品| 国产成人亚洲综合91精品| 日本三级理论片| 欧美日韩国产欧| 欧美老肥婆性猛交视频| 国产在线观看免费视频软件| 欧美亚洲精品在线| 亚洲欧美激情在线视频| 国产毛片毛片毛片毛片毛片毛片| 亚洲精品在线播放| 日韩一区二区免费在线观看| 男生操女生视频在线观看| jizz久久久久久| 欧美视频三区在线播放| 免费在线观看的毛片| 免费成人直播| 色婷婷综合激情| 国产又大又黄又粗的视频| 欧美理论影院| 在线观看区一区二| 三级在线视频观看| yw.尤物在线精品视频| 欧美性videosxxxxx| 久草福利视频在线| 91精品店在线| 欧美日韩精品三区| 日韩av片免费观看| 精品视频一区二区三区在线观看| 欧美精品18+| 手机在线播放av| jazzjazz国产精品麻豆| 亚洲精品一区二区三区四区高清| 9.1在线观看免费| 欧美调教网站| 亚洲视频一区二区三区| 国产成人一区二区在线观看| 成人综合专区| 大胆人体色综合| 九九九国产视频| 国产欧美日韩一级| 国产精品久久久久久久9999| 91福利免费视频| 国产99久久久精品| 欧美精品欧美精品| 国产精品99999| 中文字幕一区二区三区在线播放| 日本高清xxxx| 涩涩涩在线视频| 在线观看视频欧美| 日本网站在线看| 欧美xxxx在线| 日韩中文娱乐网| 精品无码m3u8在线观看| 久久不射2019中文字幕| 国产有码在线一区二区视频| 农村少妇久久久久久久| 97精品视频在线观看自产线路二| 精品国产一区二区三区麻豆免费观看完整版 | 嫩草影视亚洲| 麻豆国产va免费精品高清在线| 国产一级淫片免费| 日本va欧美va欧美va精品| 99中文字幕| www在线播放| 亚洲永久免费视频| 亚洲 欧美 另类人妖| 一区视频网站| 中文字幕成人在线| 国产大片aaa| 久久99精品一区二区三区三区| 国产精品免费观看高清| av影片在线看| 疯狂欧美牲乱大交777| 最新国产黄色网址| 一道本一区二区三区| 精品少妇一区二区30p| 五月婷婷六月婷婷| av电影在线观看一区| 中文字幕中文字幕在线中心一区 | 欧美视频精品一区| 在线播放黄色av| 成人黄色av| 欧美性受xxxx白人性爽| www.久久综合| 国产精品久久福利| 国产三区在线视频| av在线亚洲色图| 欧美巨乳在线观看| 国产精品色综合| 欧美经典一区二区| 成人免费在线小视频| 亚洲国产视频二区| 久久精品国产欧美激情| 中文字幕免费高清网站| 91免费看片在线观看| 福利在线小视频| 久久精品超碰| 色噜噜狠狠色综合网图区 | 超黄网站在线观看| 日韩久久久精品| 一区二区在线观看免费视频| 久久99精品网久久| 亚洲v日韩v欧美v综合| 精品国产第一福利网站| 日韩av在线高清| 日本熟妇毛茸茸丰满| 国产盗摄女厕一区二区三区| a级黄色片网站| 99久热在线精品视频观看| 最近更新的2019中文字幕| 亚洲av无码乱码国产精品fc2| 久久美女艺术照精彩视频福利播放 | jizz中文字幕| 日本在线不卡视频一二三区| 日韩色妇久久av| 亚洲综合在线电影| 在线观看视频亚洲| 怡红院男人的天堂| 中文字幕精品一区二区精品绿巨人| 日韩一级在线免费观看| 国产a久久精品一区二区三区| 欧美一级视频免费在线观看| 日本五码在线| 91久久国产最好的精华液| 欧美 日韩 国产 成人 在线观看 | 国产精品678| 生活片a∨在线观看| 制服丝袜激情欧洲亚洲| 欧美交换国产一区内射| 99久久精品费精品国产一区二区| 免费无码不卡视频在线观看| 欧美人与牛zoz0性行为| 国产精品一二三在线| 欧洲日本在线| 日韩欧美一区二区不卡| 日韩久久精品视频| 久久女同互慰一区二区三区| 四季av一区二区三区| 欧美高清不卡| 久久久久久高清| 国产精品麻豆成人av电影艾秋| 久久影院免费观看| 日韩在线一区二区三区四区| 色悠久久久久综合欧美99| 激情高潮到大叫狂喷水| 成人视屏免费看| 玩弄japan白嫩少妇hd| 99视频精品视频高清免费| 99一区二区三区| 国产精欧美一区二区三区蓝颜男同| 在线播放日韩av| 精品人妻一区二区三区四区不卡 | 超碰超碰在线观看| 精品91在线| 亚洲国产综合自拍| 97青娱国产盛宴精品视频| 日本亚洲欧洲色| 性欧美videoshd高清| 国产视频综合在线| 国产偷拍一区二区| 91久久精品午夜一区二区| 欧美日韩偷拍视频| 国产日韩精品久久久| 午夜性福利视频| 男女男精品网站| 男女超爽视频免费播放| 久久一本综合| 久久久久久久久久久久久久久久av| 日本午夜精品久久久久| 秋霞午夜一区二区| 日本乱理伦在线| 中文字幕在线观看日韩| 色香蕉在线视频| 欧美一区二区三区在线观看视频| 亚洲GV成人无码久久精品| 一区二区欧美国产| 手机免费观看av| 91年精品国产| 老熟妇精品一区二区三区| 国产在线视视频有精品| 久久99999| 香蕉久久夜色精品国产| 久久久久99精品成人片| 久久久久电影| 亚洲精品一区二| 精品国产91久久久久久浪潮蜜月| 国产不卡一区二区在线观看| 精品成人18| 国产美女直播视频一区| 国产 日韩 欧美一区| 97在线视频免费| 成年人视频免费在线播放| 久久久久99精品久久久久| av在线免费一区| 国产亚洲aⅴaaaaaa毛片| 日韩欧美电影在线观看| 日韩av网站大全| 日韩在线视频免费| 亚洲国产福利在线| 亚洲精品视频专区| 精品日韩av一区二区| 国产成人久久精品77777综合 | 天堂资源最新在线| 亚洲成人黄色在线| 人妻少妇精品无码专区| 欧美成人精品1314www| 精品黑人一区二区三区在线观看 | 三级黄色片免费看| 精品一区二区三区视频 | 91在线视频免费播放| 欧美性猛交丰臀xxxxx网站| 日韩黄色在线播放| 欧美日韩国产区| 欧美精品一二三四区| 色嗨嗨av一区二区三区| 天天干天天插天天射| 欧美视频日韩视频| 97人妻人人澡人人爽人人精品| 欧美日本国产视频| 99久久精品国产一区色| 日韩午夜激情免费电影| 隣の若妻さん波多野结衣| 亚洲国产精品久久91精品| 秋霞欧美在线观看| 亚洲精品97久久| 久久久久久久久亚洲精品| 亚洲午夜国产成人av电影男同| 午夜视频在线观看网站| 美女性感视频久久久| h片在线观看视频免费免费| 2020久久国产精品| 欧美精品总汇| 91免费观看网站| 激情小说一区| 免费看国产精品一二区视频| 日韩电影免费在线观看| 国产av第一区| 中文精品在线| www.亚洲高清| 国产成人午夜99999| 青青草视频播放| 国产精品久久久爽爽爽麻豆色哟哟| 欧美老熟妇一区二区三区| 午夜a成v人精品| 在线观看你懂的网站| 欧美一三区三区四区免费在线看 | 国产精品欧美久久久久无广告| 国产黄色小视频网站| 精品国产91久久久久久老师| 老熟妇一区二区三区啪啪| 日韩免费成人网| 岛国在线视频| 高清亚洲成在人网站天堂| 亚州一区二区三区| 91九色蝌蚪嫩草| 久操国产精品| 男人天堂新网址| 视频一区免费在线观看| 俄罗斯女人裸体性做爰| 国产日韩精品久久久| 久久精品女人毛片国产| 欧美视频日韩视频| 天天干天天摸天天操| 久久精品国产一区二区电影| 人狥杂交一区欧美二区| 亚洲精品免费一区二区三区| 你懂的一区二区三区| 日韩精品在线中文字幕| 久久国产精品免费| 精品少妇一区二区三区免费观| **欧美大码日韩| 日韩电影在线观看一区二区| 91精品国产综合久久香蕉的特点| 欧美视频综合| 久久久爽爽爽美女图片| 亚洲欧美在线人成swag| 青青影院一区二区三区四区| 影音先锋亚洲一区| 午夜视频在线网站| 久久精品综合网| 国产极品在线播放| 欧美乱妇15p| 国产一区精品| 欧洲日韩成人av| 老司机精品视频在线播放| 996这里只有精品| 国产精品1024久久| 青青操在线视频观看| 欧美在线观看视频在线| 日本人妖在线| 韩国视频理论视频久久| 欧美不卡在线观看| 亚洲自拍三区| 日本不卡视频在线观看| 中文字幕一区二区三区人妻| 午夜精品福利一区二区蜜股av| 丰满熟妇人妻中文字幕| 欧美日韩成人网| 欧美日韩中出| 免费成人深夜夜行网站视频| 久久电影网站中文字幕 | 欧洲成人av| 青青草原一区二区| 日韩成人动漫在线观看| 人妻少妇精品无码专区二区| av在线免费不卡| 日韩精品视频免费看| 亚洲国产古装精品网站| 欧美三级网站| 欧美成人免费在线| 日韩在线播放一区二区| 女女互磨互喷水高潮les呻吟| 色婷婷久久久久swag精品| 黄色电影免费在线看| 国产精品视频99| 欧美大片aaaa| 国产精品久久久久久久99| 亚洲色图清纯唯美| 亚洲第一精品网站| 九九热精品在线| 国产精品tv| 国产在线青青草| 久久精品欧美一区二区三区麻豆 | 欧美精品一区二区三| 97人人在线视频| 欧美日韩国产不卡在线看| 日本午夜一本久久久综合| 美女100%露胸无遮挡| 欧美狂野另类xxxxoooo| 黄网站免费在线播放| julia一区二区中文久久94| 亚洲欧洲日本mm| 久久福利小视频| 欧洲精品一区二区三区在线观看| av网站在线免费观看| 波多野结衣一区二区三区在线观看 | 久久精品亚洲热| 88久久精品| wwwxxx黄色片| 中文字幕一区二区在线播放 | 高清久久久久久| 九一国产在线观看| 正在播放欧美一区| 91蝌蚪精品视频| 美女网站免费观看视频| 亚洲欧美综合色| 午夜在线视频免费| 国产精品一区二区三区毛片淫片| 在线国产一区二区| 97超碰在线免费观看| 欧美精品自拍偷拍| 大菠萝精品导航| 亚洲免费视频播放| 91免费国产视频网站| 99久久亚洲精品日本无码| 1769国产精品| 最新国产精品| 最新中文字幕视频| 欧美精品久久一区二区三区| 日本不卡1234视频| 热这里只有精品| 久久久久国产精品麻豆| 国产黄色小视频在线观看|