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

Redis中萬金油的String,為什么不好用了?

開發 前端
在這篇文章中,我們將顛覆以往對 String 數據類型的傳統認知。以前,String 被視為一種“萬金油”,在各種場合都被廣泛使用。然而,當存儲的鍵值對數據本身占用的內存空間較小時,String 類型的元數據開銷占據了主導地位。

今天,我們先了解下 String 類型的內存空間消耗問題,以及選擇節省內存開銷的數據類型的解決方案。

我想和你分享一個之前我面臨的需求案例。

曾經,我們面臨著一個任務,要創建一個高效的圖片存儲系統,要求這個系統能夠快速記錄圖片 ID 和圖片在存儲系統中的唯一標識(我們稱之為圖片存儲對象 ID)。此外,還需要能夠通過圖片 ID 快速檢索到相應的圖片存儲對象 ID。

考慮到圖片數量龐大,我們決定使用 10 位數字來表示圖片 ID 和圖片存儲對象 ID。舉個例子,圖片 ID 可能是 1101000051,對應的存儲對象 ID 則是 3301000051。

photo_id: 1101000051

photo_obj_id: 3301000051

這個案例很明顯地展現了“鍵 - 單值”模式。在這種模式中,每個鍵值對中的值都是一個單一的值,而不是一個值的集合,與 String 類型的數據存儲方式完美契合。

另外,String 類型的數據可以保存二進制字節流,這使得它非常靈活,只需將數據轉換成二進制字節數組,就可以輕松地進行存儲。

因此,我們的初始解決方案是使用 String 類型來存儲數據。我們將圖片 ID 和圖片存儲對象 ID 分別用作鍵值對中的鍵和值,其中圖片存儲對象 ID 使用了 String 類型。

最初,我們成功地存儲了一億張圖片,大約使用了 6.4GB 的內存。但是,隨著圖片數據不斷增加,我們開始遇到了問題,Redis 實例的內存使用量不斷上升,導致生成 RDB 文件時出現延遲的情況。顯然,String 類型并不是一個適合大規模數據存儲的理想選擇,因此我們需要尋找更為節省內存開銷的數據類型解決方案。

在這個過程中,我深入研究了 String 類型的底層結構,找出了它內存開銷較大的原因。這讓我對這個“通用型”的 String 數據類型有了新的認識,它并不適用于所有情況,尤其在內存空間消耗方面存在明顯短板。

與此同時,我還仔細研究了集合類型的數據結構,發現它們具有非常高效的內存管理結構。但是,集合類型的數據結構通常用于保存一鍵多值的數據,不太適用于直接存儲單一鍵對應的單一值。因此,我們采用了二級編碼的方法,成功地使用集合類型來存儲單一鍵值對。這種改變顯著降低了 Redis 實例的內存開銷。

在本篇文章中,我將與你分享我在解決這一問題過程中所獲得的經驗和方法,包括 String 類型的內存開銷問題,可節省內存的數據結構選擇,以及如何使用集合類型來存儲單一鍵值對。如果你在使用 String 類型時也遇到了內存開銷較大的問題,那么今天的解決方案可能會對你有所幫助。

接下來,我們先來看看 String 類型的內存都消耗在哪里了。

為什么 String 類型內存開銷大?

在剛才的案例中,我們保存了 1 億張圖片的信息,用了約 6.4GB 的內存,一個圖片 ID 和圖片存儲對象 ID 的記錄平均用了 64 字節。

但問題是,一組圖片 ID 及其存儲對象 ID 的記錄,實際只需要 16 字節就可以了。

我們來分析一下。圖片 ID 和圖片存儲對象 ID 都是 10 位數,我們可以用兩個 8 字節的 Long 類型表示這兩個 ID。因為 8 字節的 Long 類型最大可以表示 2 的 64 次方的數值,所以肯定可以表示 10 位數。但是,為什么 String 類型卻用了 64 字節呢?

其實,除了記錄實際數據,String 類型還需要額外的內存空間記錄數據長度、空間使用等信息,這些信息也叫作元數據。當實際保存的數據較小時,元數據的空間開銷就顯得比較大了,有點“喧賓奪主”的意思。

