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

Redis存儲(chǔ)總用String?你大概錯(cuò)過了更優(yōu)的使用方法

存儲(chǔ) Redis
Redis為我們提供了5種數(shù)據(jù)類型,基本上我們使用頻率最高的就是String,而對其他四種數(shù)據(jù)類型使用的頻次稍弱于String。

 [[317695]]

Redis為我們提供了5種數(shù)據(jù)類型,基本上我們使用頻率最高的就是String,而對其他四種數(shù)據(jù)類型使用的頻次稍弱于String。原因在于:

  • String使用起來比較簡單,可以方便存儲(chǔ)復(fù)雜的對象,使用場景比較多;
  • 由于Redis expire time只能設(shè)置在key上,像List、Hash、Set、Zset屬于集合類型,會(huì)管理一組item,我們無法在這些集合的item上設(shè)置過期時(shí)間,所以使用expiretime來處理集合的cache失效會(huì)變得稍微復(fù)雜些。但是String使用expire time來管理過期策略會(huì)比較簡單,因?yàn)樗捻?xiàng)少。這里說的集合是寬泛的類似集合。
  • 從更深層次來看,我們對另外四種數(shù)據(jù)類型的使用和原理并不是太了解。所以這個(gè)時(shí)候往往會(huì)忽視在特定場景下使用某種數(shù)據(jù)類型會(huì)比String性能高出很多的可能性,比如使用Hash結(jié)構(gòu)來提高某實(shí)體某個(gè)項(xiàng)的修改等。

這里我們不打算羅列這5種數(shù)據(jù)類型的使用方法,因?yàn)檫@些資料網(wǎng)上有很多。我們主要討論這5種數(shù)據(jù)類型的功能特點(diǎn),弄清楚它們分別適合用于處理哪些現(xiàn)實(shí)的業(yè)務(wù)場景,我們又該如何組合性使用這5種數(shù)據(jù)類型,找到解決復(fù)雜cache問題的最優(yōu)方案。

一、Redis的數(shù)據(jù)類型及特點(diǎn)

我們來簡要了解一下String、List、Hash、Set及Zset:

1)String

String是Redis提供的字符串類型??梢葬槍tring類型獨(dú)立設(shè)置expire time,通常用來存儲(chǔ)長字符串?dāng)?shù)據(jù),比如某個(gè)對象的json字符串。

在使用上,String類型最巧妙的是可以動(dòng)態(tài)拼接key。通常我們可以將一組id放在Set里,然后動(dòng)態(tài)查找String還是否存在,如果不存在說明已經(jīng)過期或者由于數(shù)據(jù)修改主動(dòng)delete了,需要再做一次cache數(shù)據(jù)load。

雖然Set無法設(shè)置item的過期時(shí)間,但是我們可以將Set Item與String Key關(guān)聯(lián)來達(dá)到相同的效果。

下圖中的左邊是一個(gè)key為Set:order:ids的Set集合,它可能是一個(gè)全量集合,也可能是某個(gè)查詢條件獲取出來的一個(gè)集合:

 

Redis存儲(chǔ)總用String?你大概錯(cuò)過了更優(yōu)的使用方法

 

有時(shí)候復(fù)雜點(diǎn)的場景需要多個(gè)Set集合來支撐計(jì)算,在Redis服務(wù)器里可能會(huì)有很多類似這樣的集合。這些集合我們可以稱為功能數(shù)據(jù),這些數(shù)據(jù)是用來輔助cache計(jì)算的,當(dāng)進(jìn)行各種集合運(yùn)算之后會(huì)得出當(dāng)前查詢需要返回的子集,最后我們才會(huì)去獲取某個(gè)訂單真正的數(shù)據(jù)。

這些String:order:{orderId}字符串key并不一定是為了服務(wù)一種場景,而是整個(gè)系統(tǒng)最底層的數(shù)據(jù),各種場景最后都需要獲取這些數(shù)據(jù)。那些Set集合可以認(rèn)為是查詢條件數(shù)據(jù),用來輔助查詢條件的計(jì)算。

Redis為我們提供了TYPE命令來查看某個(gè)key的數(shù)據(jù)類型,如String類型:

  1. SET string:order:100 order-100 
  2. TYPE string:order:100 
  3. string 

2)List

List在提高throughput的場景中非常適用,因?yàn)樗赜械腖PUSH、RPUSH、LPOP、RPOP功能可以無縫的支持生產(chǎn)者、消費(fèi)者架構(gòu)模式。

這非常適合實(shí)現(xiàn)類似Java Concurrency Fork/Join框架中的work-stealing算法(工作竊取)。

注:Java Fork/Join框架使用并行來提高性能,但是會(huì)帶來由于并發(fā)take task帶來的race condition(競態(tài)條件)問題,所以采用work-stealing算法來解決由于競爭問題帶來的性能損耗。

