成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡單動態(tài)字符串詳解

redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡單動態(tài)字符串詳解

熱門標(biāo)簽:最簡單的百度地圖標(biāo)注 太原營銷外呼系統(tǒng) 地圖標(biāo)注如何即時生效 地圖標(biāo)注費用 竹間科技AI電銷機(jī)器人 百度商家地圖標(biāo)注怎么做 玄武湖地圖標(biāo)注 西藏教育智能外呼系統(tǒng)價格 小紅書怎么地圖標(biāo)注店

前言

reids 沒有直接使用C語言傳統(tǒng)的字符串表示(以空字符結(jié)尾的字符數(shù)組)而是構(gòu)建了一種名為簡單動態(tài)字符串的抽象類型,并為redis的默認(rèn)字符串表示,因為C字符串不能滿足redis對字符串的安全性、效率以及功能方面的需求

1、SDS 定義

在C語言中,字符串是以'\0'字符結(jié)尾(NULL結(jié)束符)的字符數(shù)組來存儲的,通常表達(dá)為字符指針的形式(char *)。它不允許字節(jié)0出現(xiàn)在字符串中間,因此,它不能用來存儲任意的二進(jìn)制數(shù)據(jù)。

sds的類型定義

typedef char *sds;

 

每個sds.h/sdshdr結(jié)構(gòu)表示一個SDS的值 
struct sdshdr{ 
//記錄buf數(shù)組中已使用的字節(jié)的數(shù)量 
//等于sds所保存字符串的長度 
int len; 

//記錄buf中未使用的數(shù)據(jù) 
int free; 

//字符數(shù)組,用于保存字符串 
} 


* free 屬性的值為0,表示這個SDS沒有分配任何未使用的空間 
* len 屬性長度為5,表示這個SDS保存一個五字節(jié)長的字符串 
* buf 屬性是一個char類型的數(shù)組,數(shù)組的前5個字節(jié)分別保存了'R','e','d','i','s'五個字符,而最后一個字節(jié)則保存了空字符串'\0' 

肯定有人感到困惑了,竟然sds就等同于char *?

sds和傳統(tǒng)的C語言字符串保持類型兼容,因此它們的類型定義是一樣的,都是char *,在有些情況下,需要傳入一個C語言字符串的地方,也確實可以傳入一個sds。

但是sds和char *并不等同,sds是Binary Safe的,它可以存儲任意二進(jìn)制數(shù)據(jù),不能像C語言字符串那樣以字符'\0'來標(biāo)識字符串的結(jié)束,因此它必然有個長度字段,這個字段在header中

sds的header結(jié)構(gòu)

/* Note: sdshdr5 is never used, we just access the flags byte directly.
 * However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {
 unsigned char flags; /* 3 lsb of type, and 5 msb of string length */
 char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
 uint8_t len; /* used */
 uint8_t alloc; /* excluding the header and null terminator */
 unsigned char flags; /* 3 lsb of type, 5 unused bits */
 char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
 uint16_t len; /* used */
 uint16_t alloc; /* excluding the header and null terminator */
 unsigned char flags; /* 3 lsb of type, 5 unused bits */
 char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
 uint32_t len; /* used */
 uint32_t alloc; /* excluding the header and null terminator */
 unsigned char flags; /* 3 lsb of type, 5 unused bits */
 char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
 uint64_t len; /* used */
 uint64_t alloc; /* excluding the header and null terminator */
 unsigned char flags; /* 3 lsb of type, 5 unused bits */
 char buf[];
};

SDS一共有5種類型的header。目的是節(jié)省內(nèi)存。

一個SDS字符串的完整結(jié)構(gòu),由在內(nèi)存地址上前后相鄰的兩部分組成:

  • 一個header。通常包含字符串的長度(len)、最大容量(alloc)和flags。sdshdr5有所不同。
  • 一個字符數(shù)組。這個字符數(shù)組的長度等于最大容量+1。真正有效的字符串?dāng)?shù)據(jù),其長度通常小于最大容量。在真正的字符串?dāng)?shù)據(jù)之后,是空余未用的字節(jié)(一般以字節(jié)0填充),允許在不重新分配內(nèi)存的前提下讓字符串?dāng)?shù)據(jù)向后做有限的擴(kuò)展。在真正的字符串?dāng)?shù)據(jù)之后,還有一個NULL結(jié)束符,即ASCII碼為0的'\0'字符。這是為了和傳統(tǒng)C字符串兼容。之所以字符數(shù)組的長度比最大容量多1個字節(jié),就是為了在字符串長度達(dá)到最大容量時仍然有1個字節(jié)存放NULL結(jié)束符。

