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

你知道快速的Redis有哪些慢操作嗎?

數(shù)據(jù)庫 Redis
我們學(xué)習(xí)了 Redis 的底層數(shù)據(jù)結(jié)構(gòu),這既包括了 Redis 中用來保存每個鍵和值的全局哈希表結(jié)構(gòu),也包括了支持集合類型實(shí)現(xiàn)的雙向鏈表、壓縮列表、整數(shù)數(shù)組、哈希表和跳表這五大底層結(jié)構(gòu)。

當(dāng)談到 Redis 時,我們通常會聯(lián)想到一個關(guān)鍵詞:“速度”。然而,你是否曾思考過 Redis 之所以如此迅猛,到底在哪里呢?實(shí)際上,這其中有一個關(guān)鍵特性:Redis 能夠在微秒級別內(nèi)找到數(shù)據(jù)并快速執(zhí)行操作。

那么,Redis 為何在眾多數(shù)據(jù)庫中脫穎而出呢?這其中有幾個關(guān)鍵因素。首先,Redis 是一種內(nèi)存數(shù)據(jù)庫,它的所有操作都在內(nèi)存中進(jìn)行,而內(nèi)存的訪問速度本身就非常快。此外,Redis 還依賴于高效的數(shù)據(jù)結(jié)構(gòu)。這是因?yàn)?Redis 的鍵值對實(shí)際上是按照特定的數(shù)據(jù)結(jié)構(gòu)組織的,因此鍵值對的操作實(shí)際上是對數(shù)據(jù)結(jié)構(gòu)進(jìn)行增刪改查操作,高效的數(shù)據(jù)結(jié)構(gòu)是 Redis 處理數(shù)據(jù)的基礎(chǔ)。在這節(jié)課中,我們將深入探討這些數(shù)據(jù)結(jié)構(gòu)。

也許你會說:“這些我都知道,這不就是 Redis 的數(shù)據(jù)類型嗎?包括字符串、列表、哈希、集合和有序集合?”不過,這些只是 Redis 鍵值對中值的數(shù)據(jù)類型,也就是數(shù)據(jù)的存儲方式。而在這里,我們所說的數(shù)據(jù)結(jié)構(gòu),指的是要深入了解它們的底層實(shí)現(xiàn)原理。

以簡單明了的方式來描述,總共有 6 種底層數(shù)據(jù)結(jié)構(gòu),它們與數(shù)據(jù)類型之間存在如下對應(yīng)關(guān)系,具體如下圖所示:

可以看到,String 類型的底層實(shí)現(xiàn)只有一種數(shù)據(jù)結(jié)構(gòu),也就是簡單動態(tài)字符串。而 List、Hash、Set 和 Sorted Set 這四種數(shù)據(jù)類型,都有兩種底層實(shí)現(xiàn)結(jié)構(gòu)。通常情況下,我們會把這四種類型稱為集合類型,它們的特點(diǎn)是一個鍵對應(yīng)了一個集合的數(shù)據(jù)。

看到這里,其實(shí)有些問題已經(jīng)值得我們?nèi)タ紤]了:

  • 這些數(shù)據(jù)結(jié)構(gòu)都是值的底層實(shí)現(xiàn),鍵和值本身之間用什么結(jié)構(gòu)組織?
  • 為什么集合類型有那么多的底層結(jié)構(gòu),它們都是怎么組織數(shù)據(jù)的,都很快嗎?
  • 什么是簡單動態(tài)字符串,和常用的字符串是一回事嗎?

接下來,我就和你聊聊前兩個問題。這樣,你不僅可以知道 Redis“快”的基本原理,還可以借此理解 Redis 中有哪些潛在的“慢操作”,最大化 Redis 的性能優(yōu)勢。而關(guān)于簡單動態(tài)字符串,我會在后面的課程中再和你討論。

我們先來看看鍵和值之間是用什么結(jié)構(gòu)組織的。

鍵和值用什么結(jié)構(gòu)組織?

為了實(shí)現(xiàn)從鍵到值的快速訪問,Redis 使用了一個哈希表來保存所有鍵值對。

一個哈希表,其實(shí)就是一個數(shù)組,數(shù)組的每個元素稱為一個哈希桶。所以,我們常說,一個哈希表是由多個哈希桶組成的,每個哈希桶中保存了鍵值對數(shù)據(jù)。