下圖中模擬了一個(gè)典型的支付callback峰值場景:

Redis存儲(chǔ)總用String?你大概錯(cuò)過了更優(yōu)的使用方法

在峰值出現(xiàn)的地方一般我們都會(huì)使用加buffer的方式來加快請求處理速度,這樣才能提高并發(fā)處理能力,提高through put。

支付gateway收到callback之后不做任何處理直接交給分發(fā)器。

分發(fā)器是一個(gè)無狀態(tài)的cluster,每個(gè)node通過向注冊中心pull handler queue list,也就是獲取下游處理器注冊到注冊中心里的消息通道。每一個(gè)分發(fā)器node會(huì)維護(hù)一個(gè)本地queue list,然后順序推送消息到這些queue list即可。

這里會(huì)有點(diǎn)小問題,就是支付gateway調(diào)用分發(fā)器的時(shí)候,是如何做load balance?如果不是平均負(fù)載可能會(huì)有某個(gè)queue list高出其他queue list。

而分發(fā)器不需要做soft load balance,因?yàn)槟呐履硞€(gè)queue list比其他queue list多也無所謂,因?yàn)橄掠蝝essage handler會(huì)根據(jù)work-stealing算法來竊取其他消費(fèi)慢的queue list。

Redis List的LPUSH、RPUSH、LPOP、RPOP特性確實(shí)可以在很多場景下提高這種橫向擴(kuò)展計(jì)算能力。

3)Hash

Hash數(shù)據(jù)類型很明顯是基于Hash算法的,對于項(xiàng)的查找時(shí)間復(fù)雜度是O(1)的,在極端情況下可能出現(xiàn)項(xiàng)Hash沖突問題,Redis內(nèi)部是使用鏈表加key判斷來解決的。具體Redis內(nèi)部的數(shù)據(jù)結(jié)構(gòu)我們在后面有介紹,這里就不展開了。

Hash數(shù)據(jù)類型的特點(diǎn)通常可以用來解決帶有映射關(guān)系,同時(shí)又需要對某些項(xiàng)進(jìn)行更新或者刪除等操作。如果不是某個(gè)項(xiàng)需要維護(hù),那么一般可以通過使用String來解決。

如果有需要對某個(gè)字段進(jìn)行修改,使用String很明顯會(huì)多出很多開銷,需要讀取出來反序列化成對象然后操作,然后再序列化寫回Redis,這中間可能還有并發(fā)問題。

那我們可以使用Redis Hash提供的實(shí)體屬性Hash存儲(chǔ)特性,我們可以認(rèn)為Hash Value是一個(gè)Hash Table,實(shí)體的每一個(gè)屬性都是通過Hash得到屬性的最終數(shù)據(jù)索引。

下圖使用Hash數(shù)據(jù)類型來記錄頁面的a/bmetrics:

Redis存儲(chǔ)總用String?你大概錯(cuò)過了更優(yōu)的使用方法

左邊的是首頁index的各個(gè)區(qū)域的統(tǒng)計(jì),右邊是營銷marketing的各個(gè)區(qū)域統(tǒng)計(jì)。

在程序里我們可以很方便的使用Redis的atomic特性對Hash某個(gè)項(xiàng)進(jìn)行累加操作。

  1. HMSET hash:mall:page:ab:metrics:index topbanner 10 leftbanner 5 rightbanner 8 bottombanner 20 productmore 10 topshopping 8 
  2. OK 
  3. HGETALL hash:mall:page:ab:metrics:index 
  4.  1) "topbanner" 
  5.  2) "10" 
  6.  3) "leftbanner" 
  7.  4) "5" 
  8.  5) "rightbanner" 
  9.  6) "8" 
  10.  7) "bottombanner" 
  11.  8) "20" 
  12.  9) "productmore" 
  13. 10) "10" 
  14. 11) "topshopping" 
  15. 12) "8" 
  16.   
  17. HINCRBY hash:mall:page:ab:metrics:index topbanner 1 
  18. (integer) 11 

使用Redis Hash Increment進(jìn)行原子增加操作。HINCRBY命令可以原子增加任何給定的整數(shù),也可以通過HINCRBYFLOAT來原子增加浮點(diǎn)類型數(shù)據(jù)。

4)Set

Set集合數(shù)據(jù)類型可以支持集合運(yùn)算,不能存儲(chǔ)重復(fù)數(shù)據(jù)。

Set最大的特點(diǎn)就是集合的計(jì)算能力,inter交集、union并集、diff差集,這些特點(diǎn)可以用來做高性能的交叉計(jì)算或者剔除數(shù)據(jù)。