那么,String 類型具體是怎么保存數據的呢?我來解釋一下。

當你保存 64 位有符號整數時,String 類型會把它保存為一個 8 字節的 Long 類型整數,這種保存方式通常也叫作 int 編碼方式。

但是,當你保存的數據中包含字符時,String 類型就會用簡單動態字符串(Simple Dynamic String,SDS)結構體來保存,如下圖所示:

圖片圖片

buf:字節數組,保存實際數據。為了表示字節數組的結束,Redis 會自動在數組最后加一個“\0”,這就會額外占用 1 個字節的開銷。

len:占 4 個字節,表示 buf 的已用長度。

alloc:也占個 4 字節,表示 buf 的實際分配長度,一般大于 len。

可以看到,在 SDS 中,buf 保存實際數據,而 len 和 alloc 本身其實是 SDS 結構體的額外開銷。

另外,對于 String 類型來說,除了 SDS 的額外開銷,還有一個來自于 RedisObject 結構體的開銷。

因為 Redis 的數據類型有很多,而且,不同數據類型都有些相同的元數據要記錄(比如最后一次訪問的時間、被引用的次數等),所以,Redis 會用一個 RedisObject 結構體來統一記錄這些元數據,同時指向實際數據。

一個 RedisObject 包含了 8 字節的元數據和一個 8 字節指針,這個指針再進一步指向具體數據類型的實際數據所在,例如指向 String 類型的 SDS 結構所在的內存地址,可以看一下下面的示意圖。關于 RedisObject 的具體結構細節,我會在后面的課程中詳細介紹,現在你只要了解它的基本結構和元數據開銷就行了。

圖片圖片

為了節省內存空間,Redis 還對 Long 類型整數和 SDS 的內存布局做了專門的設計。

一方面,當保存的是 Long 類型整數時,RedisObject 中的指針就直接賦值為整數數據了,這樣就不用額外的指針再指向整數了,節省了指針的空間開銷。

另一方面,當保存的是字符串數據,并且字符串小于等于 44 字節時,RedisObject 中的元數據、指針和 SDS 是一塊連續的內存區域,這樣就可以避免內存碎片。這種布局方式也被稱為 embstr 編碼方式。

當然,當字符串大于 44 字節時,SDS 的數據量就開始變多了,Redis 就不再把 SDS 和 RedisObject 布局在一起了,而是會給 SDS 分配獨立的空間,并用指針指向 SDS 結構。這種布局方式被稱為 raw 編碼模式。

為了幫助你理解 int、embstr 和 raw 這三種編碼模式,我畫了一張示意圖,如下所示:

圖片圖片

好了,知道了 RedisObject 所包含的額外元數據開銷,現在,我們就可以計算 String 類型的內存使用量了。

因為 10 位數的圖片 ID 和圖片存儲對象 ID 是 Long 類型整數,所以可以直接用 int 編碼的 RedisObject 保存。每個 int 編碼的 RedisObject 元數據部分占 8 字節,指針部分被直接賦值為 8 字節的整數了。此時,每個 ID 會使用 16 字節,加起來一共是 32 字節。但是,另外的 32 字節去哪兒了呢?

Redis 會使用一個全局哈希表保存所有鍵值對,哈希表的每一項是一個 dictEntry 的結構體,用來指向一個鍵值對。dictEntry 結構中有三個 8 字節的指針,分別指向 key、value 以及下一個 dictEntry,三個指針共 24 字節,如下圖所示:

圖片圖片

但是,這三個指針只有 24 字節,為什么會占用了 32 字節呢?這就要提到 Redis 使用的內存分配庫 jemalloc 了。

jemalloc 在分配內存時,會根據我們申請的字節數 N,找一個比 N 大,但是最接近 N 的 2 的冪次數作為分配的空間,這樣可以減少頻繁分配的次數。

舉個例子。如果你申請 6 字節空間,jemalloc 實際會分配 8 字節空間;如果你申請 24 字節空間,jemalloc 則會分配 32 字節。所以,在我們剛剛說的場景里,dictEntry 結構就占用了 32 字節。

好了,到這兒,你應該就能理解,為什么用 String 類型保存圖片 ID 和圖片存儲對象 ID 時需要用 64 個字節了。