看到這里,你可能會問了:“如果值是集合類型的話,作為數(shù)組元素的哈希桶怎么來保存呢?”其實(shí),哈希桶中的元素保存的并不是值本身,而是指向具體值的指針。這也就是說,不管值是 String,還是集合類型,哈希桶中的元素都是指向它們的指針。

在下圖中,可以看到,哈希桶中的 entry 元素中保存了*key和*value指針,分別指向了實(shí)際的鍵和值,這樣一來,即使值是一個集合,也可以通過*value指針被查找到。

因?yàn)檫@個哈希表保存了所有的鍵值對,所以,我也把它稱為全局哈希表。哈希表的最大好處很明顯,就是讓我們可以用 O(1) 的時間復(fù)雜度來快速查找到鍵值對——我們只需要計(jì)算鍵的哈希值,就可以知道它所對應(yīng)的哈希桶位置,然后就可以訪問相應(yīng)的 entry 元素。

你看,這個查找過程主要依賴于哈希計(jì)算,和數(shù)據(jù)量的多少并沒有直接關(guān)系。也就是說,不管哈希表里有 10 萬個鍵還是 100 萬個鍵,我們只需要一次計(jì)算就能找到相應(yīng)的鍵。

但是,如果你只是了解了哈希表的 O(1) 復(fù)雜度和快速查找特性,那么,當(dāng)你往 Redis 中寫入大量數(shù)據(jù)后,就可能發(fā)現(xiàn)操作有時候會突然變慢了。這其實(shí)是因?yàn)槟愫雎粤艘粋€潛在的風(fēng)險點(diǎn),那就是哈希表的沖突問題和 rehash 可能帶來的操作阻塞。

為什么哈希表操作變慢了?

當(dāng)你往哈希表中寫入更多數(shù)據(jù)時,哈希沖突是不可避免的問題。這里的哈希沖突,也就是指,兩個 key 的哈希值和哈希桶計(jì)算對應(yīng)關(guān)系時,正好落在了同一個哈希桶中。

畢竟,哈希桶的個數(shù)通常要少于 key 的數(shù)量,這也就是說,難免會有一些 key 的哈希值對應(yīng)到了同一個哈希桶中。

Redis 解決哈希沖突的方式,就是鏈?zhǔn)焦!f準(zhǔn)焦R埠苋菀桌斫猓褪侵竿粋€哈希桶中的多個元素用一個鏈表來保存,它們之間依次用指針連接。

如下圖所示:entry1、entry2 和 entry3 都需要保存在哈希桶 3 中,導(dǎo)致了哈希沖突。此時,entry1 元素會通過一個*next指針指向 entry2,同樣,entry2 也會通過*next指針指向 entry3。這樣一來,即使哈希桶 3 中的元素有 100 個,我們也可以通過 entry 元素中的指針,把它們連起來。這就形成了一個鏈表,也叫作哈希沖突鏈。

但是,這里依然存在一個問題,哈希沖突鏈上的元素只能通過指針逐一查找再操作。如果哈希表里寫入的數(shù)據(jù)越來越多,哈希沖突可能也會越來越多,這就會導(dǎo)致某些哈希沖突鏈過長,進(jìn)而導(dǎo)致這個鏈上的元素查找耗時長,效率降低。對于追求“快”的 Redis 來說,這是不太能接受的。

所以,Redis 會對哈希表做 rehash 操作。rehash 也就是增加現(xiàn)有的哈希桶數(shù)量,讓逐漸增多的 entry 元素能在更多的桶之間分散保存,減少單個桶中的元素?cái)?shù)量,從而減少單個桶中的沖突。那具體怎么做呢?

其實(shí),為了使 rehash 操作更高效,Redis 默認(rèn)使用了兩個全局哈希表:哈希表 1 和哈希表 2。一開始,當(dāng)你剛插入數(shù)據(jù)時,默認(rèn)使用哈希表 1,此時的哈希表 2 并沒有被分配空間。隨著數(shù)據(jù)逐步增多,Redis 開始執(zhí)行 rehash,這個過程分為三步:

  • 給哈希表 2 分配更大的空間,例如是當(dāng)前哈希表 1 大小的兩倍;
  • 把哈希表 1 中的數(shù)據(jù)重新映射并拷貝到哈希表 2 中;
  • 釋放哈希表 1 的空間。