Set集合在使用場景上還是比較多和自由的。舉個(gè)簡單的例子,在應(yīng)用系統(tǒng)中比較常見的就是商品、活動(dòng)類場景。用一個(gè)Set緩存有效商品集合,再用一個(gè)Set緩存活動(dòng)商品集合。如果商品出現(xiàn)上下架操作只需要維護(hù)有效商品Set,每次獲取活動(dòng)商品的時(shí)候需要過濾下是否有下架商品,如果有就需要從活動(dòng)商品中剔除。

當(dāng)然,下架的時(shí)候可以直接刪除緩存的活動(dòng)商品,但是活動(dòng)是從marketing系統(tǒng)中l(wèi)oad出來的,就算我將cache里的活動(dòng)商品刪除,當(dāng)下次再從marketing系統(tǒng)中l(wèi)oad活動(dòng)商品時(shí)候還是會(huì)有下架商品。

當(dāng)然這只是舉例,一個(gè)場景有不同的實(shí)現(xiàn)方法。

下圖中左右兩邊是兩個(gè)不同的集合:

Redis存儲(chǔ)總用String?你大概錯(cuò)過了更優(yōu)的使用方法

左邊是營銷域中的可用商品ids集合,右邊是營銷域中活動(dòng)商品ids集合,中間計(jì)算出兩個(gè)集合的交集。

  1. SADD set:marketing:product:available:ids 1000100 1000120 1000130 1000140 1000150 1000160 
  2.   
  3. SMEMBERS set:marketing:product:available:ids 
  4. 1) "1000100" 
  5. 2) "1000120" 
  6. 3) "1000130" 
  7. 4) "1000140" 
  8. 5) "1000150" 
  9. 6) "1000160" 
  10.   
  11. SADD set:marketing:activity:product:ids 1000100 1000120 1000130 1000140 1000200 1000300 
  12.   
  13. SMEMBERS set:marketing:activity:product:ids 
  14. 1) "1000100" 
  15. 2) "1000120" 
  16. 3) "1000130" 
  17. 4) "1000140" 
  18. 5) "1000200" 
  19. 6) "1000300" 
  20.   
  21. SINTER set:marketing:product:available:ids set:marketing:activity:product:ids 
  22. 1) "1000100" 
  23. 2) "1000120" 
  24. 3) "1000130" 
  25. 4) "1000140" 

在一些復(fù)雜的場景中,也可以使用SINTERSTORE命令將交集計(jì)算后的結(jié)果存儲(chǔ)在一個(gè)目標(biāo)集合中。這在使用pipeline命令管道中特別有用,將SINTERSTORE命令包裹在pipeline命令串中可以重復(fù)使用計(jì)算出來的結(jié)果集。

由于Redis是Signle-Thread單線程模型,基于這個(gè)特性我們就可以使用Redis提供的pipeline管道來提交一連串帶有邏輯的命令集合,這些命令在處理期間不會(huì)被其他客戶端的命令干擾。

5)Zset

Zset排序集合與Set集合類似,但是Zset提供了排序的功能。在介紹Set集合的時(shí)候我們知道Set集合中的成員是無序的,Zset填補(bǔ)了集合可以排序的空隙。

Zset最強(qiáng)大的功能就是可以根據(jù)某個(gè)score比分值進(jìn)行排序,這在很多業(yè)務(wù)場景中非常急需。比如,在促銷活動(dòng)里根據(jù)商品的銷售數(shù)量來排序商品,在旅游景區(qū)里根據(jù)流入人數(shù)來排序熱門景點(diǎn)等?;旧先藗冊谧鋈魏问虑槎夹枰鶕?jù)某些條件進(jìn)行排序。

其實(shí)Zset在我們應(yīng)用系統(tǒng)中能用到地方到處都是,這里我們舉一個(gè)簡單的例子,在團(tuán)購系統(tǒng)中我們通常需要根據(jù)參團(tuán)人數(shù)來排序成團(tuán)列表,大家都希望參加那些即將成團(tuán)的團(tuán)。

下圖是一個(gè)根據(jù)團(tuán)購code創(chuàng)建的Zset,score分值就是參團(tuán)人數(shù)累加和:

Redis存儲(chǔ)總用String?你大概錯(cuò)過了更優(yōu)的使用方法
  1. ZADD zset:marketing:groupon:group:codes 5 G_PXYJY9QQFA 8 G_4EXMT6NZJQ 20 G_W7BMF5QC2P 10 G_429DHBTGZX 8 G_KHZGH9U4PP 
  2.   
  3. ZREVRANGEBYSCORE zset:marketing:groupon:group:codes 1000 0 
  4. 1) "G_W7BMF5QC2P" 
  5. 2) "G_ZMZ69HJUCB" 
  6. 3) "G_429DHBTGZX" 
  7. 4) "G_KHZGH9U4PP" 
  8. 5) "G_4EXMT6NZJQ" 
  9. 6) "G_PXYJY9QQFA" 
  10.   
  11. ZREVRANGEBYSCORE zset:marketing:groupon:group:codes 1000 0 withscores 
  12.  1) "G_W7BMF5QC2P" 
  13.  2) "20" 
  14.  3) "G_ZMZ69HJUCB" 
  15.  4) "10" 
  16.  5) "G_429DHBTGZX" 
  17.  6) "10" 
  18.  7) "G_KHZGH9U4PP" 
  19.  8) "8" 
  20.  9) "G_4EXMT6NZJQ" 
  21. 10) "8" 
  22. 11) "G_PXYJY9QQFA" 
  23. 12) "5" 

Zset本身提供了很多方法用來進(jìn)行集合的排序,如果需要score分值,可以使用withscore字句帶出每一項(xiàng)的分值。

在一些比較特殊的場合可能需要組合排序,可能有多個(gè)Zset分別用來對同一個(gè)實(shí)體在不同維度的排序,按時(shí)間排序、按人數(shù)排序等。這個(gè)時(shí)候就可以組合使用Zset帶來的便捷性,利用pipeline再結(jié)合多個(gè)Zset最終得出組合排序集合。

二、案例:滬江團(tuán)購系統(tǒng)大促hot-top接口cache設(shè)計(jì)

以滬江團(tuán)購系統(tǒng)大促hot-top接口cache設(shè)計(jì)為例,我們總結(jié)了Redis提供的5種數(shù)據(jù)類型的各自特點(diǎn)和一般的使用場景。但是我們不僅僅可以分開使用這些數(shù)據(jù)類型,我們完全可以綜合使用這些數(shù)據(jù)類型來完成復(fù)雜的cache場景。

下面我們分享一個(gè)使用多個(gè)Zset、String來優(yōu)化團(tuán)購系統(tǒng)前臺(tái)接口的例子。由于篇幅和時(shí)間限制,這里只介紹跟本次案例相關(guān)的信息。

注:hot-top接口是指熱點(diǎn)、排名接口的意思,表示它的瀏覽量、并發(fā)量比較高,一般大促的時(shí)候都會(huì)有幾個(gè)這種性能要求比較高的接口。

我們先來分析一個(gè)查詢接口所包含的常規(guī)信息。

首先一個(gè)查詢接口肯定是有query condition查詢條件,然后是sort排序信息、最后是page分頁信息。這是一般接口所承擔(dān)的基本職責(zé),當(dāng)然,特殊場景下還需要支持master/slave replication時(shí)關(guān)于數(shù)據(jù)session一致性的要求,需要提供跟蹤標(biāo)記來回master查詢數(shù)據(jù),這里就不展開了。

我們可以抽象出這幾個(gè)維度的信息:

  • querycondition:查詢條件,companyid =100,sellerid=1010101諸如此類。
  • sort:排序信息,一般是默認(rèn)一個(gè)列排序,但是在復(fù)雜的場景下會(huì)有可能讓接口使用者定制排序字段,比如一些租戶信息列。
  • page:分頁信息,簡單理解就是數(shù)據(jù)記錄排完序之后的第幾行到第幾行。

由于這里我們純粹用Redis來提高cache能力,不涉及到有關(guān)于任何搜索的能力,所以這里忽略其他復(fù)雜查詢的情況。其實(shí)我們在復(fù)雜的地方使用了Elastcsearch來提高搜索能力。

上述我們分析總結(jié)出了一個(gè)查詢接口的基本信息,這里還有一個(gè)有關(guān)于高并發(fā)接口的設(shè)計(jì)原則,就是將hot-top接口和一般search接口分離開,因?yàn)橹挥蟹侄沃拍芊謩e根據(jù)特點(diǎn)選用不同的技術(shù)。

如果我們不分職責(zé)將所有的查詢場景封裝在一個(gè)接口里,那么在后面優(yōu)化接口性能的時(shí)候基本就很麻煩了,有些場景是無法或者很難用cache來解決的,因?yàn)榻涌诶锺詈狭烁鞣N場景邏輯,就算勉強(qiáng)能實(shí)現(xiàn)性能也不會(huì)高。

前面做這些鋪墊是為了能在介紹案例的時(shí)候達(dá)成一個(gè)基本的共識(shí)。現(xiàn)在我們來看下這個(gè)團(tuán)購系統(tǒng)的hot-top接口的具體邏輯。

