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

Redis為何這么快——數據存儲角度

數據庫 其他數據庫 Redis
Redis是一個由ANSI C語言編寫,性能優秀、支持網絡、可持久化的K-K內存數據庫,并提供多種語言的API。

本文內容思維導圖如下:

一、簡介和應用

Redis是一個由ANSI C語言編寫,性能優秀、支持網絡、可持久化的K-K內存數據庫,并提供多種語言的API。它常用的類型主要是 String、List、Hash、Set、ZSet 這5種

Redis在互聯網公司一般有以下應用:

  •  String:緩存、限流、計數器、分布式鎖、分布式Session
  •  Hash:存儲用戶信息、用戶主頁訪問量、組合查詢
  •  List:微博關注人時間軸列表、簡單隊列
  •  Set:贊、踩、標簽、好友關系
  •  Zset:排行榜

再比如電商在大促銷時,會用一些特殊的設計來保證系統穩定,扣減庫存可以考慮如下設計:

上圖中,直接在Redis中扣減庫存,記錄日志后通過Worker同步到數據庫,在設計同步Worker時需要考慮并發處理和重復處理的問題。

通過上面的應用場景可以看出Redis是非常高效和穩定的,那Redis底層是如何實現的呢?

二、Redis的對象redisObject

當我們執行set hello world命令時,會有以下數據模型:

  •  dictEntry:Redis給每個key-value鍵值對分配一個dictEntry,里面有著key和val的指針,next指向下一個dictEntry形成鏈表,這個指針可以將多個哈希值相同的鍵值對鏈接在一起,由此來解決哈希沖突問題(鏈地址法)。
  •  sds:鍵key“hello”是以SDS(簡單動態字符串)存儲,后面詳細介紹。
  •  redisObject:值val“world”存儲在redisObject中。實際上,redis常用5中類型都是以redisObject來存儲的;而redisObject中的type字段指明了Value對象的類型,ptr字段則指向對象所在的地址。

redisObject對象非常重要,Redis對象的類型、內部編碼、內存回收、共享對象等功能,都需要redisObject支持。這樣設計的好處是,可以針對不同的使用場景,對5中常用類型設置多種不同的數據結構實現,從而優化對象在不同場景下的使用效率。

無論是dictEntry對象,還是redisObject、SDS對象,都需要內存分配器(如jemalloc)分配內存進行存儲。jemalloc作為Redis的默認內存分配器,在減小內存碎片方面做的相對比較好。比如jemalloc在64位系統中,將內存空間劃分為小、大、巨大三個范圍;每個范圍內又劃分了許多小的內存塊單位;當Redis存儲數據時,會選擇大小最合適的內存塊進行存儲。

前面說過,Redis每個對象由一個redisObject結構表示,它的ptr指針指向底層實現的數據結構,而數據結構由encoding屬性決定。比如我們執行以下命令得到存儲“hello”對應的編碼:

redis所有的數據結構類型如下(重要,后面會用):

三、String

字符串對象的底層實現可以是int、raw、embstr(上面的表對應有名稱介紹)。embstr編碼是通過調用一次內存分配函數來分配一塊連續的空間,而raw需要調用兩次。

int編碼字符串對象和embstr編碼字符串對象在一定條件下會轉化為raw編碼字符串對象。embstr:<=39字節的字符串。int:8個字節的長整型。raw:大于39個字節的字符串。

簡單動態字符串(SDS),這種結構更像C++的String或者Java的ArrayList<Character>,長度動態可變: 

  1. struct sdshdr {  
  2.  // buf 中已占用空間的長度  
  3.  int len;  
  4.  // buf 中剩余可用空間的長度  
  5.  int free;  
  6.  // 數據空間  
  7.  char buf[]; // ’’空字符結尾  
  8. }; 
  •  get:sdsrange---O(n)
  •  set:sdscpy—O(n)
  •  create:sdsnew---O(1)
  •  len:sdslen---O(1)

常數復雜度獲取字符串長度:因為SDS在len屬性中記錄了長度,所以獲取一個SDS長度時間復雜度僅為O(1)。