到此,我們就可以從哈希表 1 切換到哈希表 2,用增大的哈希表 2 保存更多數(shù)據(jù),而原來的哈希表 1 留作下一次 rehash 擴(kuò)容備用。

這個過程看似簡單,但是第二步涉及大量的數(shù)據(jù)拷貝,如果一次性把哈希表 1 中的數(shù)據(jù)都遷移完,會造成 Redis 線程阻塞,無法服務(wù)其他請求。此時,Redis 就無法快速訪問數(shù)據(jù)了。

為了避免這個問題,Redis 采用了漸進(jìn)式 rehash。

簡單來說就是在第二步拷貝數(shù)據(jù)時,Redis 仍然正常處理客戶端請求,每處理一個請求時,從哈希表 1 中的第一個索引位置開始,順帶著將這個索引位置上的所有 entries 拷貝到哈希表 2 中;等處理下一個請求時,再順帶拷貝哈希表 1 中的下一個索引位置的 entries。如下圖所示:

漸進(jìn)式rehash

這樣就巧妙地把一次性大量拷貝的開銷,分?jǐn)偟搅硕啻翁幚碚埱蟮倪^程中,避免了耗時操作,保證了數(shù)據(jù)的快速訪問。

好了,到這里,你應(yīng)該就能理解,Redis 的鍵和值是怎么通過哈希表組織的了。對于 String 類型來說,找到哈希桶就能直接增刪改查了,所以,哈希表的 O(1) 操作復(fù)雜度也就是它的復(fù)雜度了。

但是,對于集合類型來說,即使找到哈希桶了,還要在集合中再進(jìn)一步操作。接下來,我們來看集合類型的操作效率又是怎樣的。

集合數(shù)據(jù)操作效率

和 String 類型不同,一個集合類型的值,第一步是通過全局哈希表找到對應(yīng)的哈希桶位置,第二步是在集合中再增刪改查。那么,集合的操作效率和哪些因素相關(guān)呢?

首先,與集合的底層數(shù)據(jù)結(jié)構(gòu)有關(guān)。例如,使用哈希表實(shí)現(xiàn)的集合,要比使用鏈表實(shí)現(xiàn)的集合訪問效率更高。其次,操作效率和這些操作本身的執(zhí)行特點(diǎn)有關(guān),比如讀寫一個元素的操作要比讀寫所有元素的效率高。

接下來,我們就分別聊聊集合類型的底層數(shù)據(jù)結(jié)構(gòu)和操作復(fù)雜度。

有哪些底層數(shù)據(jù)結(jié)構(gòu)?

剛才,我也和你介紹過,集合類型的底層數(shù)據(jù)結(jié)構(gòu)主要有 5 種:整數(shù)數(shù)組、雙向鏈表、哈希表、壓縮列表和跳表。

其中,哈希表的操作特點(diǎn)我們剛剛已經(jīng)學(xué)過了;整數(shù)數(shù)組和雙向鏈表也很常見,它們的操作特征都是順序讀寫,也就是通過數(shù)組下標(biāo)或者鏈表的指針逐個元素訪問,操作復(fù)雜度基本是 O(N),操作效率比較低;壓縮列表和跳表我們平時接觸得可能不多,但它們也是 Redis 重要的數(shù)據(jù)結(jié)構(gòu),所以我來重點(diǎn)解釋一下。

壓縮列表實(shí)際上類似于一個數(shù)組,數(shù)組中的每一個元素都對應(yīng)保存一個數(shù)據(jù)。和數(shù)組不同的是,壓縮列表在表頭有三個字段 zlbytes、zltail 和 zllen,分別表示列表長度、列表尾的偏移量和列表中的 entry 個數(shù);壓縮列表在表尾還有一個 zlend,表示列表結(jié)束。

在壓縮列表中,如果我們要查找定位第一個元素和最后一個元素,可以通過表頭三個字段的長度直接定位,復(fù)雜度是 O(1)。而查找其他元素時,就沒有這么高效了,只能逐個查找,此時的復(fù)雜度就是 O(N) 了。

我們再來看下跳表。

有序鏈表只能逐一查找元素,導(dǎo)致操作起來非常緩慢,于是就出現(xiàn)了跳表。具體來說,跳表在鏈表的基礎(chǔ)上,增加了多級索引,通過索引位置的幾個跳轉(zhuǎn),實(shí)現(xiàn)數(shù)據(jù)的快速定位,如下圖所示:

跳表的快速查找過程

如果我們要在鏈表中查找 33 這個元素,只能從頭開始遍歷鏈表,查找 6 次,直到找到 33 為止。此時,復(fù)雜度是 O(N),查找效率很低。

為了提高查找速度,我們來增加一級索引:從第一個元素開始,每兩個元素選一個出來作為索引。這些索引再通過指針指向原始的鏈表。例如,從前兩個元素中抽取元素 1 作為一級索引,從第三、四個元素中抽取元素 11 作為一級索引。此時,我們只需要 4 次查找就能定位到元素 33 了。

如果我們還想再快,可以再增加二級索引:從一級索引中,再抽取部分元素作為二級索引。例如,從一級索引中抽取 1、27、100 作為二級索引,二級索引指向一級索引。這樣,我們只需要 3 次查找,就能定位到元素 33 了。

可以看到,這個查找過程就是在多級索引上跳來跳去,最后定位到元素。這也正好符合“跳”表的叫法。當(dāng)數(shù)據(jù)量很大時,跳表的查找復(fù)雜度就是 O(logN)。

好了,我們現(xiàn)在可以按照查找的時間復(fù)雜度給這些數(shù)據(jù)結(jié)構(gòu)分下類了:

不同操作的復(fù)雜度

集合類型的操作類型很多,有讀寫單個集合元素的,例如 HGET、HSET,也有操作多個元素的,例如 SADD,還有對整個集合進(jìn)行遍歷操作的,例如 SMEMBERS。這么多操作,它們的復(fù)雜度也各不相同。而復(fù)雜度的高低又是我們選擇集合類型的重要依據(jù)。

我總結(jié)了一個“四句口訣”,希望能幫助你快速記住集合常見操作的復(fù)雜度。這樣你在使用過程中,就可以提前規(guī)避高復(fù)雜度操作了。

  • 單元素操作是基礎(chǔ);
  • 范圍操作非常耗時;
  • 統(tǒng)計(jì)操作通常高效;

例外情況只有幾個:

第一,單元素操作,是指每一種集合類型對單個數(shù)據(jù)實(shí)現(xiàn)的增刪改查操作。例如,Hash 類型的 HGET、HSET 和 HDEL,Set 類型的 SADD、SREM、SRANDMEMBER 等。這些操作的復(fù)雜度由集合采用的數(shù)據(jù)結(jié)構(gòu)決定,例如,HGET、HSET 和 HDEL 是對哈希表做操作,所以它們的復(fù)雜度都是 O(1);Set 類型用哈希表作為底層數(shù)據(jù)結(jié)構(gòu)時,它的 SADD、SREM、SRANDMEMBER 復(fù)雜度也是 O(1)。

這里,有個地方你需要注意一下,集合類型支持同時對多個元素進(jìn)行增刪改查,例如 Hash 類型的 HMGET 和 HMSET,Set 類型的 SADD 也支持同時增加多個元素。此時,這些操作的復(fù)雜度,就是由單個元素操作復(fù)雜度和元素個數(shù)決定的。例如,HMSET 增加 M 個元素時,復(fù)雜度就從 O(1) 變成 O(M) 了。

第二,范圍操作,是指集合類型中的遍歷操作,可以返回集合中的所有數(shù)據(jù),比如 Hash 類型的 HGETALL 和 Set 類型的 SMEMBERS,或者返回一個范圍內(nèi)的部分?jǐn)?shù)據(jù),比如 List 類型的 LRANGE 和 ZSet 類型的 ZRANGE。這類操作的復(fù)雜度一般是 O(N),比較耗時,我們應(yīng)該盡量避免。

不過,Redis 從 2.8 版本開始提供了 SCAN 系列操作(包括 HSCAN,SSCAN 和 ZSCAN),這類操作實(shí)現(xiàn)了漸進(jìn)式遍歷,每次只返回有限數(shù)量的數(shù)據(jù)。這樣一來,相比于 HGETALL、SMEMBERS 這類操作來說,就避免了一次性返回所有元素而導(dǎo)致的 Redis 阻塞。