注:在大促的時(shí)候需要展現(xiàn)團(tuán)購列表,這個(gè)接口的訪問量是非常大的,團(tuán)購活動(dòng)需要根據(jù)參團(tuán)人數(shù)倒序排序,并且分頁返回指定數(shù)量的團(tuán)列表。我們假設(shè)這個(gè)接口名為getTopGroups(getTopGroupsRequestrequest)。

1)query condition查詢條件問題

我們來仔細(xì)分析下,首先不同的查詢條件從DB里查詢出來的數(shù)據(jù)是不一樣的,也就是說查詢出來的團(tuán)列表是不一樣的,可能有company公司、channel渠道等過濾條件。

由于一個(gè)團(tuán)購活動(dòng)下不會(huì)有太多團(tuán),頂多上百個(gè)是極限了,所以一個(gè)查詢條件出來的團(tuán)列表也頂多幾十個(gè),而且根據(jù)場景分析熱點(diǎn)查詢條件不會(huì)超過十個(gè),所以我們選擇將查詢條件Hash出一個(gè)code來緩存本次查詢條件的全量團(tuán)列表集合,但是這些結(jié)果集是沒有任何排序的。

2)sort排序問題

再看根據(jù)參團(tuán)人數(shù)排序問題,我們立刻就可以想到使用Zset來處理團(tuán)排序問題,因?yàn)橹挥幸粋€(gè)排序維度,所以一個(gè)Zset就夠了。我們使用一個(gè)Zset來緩存所有團(tuán)的參團(tuán)人數(shù)集合,它是一個(gè)全量的團(tuán)排序集合。

那么我們?nèi)绾螌⒂脩舻牟樵儣l件出來的團(tuán)列表根據(jù)參團(tuán)人數(shù)排序呢?剛好可以使用Zset的交集運(yùn)算,直接計(jì)算出當(dāng)前這個(gè)集合的Zset子集。

3)page分頁問題

通過對已經(jīng)排序之后的團(tuán)列表Zset使用Zrange來獲取出分頁集合。我們來看下完整的流程,如何處理查詢、排序、分頁的。

下圖從query condition計(jì)算Hash Code,然后通過DB查詢出當(dāng)前條件全量團(tuán)列表:

Redis存儲(chǔ)總用String?你大概錯(cuò)過了更優(yōu)的使用方法

zset:marketing:groupon:hottop:available:groupkey表示全量團(tuán)的參團(tuán)人數(shù),用一個(gè)Zset來緩存。接著將這兩個(gè)Zset計(jì)算交集,就可以得出當(dāng)前查詢所需要的帶有參團(tuán)人數(shù)的Zset,最后在使用Zrevrange獲取分頁區(qū)間。

  1. ZADD zset:marketing:groupon:hottop:condition:2986080 0 G4ZD5732YZQ 0 G5VW3YF42UC 0 GF773FEJ7CC 0 GFW8DUEND8S 0 GKPKKW8XEY9 0 GL324DGWMZM 
  2. (integer) 6 
  3.   
  4. ZADD zset:marketing:groupon:hottop:available:group 5 GN7KQH36ZWK 10 GS7VB22AWD4 15 GF773FEJ7CC 17 G5VW3YF42UC 18 G4ZD5732YZQ 32 GTYJKCEJBRR 40 GKPKKW8XEY9 45 GL324DGWMZM 50 GFW8DUEND8S 60 GYTKY4ACWLT 
  5. (integer) 10 
  6.   
  7. ZINTERSTORE zset:marketing:groupon:hottop:condition:interstore 2 zset:marketing:groupon:hottop:condition:2986080 zset:marketing:groupon:hottop:available:group 
  8. (integer) 6 
  9.   
  10. ZRANGE zset:marketing:groupon:hottop:condition:interstore 0 -1 withscores 
  11.  1) "GF773FEJ7CC" 
  12.  2) "15" 
  13.  3) "G5VW3YF42UC" 
  14.  4) "17" 
  15.  5) "G4ZD5732YZQ" 
  16.  6) "18" 
  17.  7) "GKPKKW8XEY9" 
  18.  8) "40" 
  19.  9) "GL324DGWMZM" 
  20. 10) "45" 
  21. 11) "GFW8DUEND8S" 
  22. 12) "50" 
  23.   
  24. ZREVRANGE zset:marketing:groupon:hottop:condition:interstore 2 4 withscores 
  25. 1) "GKPKKW8XEY9" 
  26. 2) "40" 
  27. 3) "G4ZD5732YZQ" 
  28. 4) "18" 
  29. 5) "G5VW3YF42UC" 
  30. 6) "17" 

有了返回的團(tuán)code集合之后就可以通過mget來批量獲取String類型的團(tuán)詳情信息,這里就不貼出代碼了。