你看,明明有效信息只有 16 字節,使用 String 類型保存時,卻需要 64 字節的內存空間,有 48 字節都沒有用于保存實際的數據。我們來換算下,如果要保存的圖片有 1 億張,那么 1 億條的圖片 ID 記錄就需要 6.4GB 內存空間,其中有 4.8GB 的內存空間都用來保存元數據了,額外的內存空間開銷很大。那么,有沒有更加節省內存的方法呢?

用什么數據結構可以節省內存?

Redis 有一種底層數據結構,叫壓縮列表(ziplist),這是一種非常節省內存的結構。

我們先回顧下壓縮列表的構成。表頭有三個字段 zlbytes、zltail 和 zllen,分別表示列表長度、列表尾的偏移量,以及列表中的 entry 個數。壓縮列表尾還有一個 zlend,表示列表結束。

圖片圖片

壓縮列表之所以能節省內存,就在于它是用一系列連續的 entry 保存數據。每個 entry 的元數據包括下面幾部分。

prev_len,表示前一個 entry 的長度。prev_len 有兩種取值情況:1 字節或 5 字節。取值 1 字節時,表示上一個 entry 的長度小于 254 字節。雖然 1 字節的值能表示的數值范圍是 0 到 255,但是壓縮列表中 zlend 的取值默認是 255,因此,就默認用 255 表示整個壓縮列表的結束,其他表示長度的地方就不能再用 255 這個值了。所以,當上一個 entry 長度小于 254 字節時,prev_len 取值為 1 字節,否則,就取值為 5 字節。

len:表示自身長度,4 字節;

encoding:表示編碼方式,1 字節;

content:保存實際數據。

這些 entry 會挨個兒放置在內存中,不需要再用額外的指針進行連接,這樣就可以節省指針所占用的空間。

我們以保存圖片存儲對象 ID 為例,來分析一下壓縮列表是如何節省內存空間的。

每個 entry 保存一個圖片存儲對象 ID(8 字節),此時,每個 entry 的 prev_len 只需要 1 個字節就行,因為每個 entry 的前一個 entry 長度都只有 8 字節,小于 254 字節。這樣一來,一個圖片的存儲對象 ID 所占用的內存大小是 14 字節(1+4+1+8=14),實際分配 16 字節。

Redis 基于壓縮列表實現了 List、Hash 和 Sorted Set 這樣的集合類型,這樣做的最大好處就是節省了 dictEntry 的開銷。當你用 String 類型時,一個鍵值對就有一個 dictEntry,要用 32 字節空間。但采用集合類型時,一個 key 就對應一個集合的數據,能保存的數據多了很多,但也只用了一個 dictEntry,這樣就節省了內存。

這個方案聽起來很好,但還存在一個問題:在用集合類型保存鍵值對時,一個鍵對應了一個集合的數據,但是在我們的場景中,一個圖片 ID 只對應一個圖片的存儲對象 ID,我們該怎么用集合類型呢?換句話說,在一個鍵對應一個值(也就是單值鍵值對)的情況下,我們該怎么用集合類型來保存這種單值鍵值對呢?

如何用集合類型保存單值的鍵值對?

在保存單值的鍵值對時,可以采用基于 Hash 類型的二級編碼方法。這里說的二級編碼,就是把一個單值的數據拆分成兩部分,前一部分作為 Hash 集合的 key,后一部分作為 Hash 集合的 value,這樣一來,我們就可以把單值數據保存到 Hash 集合中了。

以圖片 ID 1101000060 和圖片存儲對象 ID 3302000080 為例,我們可以把圖片 ID 的前 7 位(1101000)作為 Hash 類型的鍵,把圖片 ID 的最后 3 位(060)和圖片存儲對象 ID 分別作為 Hash 類型值中的 key 和 value。

按照這種設計方法,我在 Redis 中插入了一組圖片 ID 及其存儲對象 ID 的記錄,并且用 info 命令查看了內存開銷,我發現,增加一條記錄后,內存占用只增加了 16 字節,如下所示:

127.0.0.1:6379> info memory
# Memory
used_memory:1039120
127.0.0.1:6379> hset 1101000 060 3302000080
(integer) 1
127.0.0.1:6379> info memory
# Memory
used_memory:1039136