預空間分配:如果對一個SDS進行修改,分為一下兩種情況:

  •  SDS長度(len的值)小于1MB,那么程序將分配和len屬性同樣大小的未使用空間,這時free和len屬性值相同。舉個例子,SDS的len將變成15字節,則程序也會分配15字節的未使用空間,SDS的buf數組的實際長度變成15+15+1=31字節(額外一個字節用戶保存空字符)。
  •  SDS長度(len的值)大于等于1MB,程序會分配1MB的未使用空間。比如進行修改之后,SDS的len變成30MB,那么它的實際長度是30MB+1MB+1byte。

惰性釋放空間:當執行sdstrim(截取字符串)之后,SDS不會立馬釋放多出來的空間,如果下次再進行拼接字符串操作,且拼接的沒有剛才釋放的空間大,則那些未使用的空間就會排上用場。通過惰性釋放空間避免了特定情況下操作字符串的內存重新分配操作。

杜絕緩沖區溢出:使用C字符串的操作時,如果字符串長度增加(如strcat操作)而忘記重新分配內存,很容易造成緩沖區的溢出;而SDS由于記錄了長度,相應的操作在可能造成緩沖區溢出時會自動重新分配內存,杜絕了緩沖區溢出。

四、List

List對象的底層實現是quicklist(快速列表,是ziplist 壓縮列表 和linkedlist 雙端鏈表 的組合)。Redis中的列表支持兩端插入和彈出,并可以獲得指定位置(或范圍)的元素,可以充當數組、隊列、棧等。 

  1. typedef struct listNode {  
  2.  // 前置節點  
  3.  struct listNode *prev;  
  4.  // 后置節點  
  5.  struct listNode *next;  
  6.  // 節點的值  
  7.  void *value;  
  8.  } listNode;  
  9.  typedef struct list {  
  10.  // 表頭節點  
  11.  listNode *head;  
  12.  // 表尾節點  
  13.  listNode *tail;  
  14.  // 節點值復制函數  
  15.  void *(*dup)(void *ptr);  
  16.  // 節點值釋放函數  
  17.  void (*free)(void *ptr);  
  18.  // 節點值對比函數  
  19.  int (*match)(void *ptr, void *key);  
  20.  // 鏈表所包含的節點數量  
  21.  unsigned long len;  
  22.  } list; 
  •  rpush: listAddNodeHead ---O(1)
  •  lpush: listAddNodeTail ---O(1)
  •  push:listInsertNode ---O(1)
  •  index : listIndex ---O(N)
  •  pop:ListFirst/listLast ---O(1)
  •  llen:listLength ---O(N)

4.1 linkedlist(雙端鏈表)

此結構比較像Java的LinkedList,有興趣可以閱讀一下源碼。

 

從圖中可以看出Redis的linkedlist雙端鏈表有以下特性:節點帶有prev、next指針、head指針和tail指針,獲取前置節點、后置節點、表頭節點和表尾節點的復雜度都是O(1)。len屬性獲取節點數量也為O(1)。

與雙端鏈表相比,壓縮列表可以節省內存空間,但是進行修改或增刪操作時,復雜度較高;因此當節點數量較少時,可以使用壓縮列表;但是節點數量多時,還是使用雙端鏈表劃算。

4.2 ziplist(壓縮列表)

當一個列表鍵只包含少量列表項,且是小整數值或長度比較短的字符串時,那么redis就使用ziplist(壓縮列表)來做列表鍵的底層實現。

ziplist是Redis為了節約內存而開發的,是由一系列特殊編碼的連續內存塊(而不是像雙端鏈表一樣每個節點是指針)組成的順序型數據結構;具體結構相對比較復雜,有興趣讀者可以看 Redis 哈希結構內存模型剖析。在新版本中list鏈表使用 quicklist 代替了 ziplist和 linkedlist:

quickList 是 zipList 和 linkedList 的混合體。它將 linkedList 按段切分,每一段使用 zipList 來緊湊存儲,多個 zipList 之間使用雙向指針串接起來。因為鏈表的附加空間相對太高,prev 和 next 指針就要占去 16 個字節 (64bit 系統的指針是 8 個字節),另外每個節點的內存都是單獨分配,會加劇內存的碎片化,影響內存管理效率。