由于篇幅和時(shí)間關(guān)系,我們不展開太多的業(yè)務(wù)場景介紹了。這其中還涉及到計(jì)算cache過期時(shí)間的問題,這也跟促銷活動(dòng)的運(yùn)營規(guī)則有關(guān)系,還涉及到有可能query condition hash沖突問題等,但是這些已經(jīng)不與我們本節(jié)主題相關(guān)。

 

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2019-01-08 13:45:39

Redis存儲(chǔ)數(shù)據(jù)庫

2019-12-27 15:18:01

微軟

2019-01-08 11:57:10

Redis存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)

2024-05-24 10:51:51

框架Java

2018-11-27 05:46:10

等待時(shí)間悖論公交車數(shù)據(jù)分析

2023-04-11 16:31:10

開發(fā)React 庫Web

2017-08-01 10:47:12

瓦戈

2022-09-19 00:46:18

JavaScrip功能開發(fā)

2011-02-24 13:09:10

FireFTP

2012-01-13 09:55:54

jQuery

2018-02-04 14:44:11

2012-11-14 13:55:10

2020-09-01 15:10:15

編程CSSJava

2016-03-04 11:06:20

更優(yōu)秀程序員

2009-12-24 16:36:06

WPF InkCanv

2010-10-08 16:01:17

mysql UPDAT

2009-12-02 16:04:44

PHP fsockop

2013-07-15 15:12:40

iOS多線程NSOperationNSOperation

2017-09-13 09:45:37

iPhone XiPhone 8
點(diǎn)贊
收藏

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