第三,統(tǒng)計(jì)操作,是指集合類型對集合中所有元素個數(shù)的記錄,例如 LLEN 和 SCARD。這類操作復(fù)雜度只有 O(1),這是因?yàn)楫?dāng)集合類型采用壓縮列表、雙向鏈表、整數(shù)數(shù)組這些數(shù)據(jù)結(jié)構(gòu)時,這些結(jié)構(gòu)中專門記錄了元素的個數(shù)統(tǒng)計(jì),因此可以高效地完成相關(guān)操作。

第四,例外情況,是指某些數(shù)據(jù)結(jié)構(gòu)的特殊記錄,例如壓縮列表和雙向鏈表都會記錄表頭和表尾的偏移量。這樣一來,對于 List 類型的 LPOP、RPOP、LPUSH、RPUSH 這四個操作來說,它們是在列表的頭尾增刪元素,這就可以通過偏移量直接定位,所以它們的復(fù)雜度也只有 O(1),可以實(shí)現(xiàn)快速操作。

小結(jié)

我們學(xué)習(xí)了 Redis 的底層數(shù)據(jù)結(jié)構(gòu),這既包括了 Redis 中用來保存每個鍵和值的全局哈希表結(jié)構(gòu),也包括了支持集合類型實(shí)現(xiàn)的雙向鏈表、壓縮列表、整數(shù)數(shù)組、哈希表和跳表這五大底層結(jié)構(gòu)。

Redis 之所以能快速操作鍵值對,一方面是因?yàn)?O(1) 復(fù)雜度的哈希表被廣泛使用,包括 String、Hash 和 Set,它們的操作復(fù)雜度基本由哈希表決定,另一方面,Sorted Set 也采用了 O(logN) 復(fù)雜度的跳表。不過,集合類型的范圍操作,因?yàn)橐闅v底層數(shù)據(jù)結(jié)構(gòu),復(fù)雜度通常是 O(N)。這里,我的建議是:用其他命令來替代,例如可以用 SCAN 來代替,避免在 Redis 內(nèi)部產(chǎn)生費(fèi)時的全集合遍歷操作。

當(dāng)然,我們不能忘了復(fù)雜度較高的 List 類型,它的兩種底層實(shí)現(xiàn)結(jié)構(gòu):雙向鏈表和壓縮列表的操作復(fù)雜度都是 O(N)。因此,我的建議是:因地制宜地使用 List 類型。例如,既然它的 POP/PUSH 效率很高,那么就將它主要用于 FIFO 隊(duì)列場景,而不是作為一個可以隨機(jī)讀寫的集合。

Redis 數(shù)據(jù)類型豐富,每個類型的操作繁多,我們通常無法一下子記住所有操作的復(fù)雜度。所以,最好的辦法就是掌握原理,以不變應(yīng)萬變。這里,你可以看到,一旦掌握了數(shù)據(jù)結(jié)構(gòu)基本原理,你可以從原理上推斷不同操作的復(fù)雜度,即使這個操作你不一定熟悉。這樣一來,你不用死記硬背,也能快速合理地做出選擇了。

責(zé)任編輯:趙寧寧 來源: 碼農(nóng)本農(nóng)
相關(guān)推薦

2022-03-22 10:52:02

Redis變慢服務(wù)器

2021-03-11 07:26:52

垃圾回收器單線程

2010-04-16 14:51:05

網(wǎng)絡(luò)流量

2023-04-26 10:06:08

RocketMQ屬性Consumer

2020-03-23 08:15:43

JavaScriptError對象函數(shù)

2022-08-02 06:55:35

移動設(shè)備Android

2022-06-30 13:41:44

SQL 語句group by

2024-05-13 08:16:59

React任務(wù)調(diào)度鏈表結(jié)構(gòu)

2020-11-04 17:35:39

網(wǎng)絡(luò)安全漏洞技術(shù)

2022-12-09 19:00:02

Vite兼容性BigInt

2019-04-30 08:25:35

2021-08-31 09:55:57

服務(wù)開發(fā)K8S

2020-11-23 11:04:17

Redis協(xié)議緩存

2023-01-13 17:02:10

操作系統(tǒng)鴻蒙

2024-10-22 09:59:36

虛擬化容器化系統(tǒng)

2023-04-26 10:21:04

2019-02-21 16:36:16

云服務(wù)器云計(jì)算服務(wù)器

2019-02-23 15:00:43

2023-10-28 09:00:03