除了sdshdr5之外,其它4個header的結(jié)構(gòu)都包含3個字段:

  • len: 表示字符串的真正長度(不包含NULL結(jié)束符在內(nèi))。
  • alloc: 表示字符串的最大容量(不包含最后多余的那個字節(jié))。
  • flags: 總是占用一個字節(jié)。其中的最低3個bit用來表示header的類型。

在各個header的類型定義中,還有幾個需要我們注意的地方:

  • 在各個header的定義中使用了__attribute__ ((packed)),是為了讓編譯器以緊湊模式來分配內(nèi)存。如果沒有這個屬性,編譯器可能會為struct的字段做優(yōu)化對齊,在其中填充空字節(jié)。那樣的話,就不能保證header和sds的數(shù)據(jù)部分緊緊前后相鄰,也不能按照固定向低地址方向偏移1個字節(jié)的方式來獲取flags字段了。
  • 在各個header的定義中最后有一個char buf[]。我們注意到這是一個沒有指明長度的字符數(shù)組,這是C語言中定義字符數(shù)組的一種特殊寫法,稱為柔性數(shù)組(flexible array member),只能定義在一個結(jié)構(gòu)體的最后一個字段上。它在這里只是起到一個標(biāo)記的作用,表示在flags字段后面就是一個字符數(shù)組,或者說,它指明了緊跟在flags字段后面的這個字符數(shù)組在結(jié)構(gòu)體中的偏移位置。而程序在為header分配的內(nèi)存的時候,它并不占用內(nèi)存空間。如果計算sizeof(struct sdshdr16)的值,那么結(jié)果是5個字節(jié),其中沒有buf字段。
  • sdshdr5與其它幾個header結(jié)構(gòu)不同,它不包含alloc字段,而長度使用flags的高5位來存儲。因此,它不能為字符串分配空余空間。如果字符串需要動態(tài)增長,那么它就必然要重新分配內(nèi)存才行。所以說,這種類型的sds字符串更適合存儲靜態(tài)的短字符串(長度小于32)。

至此,我們非常清楚地看到了:sds字符串的header,其實隱藏在真正的字符串?dāng)?shù)據(jù)的前面(低地址方向)。這樣的一個定義,有如下幾個好處:

  • header和數(shù)據(jù)相鄰,而不用分成兩塊內(nèi)存空間來單獨分配。這有利于減少內(nèi)存碎片,提高存儲效率(memory efficiency)。
  • 雖然header有多個類型,但sds可以用統(tǒng)一的char *來表達(dá)。且它與傳統(tǒng)的C語言字符串保持類型兼容。如果一個sds里面存儲的是可打印字符串,那么我們可以直接把它傳給C函數(shù),比如使用strcmp比較字符串大小,或者使用printf進(jìn)行打印。

弄清了sds的數(shù)據(jù)結(jié)構(gòu),它的具體操作函數(shù)就比較好理解了。

sds的一些基礎(chǔ)函數(shù)

  • sdslen(const sds s): 獲取sds字符串長度。
  • sdssetlen(sds s, size_t newlen): 設(shè)置sds字符串長度。
  • sdsinclen(sds s, size_t inc): 增加sds字符串長度。
  • sdsalloc(const sds s): 獲取sds字符串容量。
  • sdssetalloc(sds s, size_t newlen): 設(shè)置sds字符串容量。
  • sdsavail(const sds s): 獲取sds字符串空余空間(即alloc - len)。
  • sdsHdrSize(char type): 根據(jù)header類型得到header大小。
  • sdsReqType(size_t string_size): 根據(jù)字符串?dāng)?shù)據(jù)長度計算所需要的header類型。

二、SDS 數(shù)組動態(tài)分配策略

header信息中的定義這么多字段,其中一個很重要的作用就是實現(xiàn)對字符串的靈活操作并且盡量減少內(nèi)存重新分配和回收操作。

redis的內(nèi)存分配策略如下

  • 當(dāng)SDS的len屬性長度小于1MB時,redis會分配和len相同長度的free空間。至于為什么這樣分配呢,上次用了len長度的空間,那么下次程序可能也會用len長度的空間,所以redis就為你預(yù)分配這么多的空間。
  • 但是當(dāng)SDS的len屬性長度大于1MB時,程序?qū)⒍喾峙?M的未使用空間。這個時候我在根據(jù)這種慣性預(yù)測來分配的話就有點得不償失了。所以redis是將1MB設(shè)為一個風(fēng)險值,沒過風(fēng)險值你用多少我就給你多少,過了的話那這個風(fēng)險值就是我能給你臨界值