quicklist 默認的壓縮深度是 0,也就是不壓縮。為了支持快速的 push/pop 操作,quicklist 的首尾兩個 ziplist 不壓縮,此時深度就是 1。為了進一步節約空間,Redis 還會對 ziplist 進行壓縮存儲,使用 LZF 算法壓縮。

五、Hash

Hash對象的底層實現可以是ziplist(壓縮列表)或者hashtable(字典或者也叫哈希表)。

Hash對象只有同時滿足下面兩個條件時,才會使用ziplist(壓縮列表):1.哈希中元素數量小于512個;2.哈希中所有鍵值對的鍵和值字符串長度都小于64字節。

hashtable哈希表可以實現O(1)復雜度的讀寫操作,因此效率很高。源碼如下: 

  1. typedef struct dict {  
  2.  // 類型特定函數  
  3.  dictType *type;  
  4.  // 私有數據  
  5.  void *privdata;  
  6.  // 哈希表  
  7.  dictht ht[2];  
  8.  // rehash 索引  
  9.  // 當 rehash 不在進行時,值為 -1  
  10.  int rehashidx; /* rehashing not in progress if rehashidx == -1 */  
  11.  // 目前正在運行的安全迭代器的數量  
  12.  int iterators; /* number of iterators currently running */  
  13.  } dict;  
  14.  typedef struct dictht {  
  15.  // 哈希表數組  
  16.  dictEntry **table;  
  17.  // 哈希表大小  
  18.  unsigned long size;  
  19.  // 哈希表大小掩碼,用于計算索引值  
  20.  // 總是等于 size - 1  
  21.  unsigned long sizemask;  
  22.  // 該哈希表已有節點的數量  
  23.  unsigned long used;  
  24. } dictht;  
  25. typedef struct dictEntry {  
  26.  void *key;  
  27.  union {void *val;uint64_t u64;int64_t s64;} v;  
  28.  // 指向下個哈希表節點,形成鏈表  
  29.  struct dictEntry *next;  
  30.  } dictEntry;  
  31.  typedef struct dictType {  
  32.  // 計算哈希值的函數  
  33.  unsigned int (*hashFunction)(const void *key);  
  34.  // 復制鍵的函數  
  35.  void *(*keyDup)(void *privdata, const void *key);  
  36.  // 復制值的函數  
  37.  void *(*valDup)(void *privdata, const void *obj);  
  38.  // 對比鍵的函數  
  39.  int (*keyCompare)(void *privdata, const void *key1, const void *key2);  
  40.  // 銷毀鍵的函數  
  41.  void (*keyDestructor)(void *privdata, void *key);  
  42.  // 銷毀值的函數  
  43.  void (*valDestructor)(void *privdata, void *obj);  
  44. } dictType; 

上面源碼可以簡化成如下結構:

這個結構類似于JDK7以前的HashMap<String,Object>,當有兩個或以上的鍵被分配到哈希數組的同一個索引上時,會產生哈希沖突。Redis也使用鏈地址法來解決鍵沖突。即每個哈希表節點都有一個next指針,多個哈希表節點用next指針構成一個單項鏈表,鏈地址法就是將相同hash值的對象組織成一個鏈表放在hash值對應的槽位。

Redis中的字典使用hashtable作為底層實現的話,每個字典會帶有兩個哈希表,一個平時使用,另一個僅在rehash(重新散列)時使用。隨著對哈希表的操作,鍵會逐漸增多或減少。為了讓哈希表的負載因子維持在一個合理范圍內,Redis會對哈希表的大小進行擴展或收縮(rehash),也就是將ht【0】里面所有的鍵值對分多次、漸進式的rehash到ht【1】里。

六、Set

Set集合對象的底層實現可以是intset(整數集合)或者hashtable(字典或者也叫哈希表)。