進(jìn)程系統(tǒng)服務(wù)

2019-07-04 05:22:02

物聯(lián)網(wǎng)設(shè)備物聯(lián)網(wǎng)IOT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

国产99精品| 日本视频在线播放| 日韩中文字幕亚洲一区二区va在线| 亚洲精品视频中文字幕| 国产视频在线视频| av在线网址观看| 99免费精品在线观看| 国产z一区二区三区| 又嫩又硬又黄又爽的视频| 国产精品欧美一区二区三区不卡 | 女性裸体视频网站| 国产精品jk白丝蜜臀av小说| 在线一区二区三区做爰视频网站| 偷拍盗摄高潮叫床对白清晰| 无码h黄肉3d动漫在线观看| 日韩电影在线免费看| 欧美激情2020午夜免费观看| 蜜桃无码一区二区三区| 中文一区二区三区四区| 欧美日韩黄色影视| 中文字幕乱码人妻综合二区三区| www久久日com| 国产日韩欧美精品在线| 国产伦精品一区二区三区视频免费| 人人草在线观看| 国产精品九九| 久久九九免费视频| 国产精品成人一区二区三区电影毛片| 久久九九精品视频| 欧美视频日韩视频在线观看| 波多野结衣之无限发射| 2024最新电影免费在线观看| 日本一区二区三级电影在线观看 | 68精品国产免费久久久久久婷婷| 国产老头老太做爰视频| 成人av国产| 日韩精品极品在线观看播放免费视频| 永久看看免费大片| 成人在线视频播放| 午夜电影一区二区| 男女激情免费视频| 中文字幕在线三区| 日韩理论片网站| 亚洲精品电影在线一区| 黄色大片在线看| 91视视频在线观看入口直接观看www| 91久久大香伊蕉在人线| 91欧美日韩麻豆精品| 日韩电影在线一区二区三区| 日韩美女视频中文字幕| 久久不卡免费视频| 亚洲三级视频| 午夜精品一区二区三区在线播放 | 国产精品欧美日韩久久| 国产午夜性春猛交ⅹxxx| 1024成人| 97在线观看视频| 97免费在线观看视频| 亚洲激情网址| 欧美亚洲激情视频| 国产精品va无码一区二区三区| 日韩午夜激情| 97久久精品人人澡人人爽缅北| 精品少妇一二三区| 极品少妇一区二区三区| 高清在线视频日韩欧美| 日韩欧美一区二区一幕| aa国产精品| 国产va免费精品高清在线观看| 波多野结衣视频在线看| 蜜臀av一区二区三区| 91久久国产婷婷一区二区| 99久久精品国产成人一区二区| 国产精品综合一区二区三区| 成人资源视频网站免费| 天天干天天草天天射| 久久日韩粉嫩一区二区三区| 日韩精品另类天天更新| 伊人免费在线| 亚洲激情五月婷婷| 亚洲五码在线观看视频| av剧情在线观看| 日本韩国一区二区| 亚洲第一成肉网| 波多野结衣在线一区二区| 日韩国产一区三区| 美国美女黄色片| 女主播福利一区| 国产91精品青草社区| 成人黄色三级视频| 国产主播一区二区| 国产一区在线免费| www 日韩| 亚洲午夜电影在线观看| 熟女性饥渴一区二区三区| 亚洲成人一区在线观看| 日韩一区二区三区免费观看| 女人被狂躁c到高潮| 久久国产精品亚洲人一区二区三区 | 羞羞色午夜精品一区二区三区| 色综合久久精品亚洲国产| 久草视频在线观| 精品午夜久久福利影院| 国产精品自拍首页| 视频免费一区| 福利视频一区二区| 日韩精品在线播放视频| 九九亚洲视频| 久操成人在线视频| 中文字幕乱伦视频| 成a人片亚洲日本久久| 亚洲一区二区在线看| 欧美在线极品| 日韩欧美电影一区| 国产又粗又黄又猛| 1024日韩| 俄罗斯精品一区二区| 成a人片在线观看www视频| 亚洲成在线观看| 成人亚洲免费视频| 精品国产99| 9.1国产丝袜在线观看| 国产三级小视频| 中文字幕免费一区| 人妻熟女一二三区夜夜爱| 视频在线亚洲| 久久久精品一区| 国产裸体美女永久免费无遮挡| av男人天堂一区| 国产精品啪啪啪视频| 国产精品99久久久久久董美香| 亚洲精品www| 久久久久久天堂| 国内成+人亚洲+欧美+综合在线| 日韩国产欧美一区| 波多野结衣亚洲一二三| 亚洲精品久久久久中文字幕二区 | 国产日韩欧美成人| 国产一区二区影视| 日韩成人毛片视频| 久久99九九99精品| 一本色道久久综合亚洲二区三区| 成人性生交大片免费网站| 亚洲国产女人aaa毛片在线| 久久久久久久久久久久久久久久久| 九九热在线视频观看这里只有精品| 欧美一区二区三区精美影视| 国产h片在线观看| 精品盗摄一区二区三区| 精品无码m3u8在线观看| 成人免费观看视频| 欧美又粗又长又爽做受| 91亚洲精品视频在线观看| 欧美丰满老妇厨房牲生活 | 日韩av在线免费看| 男女啊啊啊视频| www欧美成人18+| 成熟老妇女视频| 国产一区二区三区四区五区| 国产99久久久欧美黑人| 黄色毛片在线看| 欧美午夜片在线观看| 亚洲欧美精品久久| 国产一区二区三区精品欧美日韩一区二区三区 | www.五月天激情| 亚洲一区二区三区精品在线| www男人天堂| 国产精品普通话对白| 日韩精品第一页| 性欧美video另类hd尤物| 欧美成年人视频| 熟妇人妻av无码一区二区三区| 午夜精品福利久久久| 免费一级做a爰片久久毛片潮| 天堂av在线一区| 致1999电视剧免费观看策驰影院| 欧美精品三级在线| 97国产精品久久| 国产乱视频在线观看| 欧美福利视频一区| 可以直接看的黄色网址| 99re视频精品| 久久久久免费精品| 欧美黄色一区二区| 人禽交欧美网站免费| 在线日韩三级| 久久免费精品视频| 高h视频在线| 欧美成人一级视频| 国产一区二区视频免费| 亚洲免费av观看| 中文字幕一区二区三区人妻不卡| 另类人妖一区二区av| 成年女人18级毛片毛片免费| 视频一区欧美| 亚洲综合一区二区不卡| 东京一区二区| 欧美精品一区二区免费| 日韩专区一区二区| 91精品国产手机| 久久精品无码av| 亚洲精品久久久久久国产精华液| 熟女俱乐部一区二区| 国产精品88av| 日韩大片一区二区| 在线一区免费观看| 久久久成人精品一区二区三区 | 亚洲一区二区三区欧美| 卡一精品卡二卡三网站乱码| 国产自产女人91一区在线观看| 嗯~啊~轻一点视频日本在线观看| 影音先锋欧美精品| 日韩在线视频第一页| 欧美精品高清视频| 精品久久久久久久久久久久久久久久| 亚洲精品国产精华液| 青娱乐国产视频| 91尤物视频在线观看| 91福利视频免费观看| 秋霞电影一区二区| 人妻有码中文字幕| 在线欧美日韩| 欧美日韩午夜爽爽| 久久综合av| 天天综合狠狠精品| 亚洲电影男人天堂| 国产欧美日韩一区二区三区| 精品中文字幕一区二区三区| 国产精品免费在线免费| 亚洲黄色免费av| 97在线精品国自产拍中文| 欧洲中文在线| 欧美精品中文字幕一区| 黄色视屏免费在线观看| 日韩在线观看网址| aⅴ在线视频男人的天堂| 亚洲欧美日韩爽爽影院| 午夜影院在线视频| 日韩黄在线观看| 日韩电影在线观看完整版| 亚洲国产古装精品网站| 免费激情视频网站| 亚洲精品一线二线三线| 亚洲国产精品久久久久爰性色| 91麻豆精品国产91久久久| 一区二区三区www污污污网站| 在线精品观看国产| 国产情侣免费视频| 欧美色综合网站| 在线视频播放大全| 9191久久久久久久久久久| 97av免费视频| 欧美一级高清片在线观看| 国产三级小视频| 日韩欧美在线综合网| 性一交一乱一色一视频麻豆| 日韩精品中文字幕在线一区| 亚洲黄色精品视频| 亚洲国产高清福利视频| 青青草观看免费视频在线| 亚洲免费视频网站| 国内精品一区视频| www亚洲精品| 怡红院av在线| 国模视频一区二区| 电影一区二区三| 国产欧美一区二区白浆黑人| 亚洲网站三级| 国产91亚洲精品一区二区三区| 伦理一区二区| 日本一区视频在线观看| 国产精品成人av| 国产精品videossex国产高清| 亚洲精品麻豆| 成人性生生活性生交12| 九九在线精品视频| 国产精品亚洲一区二区无码| 91丨九色丨黑人外教| 国产综合精品久久久久成人av| 亚洲三级久久久| 日韩大片免费在线观看| 91国偷自产一区二区开放时间 | 免费毛片在线播放免费| 午夜视频久久久久久| 看黄色一级大片| 日韩视频一区二区| 男女网站在线观看| 欧美成人小视频| 欧美www.| 91亚色免费| 久久av综合| 超薄肉色丝袜足j调教99| 久久激情综合| 91视频福利网| 久久久久久电影| 亚洲av鲁丝一区二区三区| 欧美性生交xxxxxdddd| 国产精品久久久久久久久久久久久久久久| 日韩免费视频一区| www日韩tube| 97视频在线观看成人| 国产精品一区二区美女视频免费看 | 五月天婷婷激情视频| 国产精品一二三区在线| 三上悠亚影音先锋| 一区av在线播放| 中文无码av一区二区三区| 亚洲国产古装精品网站| a在线免费观看| 国产精品免费视频xxxx| 激情小说亚洲图片| 在线观看视频黄色| 日韩成人精品在线观看| 88av在线播放| 亚洲毛片av在线| 在线观看毛片av| 亚洲女人天堂网| 黄色羞羞视频在线观看| 成人精品久久av网站| 国产精品一区二区av交换| 91精品国产91久久久久麻豆 主演| 看国产成人h片视频| 精品无人区无码乱码毛片国产| 亚洲综合色成人| 国产日韩欧美视频在线观看| 深夜成人在线观看| 一二区成人影院电影网| 麻豆一区区三区四区产品精品蜜桃| 欧美视频亚洲视频| 992tv人人草| 亚洲视频在线一区二区| 亚洲熟女乱色一区二区三区久久久| 亚洲男人第一网站| 欧美xxxhd| 国产一区二区无遮挡| 欧美日韩国产精品一区二区亚洲| 国产成人美女视频| 国产精品久久久久久久久免费丝袜| 中文字幕一区在线播放| 亚洲免费高清视频| sese综合| 欧美资源一区| 三级在线观看一区二区| 久久美女免费视频| 欧美亚洲一区三区| 成人亚洲性情网站www在线观看| 欧日韩在线观看| 欧美男gay| 人妻丰满熟妇av无码区app| 久久久久久久免费视频了| 国内自拍视频在线播放| 亚洲人在线视频| 香蕉成人影院| 亚洲一卡二卡三卡四卡无卡网站在线看| 久久在线精品| 久久久国产一级片| 欧美一区二视频| 黄色av电影在线观看| 999视频在线观看| 亚洲大胆av| 国产福利在线观看视频| 色综合久久综合网欧美综合网| 狠狠v欧美ⅴ日韩v亚洲v大胸| 国产精品久久二区| 99久久亚洲精品| 91丨porny丨九色| 午夜伦理一区二区| 黄视频在线播放| 成人免费在线网址| 狠狠久久婷婷| 性欧美丰满熟妇xxxx性仙踪林| 在线国产亚洲欧美| h视频在线免费观看| 国产区一区二区三区| 天堂成人免费av电影一区| 国产免费美女视频| 亚洲第一天堂无码专区| 国模视频一区| 国产又粗又长又爽视频| 91天堂素人约啪| 亚洲天堂avav| 欧美激情一二区| 国产videos久久| 久久久久无码精品| 日韩欧美精品中文字幕| 女女色综合影院| 狠狠综合久久av| 久久99热99| 国产成人无码精品| 中文字幕视频一区二区在线有码| 久久免费福利| 人妻丰满熟妇av无码区app| 亚洲男人的天堂在线观看| 日中文字幕在线| 91精品黄色| 奇米一区二区三区av| 国产精品第一页在线观看| 中文字幕av一区中文字幕天堂| 成午夜精品一区二区三区软件| 免费激情视频在线观看|