reids的內(nèi)存回收策略如下

  • redis的內(nèi)存回收采用惰性回收,即你把字符串變短了,那么多余的內(nèi)存空間我先不還給操作系統(tǒng),先留著,萬一馬上又要被使用呢。短暫的持有資源,既可以充分利用資源,也可以不浪費資源。這是一種很優(yōu)秀的思想。

綜上所述,redis實現(xiàn)的高性能字符串的結(jié)果就把N次字符串操作必會發(fā)生N次內(nèi)存重新分配變?yōu)槿似纷畈顣r最多發(fā)生N次重新分配。

/* Enlarge the free space at the end of the sds string so that the caller
 * is sure that after calling this function can overwrite up to addlen
 * bytes after the end of the string, plus one more byte for nul term.
 *
 * Note: this does not change the *length* of the sds string as returned
 * by sdslen(), but only the free buffer space we have. */
sds sdsMakeRoomFor(sds s, size_t addlen) {
 void *sh, *newsh;
 size_t avail = sdsavail(s);
 size_t len, newlen;
 char type, oldtype = s[-1]  SDS_TYPE_MASK;
 int hdrlen;
 
 /* Return ASAP if there is enough space left. */
 if (avail >= addlen) return s;
 
 len = sdslen(s);
 sh = (char*)s-sdsHdrSize(oldtype);
 newlen = (len+addlen);
 if (newlen  SDS_MAX_PREALLOC)
 newlen *= 2;
 else
 newlen += SDS_MAX_PREALLOC;
 
 type = sdsReqType(newlen);
 
 /* Don't use type 5: the user is appending to the string and type 5 is
 * not able to remember empty space, so sdsMakeRoomFor() must be called
 * at every appending operation. */
 if (type == SDS_TYPE_5) type = SDS_TYPE_8;
 
 hdrlen = sdsHdrSize(type);
 if (oldtype==type) {
 newsh = s_realloc(sh, hdrlen+newlen+1);
 if (newsh == NULL) return NULL;
 s = (char*)newsh+hdrlen;
 } else {
 /* Since the header size changes, need to move the string forward,
  * and can't use realloc */
 newsh = s_malloc(hdrlen+newlen+1);
 if (newsh == NULL) return NULL;
 memcpy((char*)newsh+hdrlen, s, len+1);
 s_free(sh);
 s = (char*)newsh+hdrlen;
 s[-1] = type;
 sdssetlen(s, len);
 }
 sdssetalloc(s, newlen);
 return s;
}
 
/* Reallocate the sds string so that it has no free space at the end. The
 * contained string remains not altered, but next concatenation operations
 * will require a reallocation.
 *
 * After the call, the passed sds string is no longer valid and all the
 * references must be substituted with the new pointer returned by the call. */
sds sdsRemoveFreeSpace(sds s) {
 void *sh, *newsh;
 char type, oldtype = s[-1]  SDS_TYPE_MASK;
 int hdrlen;
 size_t len = sdslen(s);
 sh = (char*)s-sdsHdrSize(oldtype);
 
 type = sdsReqType(len);
 hdrlen = sdsHdrSize(type);
 if (oldtype==type) {
 newsh = s_realloc(sh, hdrlen+len+1);
 if (newsh == NULL) return NULL;
 s = (char*)newsh+hdrlen;
 } else {
 newsh = s_malloc(hdrlen+len+1);
 if (newsh == NULL) return NULL;
 memcpy((char*)newsh+hdrlen, s, len+1);
 s_free(sh);
 s = (char*)newsh+hdrlen;
 s[-1] = type;
 sdssetlen(s, len);
 }
 sdssetalloc(s, len);
 return s;
}

三、SDS的特點

sds正是在Redis中被廣泛使用的字符串結(jié)構(gòu),它的全稱是Simple Dynamic String。與其它語言環(huán)境中出現(xiàn)的字符串相比,它具有如下顯著的特點:

  • 可動態(tài)擴(kuò)展內(nèi)存。SDS表示的字符串其內(nèi)容可以修改,也可以追加。在很多語言中字符串會分為mutable和immutable兩種,SDS屬于mutable類型的。
  • 二進(jìn)制安全(Binary Safe)。sds能存儲任意二進(jìn)制數(shù)據(jù)。
  • 與傳統(tǒng)的C語言字符串類型兼容。
  • 預(yù)分配空間,可以懶惰釋放,在內(nèi)存緊張的時候也可以縮減不需要的內(nèi)存
  • 常數(shù)復(fù)雜度獲取字符串長度
  • 杜絕緩沖區(qū)溢出,邊界檢查