99热只有这里有精品| 免费观看黄网站| 久久久久久久久亚洲精品| 久久久国产精品一区二区中文| 亚洲全黄一级网站| 亚洲综合av在线播放| 国产三区视频在线观看| 成人黄色国产精品网站大全在线免费观看| 高清一区二区三区四区五区| 国产精品高清无码在线观看| 亚洲精品一区av| 亚洲成在线观看| 亚洲国产精品久久久久婷婷老年| 国产日韩欧美中文字幕| 亚洲在线日韩| 久久精品国产亚洲| 色婷婷av777| 大胆国模一区二区三区| 精品欧美一区二区三区| 亚洲精品久久久久久一区二区| 性做久久久久久久久久| 日韩成人免费看| 久久久免费在线观看| 久久精品无码一区| 成人18夜夜网深夜福利网| 欧美自拍偷拍午夜视频| 天堂8在线天堂资源bt| 国产黄色在线| 不卡的av在线播放| 91久久精品美女| 无码人妻精品一区二区50| 综合久久婷婷| 日韩在线资源网| 亚洲国产无码精品| 第一区第二区在线| 欧美一区二区啪啪| 15—17女人毛片| 中文字幕在线视频久| 一区二区三区.www| 一区在线电影| 国产免费a∨片在线观看不卡| 不卡欧美aaaaa| 91蜜桃网站免费观看| 中文字幕在线2018| 天堂蜜桃91精品| 91高清免费在线观看| 全网免费在线播放视频入口| 日韩毛片视频| 这里只有精品在线播放| 中文字幕第20页| 亚洲a级精品| 亚洲精品国产精品久久清纯直播| 日本中文字幕有码| 91精品一区| 欧美揉bbbbb揉bbbbb| 国产日韩一区二区在线| 成人一级福利| 精品免费在线视频| 午夜精品久久久久久久无码| 成入视频在线观看| 精品久久久久国产| 缅甸午夜性猛交xxxx| 丁香花视频在线观看| 依依成人综合视频| 国产一区二区三区小说| 蜜桃成人365av| 亚洲午夜在线电影| 毛片在线视频播放| 9999精品成人免费毛片在线看 | 色www精品视频在线观看| 黄色网页免费在线观看| 蜜桃视频在线观看免费视频| 精品久久久久久久大神国产| 日韩av一二三四| 日本综合字幕| 欧美日韩一区二区三区在线| 在线观看免费视频高清游戏推荐 | 91丨九色丨国产在线| 国产精品久久久久久免费免熟| 精品无人区卡一卡二卡三乱码免费卡| 成人免费观看a| av老司机久久| 成人看片黄a免费看在线| 精品欧美一区二区三区久久久| 五月天婷婷社区| 久久久精品蜜桃| 亚洲精品免费在线看| av大片在线| 亚洲制服丝袜一区| 国模杨依粉嫩蝴蝶150p| 久久精品国产福利| 欧美色男人天堂| 日本一本在线视频| 欧美精品中文| 亚洲色图校园春色| 国产精品国产精品88| 亚洲午夜极品| 国产不卡精品视男人的天堂| 一区二区日韩在线观看| 国产成人精品一区二区三区四区 | 国产探花在线精品一区二区| 日韩一二三在线视频播| 久久久精品国产sm调教网站| 亚洲制服av| 91在线|亚洲| 色偷偷在线观看| 国产三级欧美三级| 日本aa在线观看| 欧美一区 二区 三区| 欧美一区二区三区四区五区 | 中文字幕日韩欧美| 国产亚洲欧美精品久久久www| 亚洲免费激情| 91精品国产自产在线| 天堂网在线播放| 国产精品久久久久久妇女6080| aa视频在线播放| xxxxx.日韩| 亚洲精品国产综合区久久久久久久 | 日本一二三区不卡| 精品无人区卡一卡二卡三乱码免费卡| 看欧美日韩国产| 成人免费看片| 欧美性视频一区二区三区| 麻豆短视频在线观看| 日韩美女一区二区三区在线观看| 欧美一级电影久久| 成人黄色免费视频| 国产精品美女久久久久久久久久久 | 日韩欧美电影在线观看| 亚洲免费观看高清完整版在线观看 | 成av人电影在线观看| 亚洲成av人**亚洲成av**| 亚洲一区二区福利视频| 精品国产精品国产偷麻豆| 国产69精品久久久久久| 午夜精品久久久久久久96蜜桃 | 蜜桃日韩视频| 超碰97免费在线| 91麻豆精品91久久久久同性| 精品人体无码一区二区三区| 欧美一级播放| 精品久久久三级| 黑人玩欧美人三根一起进| 这里只有精品99re| 黄色一级片一级片| 日韩精品一二区| 开心色怡人综合网站| 国产黄大片在线观看| 日韩区在线观看| 91 在线视频| 狠狠色丁香久久婷婷综合_中 | 欧美不卡高清| 91免费看片在线| 黄色在线播放网站| 欧美精品三级日韩久久| 欧美一级特黄高清视频| 韩国精品免费视频| 影音先锋成人资源网站| 精品久久久久久久久久岛国gif| www.日韩.com| 91欧美日韩麻豆精品| 国产精品久久午夜| 五月天av在线播放| 91综合久久一区二区| 国产欧美精品一区二区| 男人在线资源站| 7777精品久久久大香线蕉| 91香蕉一区二区三区在线观看 | 无码国产69精品久久久久网站 | 人妻少妇被粗大爽9797pw| 亚洲第一二三区| 日韩**中文字幕毛片| 国产美女视频一区二区三区| 欧美在线观看18| 亚洲精品自拍视频在线观看| 国产一区二区三区国产| 福利视频免费在线观看| 老司机成人在线| 日本国产精品视频| 色网站免费在线观看| 日韩亚洲欧美高清| 国产成人综合欧美精品久久| 国产精品理论片| 色黄视频免费看| 亚洲久久一区| 亚洲看片网站| 日本少妇精品亚洲第一区| 欧美亚洲国产日韩2020| 国产高清视频在线| 欧美一二三在线| 成人毛片18女人毛片| 国产精品看片你懂得| 男男一级淫片免费播放| 日本麻豆一区二区三区视频| 91大学生片黄在线观看| 亚洲人成网亚洲欧洲无码| 国产精品自产拍在线观| 爱看av在线| 在线日韩精品视频| 黄色av一区二区三区| 91久久精品日日躁夜夜躁欧美| 男女做暖暖视频| 91蜜桃网址入口| 亚洲va在线va天堂va偷拍| 亚洲福利国产| 最近看过的日韩成人| 日本三级久久| 2014亚洲精品| 在线国产成人影院| 欧美激情精品久久久久久久变态| 精品999视频| 欧美成人精品福利| 日本成人一级片| 亚洲高清视频中文字幕| 精品女人久久久| 91一区二区在线观看| 青娱乐国产精品视频| 强制捆绑调教一区二区| 欧美牲交a欧美牲交| 欧美精品色网| 午夜精品亚洲一区二区三区嫩草| 黑人久久a级毛片免费观看| 国产欧美日韩精品丝袜高跟鞋| 久草免费在线视频| 欧美国产乱视频| 免费看a在线观看| 亚洲色图av在线| 日本精品专区| 亚洲电影av在线| 国产福利资源在线| 4438x亚洲最大成人网| 久久精品五月天| 精品免费在线观看| 国产无码精品在线播放| 一区二区三区中文字幕在线观看| 99久久99久久精品免费看小说.| 91香蕉国产在线观看软件| 国产精品一级无码| 国产精品一区免费在线观看| 天天干天天操天天做| 免费久久99精品国产| 免费裸体美女网站| 免费日韩av| 久久久久久久中文| 日韩亚洲国产精品| 欧美激情 国产精品| 激情另类综合| 丰满少妇大力进入| 国产主播精品| 欧美国产日韩激情| 亚洲黄色大片| 免费在线激情视频| 久久国产精品久久久久久电车| 国产成人久久婷婷精品流白浆| 亚洲少妇一区| 日本久久久精品视频| 久久久久久夜| 爆乳熟妇一区二区三区霸乳| 日本伊人色综合网| 一区二区在线免费看| 久久福利视频一区二区| 日韩精品aaa| 国产米奇在线777精品观看| 美女被艹视频网站| 国产成人丝袜美腿| 精品视频站长推荐| 26uuu亚洲综合色欧美| 久久精品国产亚洲av久| 国产视频一区不卡| 亚洲区一区二区三| 亚洲综合丁香婷婷六月香| 日本系列第一页| 在线观看一区二区视频| 亚洲网站在线免费观看| 欧美一级片免费看| 少妇荡乳情欲办公室456视频| 日韩精品在线免费观看| 成年人在线视频| 久久天天躁狠狠躁夜夜爽蜜月| 狂野欧美激情性xxxx欧美| 午夜精品蜜臀一区二区三区免费| 大胆人体一区二区| 国产精品综合网站| 99ri日韩精品视频| 鲁鲁视频www一区二区| 欧美韩国日本在线观看| 国产欧美精品aaaaaa片| 美女日韩在线中文字幕| 午夜免费看视频| av电影在线观看一区| 中文字幕 自拍| 亚洲精品国产精品乱码不99| 日韩精品1区2区| 欧美顶级少妇做爰| 亚洲人妻一区二区| 久久精品成人动漫| 伊人成综合网站| 亚洲va电影大全| 国产探花一区在线观看| 男女裸体影院高潮| 丝袜美腿高跟呻吟高潮一区| 色男人天堂av| 国产人成一区二区三区影院| 青娱乐国产精品| 欧美亚男人的天堂| 熟妇高潮一区二区三区| 久久精品99国产精品酒店日本| 超碰在线97国产| 成人性生交大片免费看小说 | 久草精品在线观看| 久久久久国产精品区片区无码| 中文字幕一区二区三区四区不卡| 久久久久久久久久久久久久av| 91精品久久久久久蜜臀| 国产永久免费高清在线观看视频| 欧美日韩ab片| 91大神在线观看线路一区| 国产精品一区二区三区四区五区| 香港欧美日韩三级黄色一级电影网站| 成年人视频网站免费观看| 国产ts人妖一区二区| 激情五月激情综合| 欧美午夜xxx| 蜜臀av中文字幕| 久久综合久中文字幕青草| 日本美女久久| 品久久久久久久久久96高清| 悠悠资源网久久精品| 精品人妻一区二区三区免费| 欧美激情在线一区二区| 欧美 日韩 精品| 亚洲缚视频在线观看| 亚洲国产精品精华素| 成人av色在线观看| 日韩精品一区二区久久| 午夜dv内射一区二区| 久久综合久久综合久久综合| 国产无套粉嫩白浆内谢| 日韩精品一区二区三区视频| 黄色网页在线观看| 91免费视频国产| 91精品国产乱码久久久久久久| 天堂一区在线观看| 国产精品三级视频| 综合久久中文字幕| 在线精品高清中文字幕| 日韩免费小视频| 欧洲精品码一区二区三区免费看| 男女精品视频| 熟女高潮一区二区三区| 欧美亚洲一区二区在线观看| 国产最新视频在线观看| 国产精品久久久久高潮| 精品精品99| 99热一区二区| 亚洲人成亚洲人成在线观看图片 | 碰碰在线视频| 久久免费99精品久久久久久| 在线视频免费在线观看一区二区| 在线免费播放av| 色综合久久久网| 丁香婷婷在线观看| 国产精品视频大全| 天堂网在线观看国产精品| 红桃视频 国产| 一区二区三区四区不卡视频| 亚洲国产www| 欧美亚洲国产另类| 日本大胆欧美| 三级黄色片免费看| 亚洲午夜精品久久久久久久久| 天天爱天天干天天操| 国产91色在线|| 99视频精品全部免费在线视频| 日批视频在线看| 午夜精品福利一区二区三区av| 亚洲色大成网站www| 国产精品国产三级国产aⅴ浪潮| 999久久久国产精品| xxxxwww一片| 一本色道久久综合亚洲91| 香蕉视频国产在线观看| www.久久爱.cn| 久久国产精品久久w女人spa| 蜜桃av免费在线观看| 日韩三级中文字幕| 国产精品高颜值在线观看| 日韩中文字幕一区| 国产黄色成人av| 午夜婷婷在线观看| 久久久国产精品免费| 久久夜色电影| 黄色aaa级片| 亚洲国产成人91porn| 9色在线观看| 国内精品视频在线播放| 免费观看在线色综合| 日本一级黄色大片| 日韩网站在线观看|