intset(整數集合)當一個集合只含有整數,并且元素不多時會使用intset(整數集合)作為Set集合對象的底層實現。 

  1. typedef struct intset {  
  2.  // 編碼方式  
  3.  uint32_t encoding;  
  4.  // 集合包含的元素數量  
  5.  uint32_t length;  
  6.  // 保存元素的數組  
  7.  int8_t contents[];  
  8. } intset; 
  •  sadd:intsetAdd---O(1)
  •  smembers:intsetGetO(1)---O(N)
  •  srem:intsetRemove---O(N)
  •  slen:intsetlen ---O(1)

intset底層實現為有序,無重復數組保存集合元素。 intset這個結構里的整數數組的類型可以是16位的,32位的,64位的。如果數組里所有的整數都是16位長度的,如果新加入一個32位的整數,那么整個16的數組將升級成一個32位的數組。升級可以提升intset的靈活性,又可以節約內存,但不可逆。

7.ZSet

ZSet有序集合對象底層實現可以是ziplist(壓縮列表)或者skiplist(跳躍表)。

當一個有序集合的元素數量比較多或者成員是比較長的字符串時,Redis就使用skiplist(跳躍表)作為ZSet對象的底層實現。 

  1. typedef struct zskiplist {  
  2.  // 表頭節點和表尾節點  
  3.  struct zskiplistNode *header, *tail;  
  4.  // 表中節點的數量  
  5.  unsigned long length;  
  6.  // 表中層數***的節點的層數  
  7.  int level;  
  8.  } zskiplist;  
  9. typedef struct zskiplistNode {  
  10.  // 成員對象  
  11.  robj *obj;  
  12.  // 分值  
  13.  double score;  
  14.  // 后退指針  
  15.  struct zskiplistNode *backward;  
  16.  // 層  
  17.  struct zskiplistLevel {  
  18.  // 前進指針  
  19.  struct zskiplistNode *forward;  
  20.  // 跨度---前進指針所指向節點與當前節點的距離  
  21.  unsigned int span;  
  22.  } level[];  
  23. } zskiplistNode; 

zadd---zslinsert---平均O(logN), 最壞O(N)

zrem---zsldelete---平均O(logN), 最壞O(N)

zrank--zslGetRank---平均O(logN), 最壞O(N)

skiplist的查找時間復雜度是LogN,可以和平衡二叉樹相當,但實現起來又比它簡單。跳躍表(skiplist)是一種有序數據結構,它通過在某個節點中維持多個指向其他節點的指針,從而達到快速訪問節點的目的。 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2021-03-22 08:30:33

Kafka源碼架構開發技術

2017-11-20 08:13:26

大數據大數據技術數據

2023-08-29 07:46:08

Redis數據ReHash

2022-01-04 08:54:32

Redis數據庫數據類型

2024-07-24 08:38:07

2020-10-21 09:17:52

Redis面試內存

2017-06-06 16:30:55

戴爾交付保障

2023-03-21 08:02:36

Redis6.0IO多線程

2019-06-17 14:20:51

Redis數據庫Java

2021-06-27 22:48:28

Redis數據庫內存

2020-02-27 21:03:30

調度器架構效率

2024-02-26 21:15:20

Kafka緩存參數

2020-02-27 15:44:41

Nginx服務器反向代理

2019-01-10 09:11:51

消息順序性分布式服務端

2019-10-14 09:50:52

KeyDBRedis中間件

2018-04-25 10:13:30

Redis內存模型

2020-03-30 15:05:46

Kafka消息數據

2025-06-18 08:20:00

Redis數據庫線程

2019-10-24 09:51:48

阿里工程師互聯網

2020-10-15 09:19:36

Elasticsear查詢速度
點贊
收藏

51CTO技術棧公眾號