四、淺談SDS與string的關(guān)系

127.0.0.1:6379> set test test
OK
127.0.0.1:6379> append test " test"
(integer) 9
127.0.0.1:6379> get test
"test test"
127.0.0.1:6379> setbit test 36 1
(integer) 0
127.0.0.1:6379> get test
"test(test"
127.0.0.1:6379> getrange test -5 -1
"(test"
  • append操作使用SDS的sdscatlen來實現(xiàn)。
  • setbit和getrange都是先根據(jù)key取到整個sds字符串,然后再從字符串選取或修改指定的部分。由于SDS就是一個字符數(shù)組,所以對它的某一部分進(jìn)行操作似乎都比較簡單。

但是,string除了支持這些操作之外,當(dāng)它存儲的值是個數(shù)字的時候,它還支持incr、decr等操作。它的內(nèi)部存儲不是SDS,這種情況下,setbit和getrange的實現(xiàn)也會有所不同。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

參考文章

  • http://blog.csdn.net/xiejingfa/article/details/50972592
  • http://blog.csdn.net/acceptedxukai/article/details/17482611
  • https://segmentfault.com/a/1190000003984537
您可能感興趣的文章:
  • Redis底層數(shù)據(jù)結(jié)構(gòu)詳解
  • 詳解Redis數(shù)據(jù)結(jié)構(gòu)之跳躍表
  • redis中的數(shù)據(jù)結(jié)構(gòu)和編碼詳解
  • redis數(shù)據(jù)結(jié)構(gòu)之intset的實例詳解
  • 詳解redis數(shù)據(jù)結(jié)構(gòu)之sds
  • 詳解redis數(shù)據(jù)結(jié)構(gòu)之壓縮列表
  • Redis中5種數(shù)據(jù)結(jié)構(gòu)的使用場景介紹
  • Redis底層數(shù)據(jù)結(jié)構(gòu)之dict、ziplist、quicklist詳解