在使用 String 類型時,每個記錄需要消耗 64 字節,這種方式卻只用了 16 字節,所使用的內存空間是原來的 1/4,滿足了我們節省內存空間的需求。

不過,你可能也會有疑惑:“二級編碼一定要把圖片 ID 的前 7 位作為 Hash 類型的鍵,把最后 3 位作為 Hash 類型值中的 key 嗎?”其實,二級編碼方法中采用的 ID 長度是有講究的

Redis Hash 類型的兩種底層實現結構,分別是壓縮列表和哈希表。

那么,Hash 類型底層結構什么時候使用壓縮列表,什么時候使用哈希表呢?其實,Hash 類型設置了用壓縮列表保存數據時的兩個閾值,一旦超過了閾值,Hash 類型就會用哈希表來保存數據了。

這兩個閾值分別對應以下兩個配置項:

hash-max-ziplist-entries:表示用壓縮列表保存時哈希集合中的最大元素個數。

hash-max-ziplist-value:表示用壓縮列表保存時哈希集合中單個元素的最大長度。

如果我們往 Hash 集合中寫入的元素個數超過了 hash-max-ziplist-entries,或者寫入的單個元素大小超過了 hash-max-ziplist-value,Redis 就會自動把 Hash 類型的實現結構由壓縮列表轉為哈希表。

一旦從壓縮列表轉為了哈希表,Hash 類型就會一直用哈希表進行保存,而不會再轉回壓縮列表了。在節省內存空間方面,哈希表就沒有壓縮列表那么高效了。

為了能充分使用壓縮列表的精簡內存布局,我們一般要控制保存在 Hash 集合中的元素個數。所以,在剛才的二級編碼中,我們只用圖片 ID 最后 3 位作為 Hash 集合的 key,也就保證了 Hash 集合的元素個數不超過 1000,同時,我們把 hash-max-ziplist-entries 設置為 1000,這樣一來,Hash 集合就可以一直使用壓縮列表來節省內存空間了。

小結

在這篇文章中,我們將顛覆以往對 String 數據類型的傳統認知。以前,String 被視為一種“萬金油”,在各種場合都被廣泛使用。然而,當存儲的鍵值對數據本身占用的內存空間較小時,String 類型的元數據開銷占據了主導地位。這些開銷包括 RedisObject 結構、SDS 結構以及dictEntry 結構的內存消耗。

為了應對這種情況,我們可以采用壓縮列表(ziplist)來存儲數據。當然,當使用 Hash 這種集合類型來保存單一鍵值對數據時,我們需要將單一值數據分割成兩部分,分別作為 Hash 集合的鍵和值。就像之前案例中使用了二級編碼來表示圖片 ID那樣,我們鼓勵你將這一方法應用到你的具體場景中。這不僅可以減少內存開銷,還能提高 Redis 的性能。希望這個解決方案對你的應用有所幫助。

責任編輯:武曉燕 來源: 碼農本農
相關推薦

2020-04-28 17:13:12

箭頭函數ES6函數

2020-11-02 17:34:22

數據分析人工智能技術

2023-06-30 07:19:25

電源供電顯卡

2021-06-29 15:39:16

容器技術Redis

2021-06-29 07:19:06

Redis容器化K8S

2014-10-20 10:53:13

ArubaWi-Fi無線網絡

2023-03-13 00:21:21

調試器斷點開發者

2024-12-26 09:58:18

2025-04-24 08:25:00

2023-10-25 16:36:06

數字化轉型IT系統

2021-08-16 13:44:37

手機電子日本

2021-01-28 14:41:08

麥肯錫數字化項目

2021-12-15 10:20:08

緩存架構開發

2025-07-16 09:07:24

緩存架構開發

2021-11-08 11:21:18

redis 淘汰算法

2018-07-01 08:34:09

緩存數據服務

2022-06-07 17:01:31

UI框架前端

2019-10-15 09:46:46

機器學習人工智能計算機

2013-02-22 09:43:41

面向對象面向對象編程

2025-01-20 08:10:00

AI模型研究
點贊
收藏