国产精品毛片无遮挡高清| 一级成人国产| 精品国产免费一区二区三区香蕉| 精品91一区二区三区| 黄色一级大片在线免费看国产| 一本色道久久| 综合久久久久综合| 91色在线观看| 国产91精品一区| 日韩夫妻性生活xx| 精品国产一区二区亚洲人成毛片| 少妇性饥渴无码a区免费| 日本视频在线| 成人永久aaa| 国产视频观看一区| 久久免费激情视频| 综合久久久久| 中文字幕不卡av| 亚洲美女在线播放| 亚洲人成777| 色菇凉天天综合网| 少妇一晚三次一区二区三区| 99中文字幕一区| 国产91精品精华液一区二区三区| 国产精品扒开腿爽爽爽视频| 欧美成人aaa片一区国产精品| 国产一区二区在线| 欧美成人激情免费网| xx欧美撒尿嘘撒尿xx| 中文在线а√在线8| 亚洲精品少妇30p| 日本最新一区二区三区视频观看| 欧美 日韩 国产 在线| 麻豆成人免费电影| 国产精品免费视频久久久| 日产精品久久久久久久| 欧美色一级片| 欧美乱妇高清无乱码| 开心激情五月网| 日韩1区在线| 一本久久综合亚洲鲁鲁| 亚洲av无码国产精品久久| 加勒比色老久久爱综合网| 欧美一区二区三级| 亚洲综合在线一区二区| 色诱色偷偷久久综合| 欧美日韩一级片在线观看| 日本在线观看a| 涩涩涩在线视频| 疯狂欧美牲乱大交777| 欧美极品欧美精品欧美| 国产剧情av在线播放| 亚洲一区二区美女| 亚洲精品蜜桃久久久久久| 成人爽a毛片免费啪啪动漫| 一个色在线综合| 国产av熟女一区二区三区| 欧美高清另类hdvideosexjaⅴ | 国产精品免费一区二区三区观看| 7777久久亚洲中文字幕| 亚洲综合精品四区| 爱福利视频一区| 三级黄色免费观看| 第一sis亚洲原创| 一本久久综合亚洲鲁鲁| www.av天天| 国产a久久精品一区二区三区| 亚洲精品久久久久久久久久久久| 日本不卡视频一区| 成人在线超碰| 亚洲国产精品va在线看黑人| 潘金莲一级淫片aaaaa| 中文无码日韩欧| 精品久久久久香蕉网| 最新国产精品自拍| 老司机精品在线| 亚洲精品成人久久| 欧美成人国产精品一区二区| 欧美a级成人淫片免费看| 久久精品亚洲精品| 波多野结衣亚洲一区二区| 欧美伊人影院| 久久国产精品久久久久久| 欧美风情第一页| 午夜精品婷婷| 欧美性视频精品| 无码任你躁久久久久久久| 日本特黄久久久高潮| 91精品久久久久久久久不口人| 一卡二卡在线观看| 成人午夜精品一区二区三区| 九九九九久久久久| 黑人与亚洲人色ⅹvideos| 日本一区二区综合亚洲| 亚洲乱码国产乱码精品天美传媒| 免费a在线看| 一区二区三区四区激情| 国产69精品久久久久999小说| 激情图片在线观看高清国产| 欧美中文字幕久久| 日本成人在线免费观看| 青青视频一区二区| 中文字幕少妇一区二区三区| 欧美黑人一级片| 亚洲一区日韩| 91精品视频网站| 日韩一级片免费在线观看| 国产亚洲va综合人人澡精品| 一区二区三区在线视频111| 成人免费网站观看| 欧美日韩情趣电影| 亚洲黄色小说在线观看| 国产成人黄色| 久久精品国产亚洲精品| 国产香蕉在线视频| 久久一区二区三区四区五区| 亚洲精品免费在线视频| 男人的天堂av高清在线| 一区二区三区欧美视频| 97国产精东麻豆人妻电影| 视频91a欧美| 亚洲男人av在线| 欧美被狂躁喷白浆精品| 日韩av一级电影| 国产美女精品在线观看| 香蕉视频在线看| 狠狠躁18三区二区一区| 毛毛毛毛毛毛毛片123| 日韩中出av| 午夜精品一区二区三区在线播放 | 亚洲精品黄色| 成人网在线免费观看| 日韩二区三区| 亚洲欧美电影院| 九色91popny| 欧美在线导航| 免费97视频在线精品国自产拍| 免费黄色av片| www.亚洲在线| 成人免费a级片| 国精品产品一区| 亚洲天堂av网| 国产成人无码一区二区三区在线| 国产在线麻豆精品观看| 五月婷婷综合色| 成人小电影网站| 亚洲国产精品一区二区三区| 少妇久久久久久被弄高潮| 蜜桃91丨九色丨蝌蚪91桃色| 国产亚洲二区| 亚洲欧洲美洲av| 亚洲精品久久久久国产| 日韩免费av片| 高清在线观看日韩| 日本美女爱爱视频| 国产高清亚洲| 色偷偷偷亚洲综合网另类| 337p粉嫩色噜噜噜大肥臀| 国产人成一区二区三区影院| 成人在线观看黄| 最新精品国偷自产在线| 欧美一性一乱一交一视频| 天天躁日日躁狠狠躁喷水| 亚洲成人动漫一区| 国产视频精品视频| 亚洲承认在线| 国产精品初高中精品久久| 麻豆mv在线看| 亚洲老板91色精品久久| 亚洲精品中文字幕乱码三区91| 91视视频在线观看入口直接观看www | 国产精品人成电影| 亚州男人的天堂| 亚洲成人免费电影| 日本丰满少妇裸体自慰| 新狼窝色av性久久久久久| 欧美日韩电影一区二区三区| 国模套图日韩精品一区二区| 亚洲丝袜在线视频| 一级特黄录像免费看| 有码一区二区三区| 亚洲黄色片免费看| 国产欧美精品| 婷婷亚洲婷婷综合色香五月| 成人短视频软件网站大全app| 久久影院资源网| 亚洲国产成人一区二区 | 欧美黄色免费网址| 亚洲成人一品| 国产热re99久久6国产精品| 五月天激情在线| 亚洲黄色有码视频| 波多野结衣在线观看视频| 日韩一区在线免费观看| 色综合久久久无码中文字幕波多| 99综合精品| 污视频在线免费观看一区二区三区| 欧美a一级片| 米奇精品一区二区三区在线观看| 每日更新在线观看av| 91超碰这里只有精品国产| 国产一级生活片| 国产欧美综合色| 国产视频亚洲色图| 欧美成人三级在线视频| 大型av综合网站| 国产精品视频一| 色呦呦呦在线观看| 亚洲精品视频久久| 91久久久久久久久久久久| 亚洲制服丝袜在线| 欧洲av一区二区三区| 国产a视频精品免费观看| 日韩中文字幕三区| 欧美视频导航| 日韩欧美在线电影| 一区二区三区亚洲变态调教大结局| 午夜免费久久久久| 日本视频在线观看| 精品夜色国产国偷在线| 99热在线只有精品| 在线免费观看不卡av| 久久久国产精品黄毛片| 欧美国产日产图区| 精品国产av色一区二区深夜久久| 久久精品99国产精品| 国产91在线免费| 牛夜精品久久久久久久99黑人| 欧美一区二区三区四区五区六区| 91成人入口| 成人蜜桃视频| 高清国产一区二区三区四区五区| 国产99视频在线观看| 国内在线免费视频| 久久久国产91| 在线视频三区| 国产一区二区三区欧美| 婷婷久久久久久| 日韩丝袜情趣美女图片| 中文字幕人妻互换av久久| 大桥未久av一区二区三区| 国产av 一区二区三区| 国产精品女主播在线观看| 男人天堂av电影| 丰满少妇久久久久久久| a级片在线观看视频| 国产精品资源在线| 亚洲天堂av一区二区| 视频一区中文字幕| 中国丰满人妻videoshd| 国产精品丝袜xxxxxxx| 精品国产一区三区| 亚洲无线一线二线三线区别av| 亚洲第一页在线视频| 日韩在线观看| 亚洲精品美女久久7777777| 日韩精品导航| 秋霞久久久久久一区二区| 夜色77av精品影院| 九九九久久久| 中文精品一区二区| 麻豆精品传媒视频| 伊人成综合网伊人222| 精品一区日韩成人| 精品国产一区一区二区三亚瑟| 欧美一区激情视频在线观看| 欧美极品在线观看| 日本福利一区二区三区| av资源久久| 亚洲国产另类久久久精品极度| 国产亚洲一区| 最新视频 - x88av| 欧美另类综合| 可以看毛片的网址| 国产亚洲毛片| 一本岛在线视频| 精品一区二区三区的国产在线播放| 可以看的av网址| 成人午夜精品在线| v8888av| 久久久久国产免费免费| 亚洲精品国产精品国自| 国产精品久久久久久亚洲毛片| 国模无码国产精品视频| 亚洲日本乱码在线观看| 久久精品视频国产| 一本一本大道香蕉久在线精品 | 亚洲一二三四在线| 在线观看精品国产| 在线一区二区三区四区五区| 亚洲图片中文字幕| 亚洲成人精品av| 黄色免费在线观看| 国内精品视频在线| 国产精品高清乱码在线观看| 国产欧美一区二区三区久久| 97青娱国产盛宴精品视频| 欧美极品视频一区二区三区| 欧美一区成人| 国产极品美女高潮无套久久久| 久久99精品国产麻豆婷婷| www.四虎在线| 国产欧美一区二区精品性| 欧美精品久久久久性色| 欧美三级资源在线| 成人爽a毛片一区二区| 亚洲视频欧美视频| 伊人222成人综合网| 国产精品www网站| 综合激情网...| 一区一区视频| 媚黑女一区二区| 污污视频网站在线| 久久亚洲私人国产精品va媚药| 中文字幕无码日韩专区免费| 亚洲一区二区三区四区在线免费观看| 进去里视频在线观看| 亚洲丁香婷深爱综合| 麻豆免费在线观看| 国产91色在线播放| aiai久久| 天堂精品视频| 玖玖在线精品| 最近日本中文字幕| 一区二区三区四区不卡视频| 在线视频播放大全| 亚洲精品视频二区| 厕沟全景美女厕沟精品| y111111国产精品久久婷婷| 日韩不卡一区| 黄色片视频在线免费观看| 国产精品影视在线观看| 日本不卡一区视频| 欧美三级日本三级少妇99| 爽爽视频在线观看| 欧美激情第6页| 日韩中文字幕在线一区| 亚洲一区三区视频在线观看| 日本不卡一二三区黄网| 免费观看av网站| 性做久久久久久| 亚洲精品国产手机| 欧美成人午夜免费视在线看片| 欧美激情福利| 视频在线一区二区三区| 日韩在线a电影| 精品人妻一区二区三区日产乱码卜| 夜夜亚洲天天久久| 国产绳艺sm调教室论坛| 在线视频精品一| 欧美亚洲人成在线| 亚洲一区美女| 黄色精品一二区| 久久久久久视频| 91国产丝袜在线播放| caoporn国产精品免费视频| 国产成人精品在线播放| 国产不卡一区| 九九热免费精品视频| 国产视频一区不卡| 久久久久精彩视频| 色爱av美腿丝袜综合粉嫩av| 狂野欧美性猛交xxxx| 亚洲资源在线网| 国模一区二区三区白浆| 侵犯稚嫩小箩莉h文系列小说| 欧美一区二区三区影视| 先锋成人av| 国产精品 日韩| 国产精品久久国产愉拍| 女人黄色一级片| 欧美日韩二区三区| av毛片在线| 好吊色欧美一区二区三区 | 日本少妇裸体做爰| 日韩电影网在线| avav成人| 一区二区欧美日韩| 国产一区二区三区精品欧美日韩一区二区三区 | 免费观看在线黄色网| 91精品久久久久久久| 亚洲综合婷婷| 无码国产69精品久久久久网站| 天天影视涩香欲综合网| 男男激情在线| 成人国产精品久久久| 欧美日韩1区2区3区| 少妇激情一区二区三区视频| 欧美日韩中文在线| av网站在线免费播放| 国产精品一区视频| 日韩av成人高清| 91porn在线视频| 亚洲欧洲第一视频| avtt久久| 日本新janpanese乱熟| 亚洲欧美乱综合| 视频在线观看你懂的| 国产美女主播一区| 亚洲高清成人|