標(biāo)簽:澳門 景德鎮(zhèn) 揚州 贛州 香港 廣東 唐山 林芝

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡單動態(tài)字符串詳解》,本文關(guān)鍵詞  redis,內(nèi)部,數(shù)據(jù)結(jié)構(gòu),之,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡單動態(tài)字符串詳解》相關(guān)的同類信息!
  • 本頁收集關(guān)于redis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之SDS簡單動態(tài)字符串詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    在线免费看91| 99视频在线观看一区三区| 亚洲欧美一区二区三区四区五区| 性欧美videos另类hd| 欧美亚洲国产成人精品| 五月天综合视频| 亚洲欧洲精品视频| 99久re热视频这里只有精品6| 亚洲av综合色区无码一二三区| 偷窥自拍欧美色图| 亚洲一区中文字幕在线| 三上悠亚亚洲一区| 亚洲av无码乱码国产精品fc2| 亚洲高清免费观看高清完整版在线观看| 欧美第一页在线| 亚洲精品少妇网址| 亚洲精选一区二区三区| 国产亚洲综合视频| 麻豆视频在线播放| 免费看黄色网址| wwwjizzjizzcom| 日本欧美韩国国产| 99精品免费观看| 亚洲成人黄色网| 国产精品偷拍| 国产精品久久久久久吹潮| 国产欧美精品| 中文字幕视频在线免费欧美日韩综合在线看| 成人一区二区在线观看| av在线女优影院| 1区1区3区4区产品乱码芒果精品| 中文字幕亚洲日本| 国产午夜精品视频一区二区三区| 国产成人精品一区二区免费视频| 99久久精品久久久久久清纯| 久久久久高潮毛片免费全部播放| 99精品在线免费| 亚洲区免费影片| 中文字幕精品一区| 婷婷四房综合激情五月| 精品国产乱码久久久久久樱花| 538任你躁在线精品免费| 午夜精品久久久久久久爽| 国产成人黄色片| 成r视频免费观看在线播放| 天堂在线中文网| 亚洲国产精品久久久久久6q| 日韩中文字幕麻豆| 国产精品视频h| 色偷偷福利视频| 一个人免费观看在线视频www| 中文字幕一二三区在线观看| 2020国产在线视频| 国产成人涩涩涩视频在线观看| 国产成人无码av在线播放dvd| 一级全黄裸体免费视频| 久热在线观看视频| 久久综合九色综合欧美98| 国产一区二区精品免费| 在线观看国产中文字幕| 久久精品国产77777蜜臀| 国产精品亚洲综合天堂夜夜| 久久波多野结衣| 波多野结衣亚洲| 日韩免费电影在线观看| 日韩欧美在线视频一区二区| 欧美成人xxx| 99精品人妻无码专区在线视频区| 色偷偷一区二区三区| 久久影院朴妮唛| 国产露脸91国语对白| 欧美人妇做爰xxxⅹ性高电影| 91社影院在线观看| 成人aaaa| 日本在线观看一区二区| 丰满人妻一区二区三区53号| 成人黄色网免费| 五月婷婷狠狠干| 欧美xxxxbbbb| 九九热在线观看视频| 精品欧美久久| 自拍亚洲一区欧美另类| 中文字幕久久精品一区二区| 久久一二三四区| 一区二区三区不卡在线| 欧美中文字幕一二三四区| 26uuu精品一区二区在线观看| 久久人人97超碰人人澡爱香蕉| 久久久久久久9| 亚洲丁香婷深爱综合| 91高清视频在线免费观看| 国产盗摄一区二区三区在线| 日本中文字幕一区二区视频| 欧美电影免费观看高清| 国产日本在线| 成人免费无码大片a毛片| 亚洲综合欧美| 国产精品免费无码| 俄罗斯精品一区二区| 992tv在线观看在线播放| 日韩高清不卡在线| 午夜精品三级视频福利| 操碰在线免费| 秋霞午夜在线观看| 91视视频在线观看入口直接观看www| 久久免费大视频| 欧美精品三级日韩久久| 99re6热在线精品视频| 亚洲中文无码av在线| 日本夜夜草视频网站| 亚洲一区二区高清视频| 性色视频在线观看| 久久亚洲一区| 亚洲欧洲精品天堂一级| av黄色免费| 69视频在线| 日本韩国在线观看| 日韩欧美一二区| 国产一区精品二区| 久久精品老司机| 免费看av不卡| 羞羞视频在线观看| 精品国产免费人成电影在线观...| www.xxxx国产| 高清毛片aaaaaaaa**| 在线观看av资源网| 亚洲熟妇无码一区二区三区导航| 久久久久黄色片| 久久久精品人妻一区二区三区| 亚洲最大免费| 精品欧美一区二区三区免费观看| 国产一区二区你懂的| 要久久爱电视剧全集完整观看| 黄色精品视频| av小说天堂网| 91在线码无精品| 久久精品久久久久电影| 国产清纯白嫩初高中在线观看性色| 久久影视免费观看| 日本高清不卡中文字幕| 粉嫩aⅴ一区二区三区四区五区| 欧美熟妇另类久久久久久多毛| 欧美一区二区影院| 女同一区二区| 美女被男人操网站| 日韩av中文字幕在线| 91福利国产成人精品播放| 卡一卡二国产精品| 国内精品自线一区二区三区视频| 亚洲欧美日韩不卡一区二区三区| 91亚洲视频| 黄色影视在线观看| 中文字幕久久综合| 成年人免费网站在线观看| 国产成人aa精品一区在线播放| 视频在线观看成人| 人妻精品无码一区二区三区| www.成人在线.com| 亚洲第一综合网站| 超碰中文字幕在线观看| 欧美激情性做爰免费视频| 国产日韩三级在线| 久久久精品动漫| 2019天天干夜夜操| 国产精品冒白浆免费视频| 一个人看的www在线免费观看| 99中文字幕一区| 51自拍视频在线观看| 小鲜肉gaygays免费动漫| 国产高清自拍视频在线观看| 免费看男女www网站入口在线| 午夜av免费在线观看| 国产成人aaa| 黄页在线免费看| 97在线免费视频| 福利一区二区三区视频在线观看| 欧美不卡在线观看| 色94色欧美sute亚洲13| 亚洲视频国产视频| 国产毛片一区二区三区va在线| 青青青手机在线视频| 日韩在线观看免费全| 国产免费一区二区三区四区| 亚洲精品18| 国产精品国产三级国产专区53| 男女av免费观看| 一区二区三区视频免费观看| 亚洲深夜av| 日韩欧美一区免费| 国产一区二区区别| 欧美日韩国产综合草草| 同性恋视频一区| 国产一区二区三区免费在线观看| 精品人妻无码一区二区三区换脸| 波多野结衣亚洲一二三| 日韩av男人的天堂| eeuss影院在线| 日本在线观看视频一区| xxxx18国产| 欧美亚洲爱爱另类综合| 欧美日韩免费在线视频| 性生活黄色大片| 国产精品乱子乱xxxx| 免费看成人a| 中文字幕在线久热精品| 三上悠亚在线一区二区| 亚洲精品福利在线观看| 日本综合视频| 欧美性猛交xxxx乱| 亚洲免费在线视频观看| 男人的天堂va免费视频| 亚洲一区影音先锋| 8x8ⅹ拨牐拨牐拨牐在线观看| 欧美午夜精品一区二区三区电影| 日韩一级片播放| 九色porn| 成人福利免费观看| 日韩精品一区二区亚洲av性色| 国产另类ts人妖一区二区| 欧美日韩高清在线| 亚洲熟女少妇一区二区| www.天堂在线观看| 嫩草嫩草嫩草嫩草| 黄页网址大全在线观看| 亚洲欧美制服综合另类| 欧美大胆a人体大胆做受| 欧美一级特黄高清视频| 亚洲高潮女人毛茸茸| 亚洲色精品三区二区一区| 夜夜嗨av一区二区三区中文字幕| 天堂中文av在线资源库| 欧美日韩免费观看一区二区三区| 日本欧美www| 天堂影院一区二区| 国产精品久久久久久久久久免费看| 88国产精品视频一区二区三区| 怡红院av一区二区三区| jizzjizz日本少妇| 久久综合久久99| 亚洲1区2区3区视频| 国产裸舞福利在线视频合集| 亚洲男人第一av网站| 好吊色欧美一区二区三区| 午夜啪啪小视频| 色哟哟一一国产精品| 国产亚洲色婷婷久久| 成人免费视频在线观看超级碰| 不卡视频在线看| 青青影院在线观看| av在线女优影院| 日本中文字幕一区二区有限公司| 国产精品乱码一区二区三区| 91成人破解版| 91在线免费视频| 99国产高清| 草色在线视频| chinesespank调教| 日韩理论在线| 国产欧美日韩综合精品一区二区| 色哟哟网站入口亚洲精品| 成人蜜臀av电影| 国产精品v欧美精品v日本精品动漫| 国产成人啪午夜精品网站男同| 99久久国产热无码精品免费| 国产极品jizzhd欧美| 欧美日韩国产免费| 老司机午夜福利视频| 图片区乱熟图片区亚洲| 中文字幕在线播| 免费观看v片在线观看| 久草在线在线| 久久国产福利国产秒拍| 亚洲精品免费电影| 日韩精品一级毛片在线播放| 99国产精品免费| 亚洲成人黄色| 日本裸体美女视频| 国产成人精品午夜视频免费| 久久久av电影| 中文字幕第一页av| 国产精品盗摄一区二区三区| 国产高潮流白浆| 国产丝袜控视频在线观看| 在线观看天堂av| 91精品国产日韩91久久久久久| 亚洲精品老司机| 性高潮久久久久久久久久| 日韩欧美亚洲成人| 国产在线精品一区二区三区| 国产欧美一区二区三区小说| 久久激情视频免费观看| 舐め犯し波多野结衣在线观看| 久久99久久亚洲国产| 久久99精品久久久久久三级| 欧美xxxx综合视频| 亚洲色图色老头| 狠狠色一日本高清视频| 一区二区三区短视频| 成人动漫在线视频| 亚洲aaa级| 日本国产一区| 97视频在线播放| 日韩三级在线免费观看| 一本一道精品欧美中文字幕| 91在线观看免费| 亚洲第一免费网站| 粉嫩aⅴ一区二区三区四区五区| 国产农村妇女aaaaa视频| 国产专区中文字幕| 亚洲精品一二三区区别| 青青草影院在线观看| 久久不见久久见中文字幕免费| 国产女精品视频网站免费| 成人在线视频免费观看| 3751色影院一区二区三区| 日韩电影天堂视频一区二区| 高清国产午夜精品久久久久久| 日产乱码一卡二卡三免费| 免费观看的黄色网址| 日本妇乱大交xxxxx| 中文字幕精品一区二区三区在线| 国产精品久久久亚洲| 日韩av在线网页| 亚洲国产一区自拍| 在线精品小视频| 国产精品久久国产精品99gif| 国产精品麻豆免费版| 日韩欧美aaaaaa|