51CTO技術棧公眾號

亚洲都市激情| 蜜桃在线视频| 岛国精品在线观看| 91高清视频免费| 欧美一区二区三区观看| 日韩精品中文字幕吗一区二区| 亚洲午夜久久久久久久久久久 | 午夜啪啪免费视频| 国产综合视频在线| 奇米精品一区二区三区四区| 欧美日韩爱爱视频| 欧美人妻一区二区三区| 一区二区三区在线免费看| 色婷婷国产精品| 少妇高潮大叫好爽喷水| 青青草视频免费在线观看| 激情五月激情综合网| 欧美在线国产精品| 欧美亚洲日本在线| 成人黄色小视频| 亚洲精品福利视频| 人妻换人妻仑乱| 日韩免费小视频| 亚洲影视在线播放| 手机成人av在线| 国内av一区二区三区| 成人av网站免费| 91亚洲人电影| 波多野结衣高清视频| 国产日韩欧美一区| 久久99热这里只有精品国产| 美女网站视频色| 国产一区二区三区天码| 日韩av网站电影| 中文字幕天堂av| 日韩免费高清视频网站| 欧美日韩免费一区二区三区 | 精品国产免费人成网站| 亚洲国产日韩在线一区模特| 99亚洲精品视频| 97超碰人人在线| 国产日本欧美一区二区| 精品麻豆av| 欧洲av在线播放| 国产91在线看| 97人人干人人| www.av导航| 国产毛片一区二区| 亚洲xxxx视频| 99在线观看精品视频| 国内精品第一页| 国产日韩在线精品av| 一区二区乱子伦在线播放| 日韩在线卡一卡二| 国产精品极品美女在线观看免费 | 黄视频网站在线观看| 亚洲一区二区三区视频在线播放| 日本高清xxxx| av网址在线看| 亚洲精品视频免费观看| 欧美少妇一区二区三区| 污污片在线免费视频| 一区二区三区四区在线播放| 国产成人一区二区三区别| 日本在线视频中文有码| 亚洲www啪成人一区二区麻豆| 欧美黑人经典片免费观看 | 国产欧美日韩亚洲精品| 亚洲天堂免费av| 久久99久久99| 91在线免费看片| 日本高清视频免费看| 久久一区二区视频| 先锋影音一区二区三区| 麻豆电影在线播放| 亚洲一区二区精品视频| 欧美 国产 综合| 国产一区二区三区四区五区3d| 欧美美女一区二区三区| 在线中文字日产幕| 欧美一区 二区| 中文国产亚洲喷潮| 东方av正在进入| 一本久久综合| 国产精品一区专区欧美日韩| 国产黄色一级大片| www.在线欧美| 亚洲免费视频一区| 欧美人与性动交α欧美精品济南到| 亚洲va欧美va天堂v国产综合| 人妻少妇被粗大爽9797pw| 日韩免费在线电影| 精品国产乱码久久久久久老虎| 超碰97人人干| 亚洲欧美偷拍自拍| 欧美一级在线亚洲天堂| 亚洲视频一区在线播放| 成人高清伦理免费影院在线观看| 欧美资源一区| 毛片大全在线观看| 欧美色精品在线视频| www.555国产精品免费| 精品国产99| 国精产品一区一区三区有限在线| 国产精品午夜一区二区| 成人午夜视频在线| 在线一区日本视频| 一级毛片久久久| 日韩女优av电影| 嘿嘿视频在线观看| 国产视频一区三区| 91九色露脸| 成年人在线视频免费观看| 亚洲一区二区三区四区五区黄| 黄色永久免费网站| 日韩av黄色在线| 欧美国产极速在线| 国产午夜无码视频在线观看| 成人精品免费网站| 中文字幕中文字幕在线中心一区| 亚洲国产福利| 亚洲国产美女久久久久| 国产av无码专区亚洲av毛网站| 国产欧美日韩一区二区三区在线| 91在线中文字幕| 91精品国产91久久久久游泳池| 日韩欧美在线观看| 欧美肉大捧一进一出免费视频| 一区二区日韩欧美| 国产精品视频一区二区高潮| 欧美孕妇孕交xxⅹ孕妇交| 亚洲成人在线观看视频| 91丨porny丨九色| 亚洲国产精品久久久久蝴蝶传媒| 国产精品黄视频| 国产黄色片在线播放| 岛国av一区二区在线在线观看| 99热超碰在线| 国产精品观看| av资源站久久亚洲| 污视频网站在线免费| 91精品国产综合久久精品app | 欧美韩日高清| 国产精品久久一区| 国产在线中文字幕| 91官网在线免费观看| 国产成人无码精品久久二区三| 中日韩视频在线观看| 精品高清视频| 欧美三级网站| 亚洲视频自拍偷拍| 亚洲午夜在线播放| 亚洲欧美自拍偷拍| 色综合五月婷婷| 午夜久久一区| 国产精品久久亚洲7777| gogo久久| 亚洲男人av在线| 欧美brazzers| 国产女人aaa级久久久级| 一区二区三区视频在线观看免费| 青青草国产成人a∨下载安卓| 国产精品久久久久久久久久新婚 | 日本一级在线观看| 日韩欧美精品在线观看| 国内精品卡一卡二卡三| 久久99精品久久久久久国产越南| 久久免费视频2| 中文字幕一区二区三区日韩精品| 久久久久久久成人| 青青操在线视频| 欧美日韩一区在线| 一区视频免费观看| 2020国产精品自拍| 欧美精品久久久久久久久25p| 围产精品久久久久久久| av成人免费观看| 中文在线а√在线8| 在线观看日韩www视频免费| 国产精品一级视频| 亚洲大片精品永久免费| www.av天天| 国产一区二区免费在线| 国产极品粉嫩福利姬萌白酱| 欧洲乱码伦视频免费| 91pron在线| 周于希免费高清在线观看| 日韩在线观看免费高清| 蜜桃视频久久一区免费观看入口| 色婷婷av一区二区三区大白胸| 国产高潮流白浆| 91碰在线视频| 伊人成人免费视频| 久久精品一区| 国产av熟女一区二区三区| 精品国产乱码久久久| 91九色视频导航| 欧美久久天堂| 欧美裸体男粗大视频在线观看| 深夜福利免费在线观看| 欧美一级日韩免费不卡| 国产精品一区无码| 亚洲综合一区二区三区| 国产黄色录像视频| 波多野洁衣一区| www.五月天色| 蜜乳av另类精品一区二区| 97超碰免费观看| 国产精品一区二区av日韩在线| 97se视频在线观看| 精品久久久网| 国产成人一区二区三区小说| 色老头在线观看| 日韩在线中文视频| 欧美女子与性| 精品国产免费人成电影在线观看四季 | 一区二区视频欧美| 一个色的综合| 禁果av一区二区三区| 国产精品国产一区二区| 国产美女亚洲精品7777| 国产精品久久激情| 无遮挡爽大片在线观看视频| 欧美夫妻性生活视频| 日本在线免费播放| 国产亚洲视频在线| 日韩a在线观看| 亚洲黄页视频免费观看| 国产成人三级在线播放| 欧美日本一道本| 涩涩视频在线观看| 日本二三区不卡| 天天操中文字幕| 午夜视频一区二区三区| 欧美日韩一级在线观看| 亚洲男人电影天堂| 免费在线黄色网| 亚洲欧洲精品天堂一级| 国产精品视频一区二区在线观看| 国产欧美综合在线观看第十页| 成人免费毛片日本片视频| youjizz久久| 捆绑裸体绳奴bdsm亚洲| 99久久久久免费精品国产 | 欧美国产成人在线| 91视频在线网站| 国产亚洲欧美日韩在线一区| 日韩人妻一区二区三区| 久久久www成人免费毛片麻豆| 三级电影在线看| 久久久噜噜噜久久中文字幕色伊伊 | 日韩在线成人| 成人区精品一区二区| 成人香蕉社区| 久久99精品久久久久久久青青日本| 粉嫩久久久久久久极品| 久久精品aaaaaa毛片| 亚洲人挤奶视频| 天堂一区二区三区| 久久久久av| 成人午夜视频免费观看| 一区二区日本视频| 国产精品少妇在线视频| 蜜臀久久久久久久| 国产精品嫩草影院8vv8| 国产黄色精品网站| 91黄色免费视频| 国产日韩精品一区二区三区| 国产精品情侣呻吟对白视频| 中文字幕一区二区在线观看| 亚洲国产成人精品综合99| 亚洲电影一区二区三区| 中文字幕xxxx| 欧美一区二区免费| 天天舔天天干天天操| 亚洲三级av在线| 国产激情在线视频| 97免费在线视频| 91精品影视| 91中文字精品一区二区| 要久久爱电视剧全集完整观看 | 欧美精品 日韩| 亚洲国产中文字幕在线| 亚洲人在线视频| 99视频免费在线观看| 97国产精品人人爽人人做| 国产私拍福利精品视频二区| 亚洲影院色无极综合| 日韩成人av在线资源| 夜夜爽99久久国产综合精品女不卡 | 青青草一区二区| 亚洲我射av| 免费看成人av| 中文字幕乱码亚洲无线精品一区| 尤物av无码色av无码| 久久97超碰色| 欧洲女同同性吃奶| 一区二区高清视频在线观看| 久操视频在线免费观看| 精品久久人人做人人爽| 成人动漫在线播放| 69视频在线播放| 欧一区二区三区| 亚欧精品在线| 一本色道88久久加勒比精品| 精品人妻一区二区三| 国产丝袜在线精品| 日韩av无码中文字幕| 欧美一级免费观看| 在线观看免费版| 欧美在线中文字幕| 国产精品香蕉| 久久久久久久久网| 麻豆国产精品视频| 91精品人妻一区二区| 亚洲福利国产精品| 国产美女主播在线观看| 国产一区二区三区在线播放免费观看| 成人爽a毛片免费啪啪动漫| 国产在线精品一区免费香蕉| 免费一区二区三区视频导航| 日韩精品久久一区二区| 国产一区二区调教| 老司机福利在线观看| 色婷婷av一区二区三区之一色屋| 欧美一区二区三区黄片| 欧美精品制服第一页| 亚洲一区有码| 亚洲丰满在线| 日本不卡一区二区三区高清视频| 在线观看国产三级| 亚洲h在线观看| www.日日夜夜| 欧美另类极品videosbestfree| 偷拍自拍亚洲| 夜夜爽www精品| 精品在线亚洲视频| 免费黄色国产视频| 欧美日韩精品一区二区三区四区| 国产中文在线观看| 国产精品久久久久久av| 国产精品自拍区| 日韩精品无码一区二区三区免费| 91亚洲精品久久久蜜桃| 欧美一区二区三区四| 日韩成人在线视频观看| 伊人成综合网站| 蜜桃麻豆91| 三级久久三级久久久| 亚洲综合欧美综合| 欧美日韩你懂得| 国产黄网站在线观看| 92国产精品视频| 黄色亚洲大片免费在线观看| 永久免费未满蜜桃| 色综合天天性综合| 国产大学生校花援交在线播放| 国产精品黄视频| 91视频综合| 欧美日韩一区二区区| 亚洲成人黄色影院| 你懂的在线视频| 国产精品久久久av| 亚洲综合自拍| 国产高清成人久久| 色狠狠一区二区三区香蕉| 69xxxx欧美| 97超碰资源| 亚洲伊人观看| 免费黄色在线网址| 日韩美女在线视频| 麻豆蜜桃在线观看| 台湾成人av| 岛国精品在线播放| 久久久久久无码精品大片| 久久久www成人免费精品| 超碰精品在线| 亚洲乱码国产一区三区| 国产精品久久毛片| 欧美一区二区黄片| 国产精品入口夜色视频大尺度 | 成人av无码一区二区三区| 国内精品免费午夜毛片| 国产一区二区三区91| wwwxxx色| 在线看不卡av| 欧美大片黄色| 日韩电影免费观看高清完整| 黄色日韩网站视频| 久久久国产精品成人免费| 日日骚久久av| 日韩免费电影在线观看| 黄色一级片免费的| 五月天欧美精品| 黄色av免费在线| 久久综合一区二区三区| 国产精品自拍毛片| 国产91国语对白在线| 欧美日韩xxxxx| 99热精品久久|