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

我使用緩存,踩過的7個坑

開發 架構
假設在高并發的場景中,同一個用戶的同一條數據,有一個讀數據請求c,還有另一個寫數據請求d(一個更新操作),同時請求到業務系統。在這個過程當中,有可能會出現請求d的新值,并沒有被請求c寫入緩存,同樣會導致緩存和數據庫的數據不一致的情況。

前言

緩存在我們日常工作中,經常會使用,但如果用不好坑也挺多的。

這篇文章總結了我工作中使用緩存遇到過的7個坑,還是非常有參考價值得,希望對你會有所幫助。

圖片圖片

1 緩存穿透

大部分情況下,加緩存的目的是:為了減輕數據庫的壓力,提升系統的性能。

一般情況下,如果有用戶請求過來,先查緩存,如果緩存中存在數據,則直接返回。

如果緩存中不存在,則再查數據庫,如果數據庫中存在,則將數據放入緩存,然后返回。如果數據庫中也不存在,則直接返回失敗。

流程圖如下:

圖片圖片

但如果出現以下這兩種特殊情況,比如:

  • 用戶請求的id在緩存中不存在。
  • 惡意用戶偽造不存在的id發起請求。

這樣的用戶請求導致的結果是:每次從緩存中都查不到數據,而需要查詢數據庫,同時數據庫中也沒有查到該數據,也沒法放入緩存。

也就是說,每次這個用戶請求過來的時候,都要查詢一次數據庫。

圖片圖片

圖中標紅的箭頭表示每次走的路線。

很顯然,緩存根本沒起作用,好像被穿透了一樣,每次都會去訪問數據庫。

這就是我們所說的:緩存穿透問題。

如果此時穿透了緩存,而直接數據庫的請求數量非常多,數據庫可能因為扛不住壓力而掛掉。嗚嗚嗚。

那么問題來了,如何解決這個問題呢?

1.1 校驗參數

我們可以對用戶id做檢驗。

比如你的合法id是15xxxxxx,以15開頭的。如果用戶傳入了16開頭的id,比如:16232323,則參數校驗失敗,直接把相關請求攔截掉。這樣可以過濾掉一部分惡意偽造的用戶id。

1.2 使用布隆過濾器

如果數據比較少,我們可以把數據庫中的數據,全部放到內存的一個map中。

這樣能夠非常快速的識別,數據在緩存中是否存在。如果存在,則讓其訪問緩存。如果不存在,則直接拒絕該請求。

但如果數據量太多了,有數千萬或者上億的數據,全都放到內存中,很顯然會占用太多的內存空間。

那么,有沒有辦法減少內存空間呢?

答:這就需要使用布隆過濾器了。

布隆過濾器底層使用bit數組存儲數據,該數組中的元素默認值是0。

布隆過濾器第一次初始化的時候,會把數據庫中所有已存在的key,經過一些列的hash算法(比如:三次hash算法)計算,每個key都會計算出多個位置,然后把這些位置上的元素值設置成1。

圖片圖片

之后,有用戶key請求過來的時候,再用相同的hash算法計算位置。

  • 如果多個位置中的元素值都是1,則說明該key在數據庫中已存在。這時允許繼續往后面操作。
  • 如果有1個以上的位置上的元素值是0,則說明該key在數據庫中不存在。這時可以拒絕該請求,而直接返回。

1.3 緩存空值

上面使用布隆過濾器,雖說可以過濾掉很多不存在的用戶id請求。但它除了增加系統的復雜度之外,會帶來兩個問題:

  • 布隆過濾器存在誤殺的情況,可能會把少部分正常用戶的請求也過濾了。
  • 如果用戶信息有變化,需要實時同步到布隆過濾器,不然會有問題。

所以,通常情況下,我們很少用布隆過濾器解決緩存穿透問題。其實,還有另外一種更簡單的方案,即:緩存空值。

當某個用戶id在緩存中查不到,在數據庫中也查不到時,也需要將該用戶id緩存起來,只不過值是空的。

這樣后面的請求,再拿相同的用戶id發起請求時,就能從緩存中獲取空數據,直接返回了,而無需再去查一次數據庫。

優化之后的流程圖如下:

圖片圖片

關鍵點是不管從數據庫有沒有查到數據,都將結果放入緩存中,只是如果沒有查到數據,緩存中的值是空的罷了。

2 緩存擊穿

有時候,我們在訪問熱點數據時。比如:我們在某個商城購買某個熱門商品。

為了保證訪問速度,通常情況下,商城系統會把商品信息放到緩存中。但如果某個時刻,該商品到了過期時間失效了。

此時,如果有大量的用戶請求同一個商品,但該商品在緩存中失效了,一下子這些用戶請求都直接懟到數據庫,可能會造成瞬間數據庫壓力過大,而直接掛掉。

流程圖如下:

圖片圖片

那么,如何解決這個問題呢?

2.1 加鎖

數據庫壓力過大的根源是,因為同一時刻太多的請求訪問了數據庫。

如果我們能夠限制,同一時刻只有一個請求才能訪問某個productId的數據庫商品信息,不就能解決問題了?

答:沒錯,我們可以用加鎖的方式,實現上面的功能。

偽代碼如下:

try {
  String result = jedis.set(productId, requestId, "NX", "PX", expireTime);
  if ("OK".equals(result)) {
    return queryProductFromDbById(productId);
  }
} finally{
    unlock(productId,requestId);
}  
return null;

在訪問數據庫時加鎖,防止多個相同productId的請求同時訪問數據庫。

然后,還需要一段代碼,把從數據庫中查詢到的結果,又重新放入緩存中。辦法挺多的,在這里我就不展開了。

2.2 自動續期

出現緩存擊穿問題是由于key過期了導致的。那么,我們換一種思路,在key快要過期之前,就自動給它續期,不就OK了?

答:沒錯,我們可以用job給指定key自動續期。

比如說,我們有個分類功能,設置的緩存過期時間是30分鐘。但有個job每隔20分鐘執行一次,自動更新緩存,重新設置過期時間為30分鐘。

圖片圖片

這樣就能保證,分類緩存不會失效。

2.3 永久有效

此外,對于很多熱門key,其實是可以不用設置過期時間,讓其永久有效的。

比如參與秒殺活動的熱門商品,由于這類商品id并不多,在緩存中我們可以不設置過期時間。

在秒殺活動開始前,我們先用一個程序提前從數據庫中查詢出商品的數據,然后同步到緩存中,提前做預熱。

等秒殺活動結束一段時間之后,我們再手動刪除這些無用的緩存即可。

3 緩存雪崩

而緩存雪崩是緩存擊穿的升級版,緩存擊穿說的是某一個熱門key失效了,而緩存雪崩說的是有多個熱門key同時失效。

看起來,如果發生緩存雪崩,問題更嚴重。

緩存雪崩目前有兩種:

  • 有大量的熱門緩存,同時失效。會導致大量的請求,訪問數據庫。而數據庫很有可能因為扛不住壓力,而直接掛掉。
  • 緩存服務器down機了,可能是機器硬件問題,或者機房網絡問題。總之,造成了整個緩存的不可用。

歸根結底都是有大量的請求,透過緩存,而直接訪問數據庫了。

圖片圖片

那么,要如何解決這個問題呢?

3.1 過期時間加隨機數

為了解決緩存雪崩問題,我們首先要盡量避免緩存同時失效的情況發生。

這就要求我們不要設置相同的過期時間。

可以在設置的過期時間基礎上,再加個1~60秒的隨機數。

實際過期時間 = 過期時間 + 1~60秒的隨機數

這樣即使在高并發的情況下,多個請求同時設置過期時間,由于有隨機數的存在,也不會出現太多相同的過期key。

3.2 保證高可用

針對緩存服務器down機的情況,在前期做系統設計時,可以做一些高可用架構。

比如:如果使用了redis,可以使用哨兵模式,或者集群模式,避免出現單節點故障導致整個redis服務不可用的情況。

使用哨兵模式之后,當某個master服務下線時,自動將該master下的某個slave服務升級為master服務,替代已下線的master服務繼續處理請求。

3.3 服務降級

如果做了高可用架構,redis服務還是掛了,該怎么辦呢?

這時候,就需要做服務降級了。

我們需要配置一些默認的兜底數據。

程序中有個全局開關,比如有10個請求在最近一分鐘內,從redis中獲取數據失敗,則全局開關打開。后面的新請求,就直接從配置中心中獲取默認的數據。

當然,還需要有個job,每隔一定時間去從redis中獲取數據,如果在最近一分鐘內可以獲取到兩次數據(這個參數可以自己定),則把全局開關關閉。后面來的請求,又可以正常從redis中獲取數據了。

需要特別說一句,該方案并非所有的場景都適用,需要根據實際業務場景決定。

4 數據不一致

數據庫和緩存(比如:redis)雙寫數據一致性問題,是一個跟開發語言無關的公共問題。尤其在高并發的場景下,這個問題變得更加嚴重。

那么,我們該如何更新緩存呢?

目前有以下4種方案:

  • 先寫緩存,再寫數據庫
  • 先寫數據庫,再寫緩存
  • 先刪緩存,再寫數據庫
  • 先寫數據庫,再刪緩存

4.1 先寫緩存,再寫數據庫

對于更新緩存的方案,很多人第一個想到的可能是在寫操作中直接更新緩存(寫緩存),更直接明了。

那么,問題來了:在寫操作中,到底是先寫緩存,還是先寫數據庫呢?

我們在這里先聊聊先寫緩存,再寫數據庫的情況,因為它的問題最嚴重。

某一個用戶的每一次寫操作,如果剛寫完緩存,突然網絡出現了異常,導致寫數據庫失敗了。

圖片圖片

其結果是緩存更新成了最新數據,但數據庫沒有,這樣緩存中的數據不就變成臟數據了?如果此時該用戶的查詢請求,正好讀取到該數據,就會出現問題,因為該數據在數據庫中根本不存在,這個問題非常嚴重。

我們都知道,緩存的主要目的是把數據庫的數據臨時保存在內存,便于后續的查詢,提升查詢速度。

但如果某條數據,在數據庫中都不存在,你緩存這種“假數據”又有啥意義呢?

因此,先寫緩存,再寫數據庫的方案是不可取的,在實際工作中用得不多。

4.2 先寫數據庫,再寫緩存

既然上面的方案行不通,接下來,聊聊先寫數據庫,再寫緩存的方案,該方案在低并發編程中有人在用(我猜的)。

用戶的寫操作,先寫數據庫,再寫緩存,可以避免之前“假數據”的問題。但它卻帶來了新的問題。

什么問題呢?

4.2.1 寫緩存失敗了

如果把寫數據庫和寫緩存操作,放在同一個事務當中,當寫緩存失敗了,我們可以把寫入數據庫的數據進行回滾。

圖片圖片

如果是并發量比較小,對接口性能要求不太高的系統,可以這么玩。

但如果在高并發的業務場景中,寫數據庫和寫緩存,都屬于遠程操作。為了防止出現大事務,造成的死鎖問題,通常建議寫數據庫和寫緩存不要放在同一個事務中。

也就是說在該方案中,如果寫數據庫成功了,但寫緩存失敗了,數據庫中已寫入的數據不會回滾。

這就會出現:數據庫是新數據,而緩存是舊數據,兩邊數據不一致的情況。

4.2.2 高并發下的問題

假設在高并發的場景中,針對同一個用戶的同一條數據,有兩個寫數據請求:a和b,它們同時請求到業務系統。

在這個過程當中,可能會出現請求b在緩存中的新數據,被請求a的舊數據覆蓋了。

也就是說:在高并發場景中,如果多個線程同時執行先寫數據庫,再寫緩存的操作,可能會出現數據庫是新值,而緩存中是舊值,兩邊數據不一致的情況。

4.2.3 浪費系統資源

該方案還有一個比較大的問題就是:每個寫操作,寫完數據庫,會馬上寫緩存,比較浪費系統資源。

為什么這么說呢?

你可以試想一下,如果寫的緩存,并不是簡單的數據內容,而是要經過非常復雜的計算得出的最終結果。這樣每寫一次緩存,都需要經過一次非常復雜的計算,不是非常浪費系統資源嗎?

尤其是cpu和內存資源。

還有些業務場景比較特殊:寫多讀少。

如果在這類業務場景中,每個用的寫操作,都需要寫一次緩存,有點得不償失。

由此可見,在高并發的場景中,先寫數據庫,再寫緩存,這套方案問題挺多的,也不太建議使用。

4.3 先刪緩存,再寫數據庫

說白了,在用戶的寫操作中,先執行刪除緩存操作,再去寫數據庫。這套方案,可以是可以,但也會有一樣問題。

4.3.1 高并發下的問題

假設在高并發的場景中,同一個用戶的同一條數據,有一個讀數據請求c,還有另一個寫數據請求d(一個更新操作),同時請求到業務系統。

在這個過程當中,有可能會出現請求d的新值,并沒有被請求c寫入緩存,同樣會導致緩存和數據庫的數據不一致的情況。

4.4 先寫數據庫,再刪緩存

在高并發的場景中,有一個讀數據請求f,有一個寫數據請求e。

在高并發的場景中,有一個讀數據請求,有一個寫數據請求,更新過程如下:

請求e先寫數據庫,由于網絡原因卡頓了一下,沒有來得及刪除緩存。請求f查詢緩存,發現緩存中有數據,直接返回該數據。請求e刪除緩存。在這個過程中,只有請求f讀了一次舊數據,后來舊數據被請求e及時刪除了,看起來問題不大。

但如果是讀數據請求先過來呢?

  • 請求f查詢緩存,發現緩存中有數據,直接返回該數據。
  • 請求e先寫數據庫。
  • 請求e刪除緩存。

這種情況看起來也沒問題呀?

答:對的。

但就怕出現下面這種情況,即緩存自己失效了。如下圖所示:

圖片圖片

  • 緩存過期時間到了,自動失效。
  • 請求f查詢緩存,發緩存中沒有數據,查詢數據庫的舊值,但由于網絡原因卡頓了,沒有來得及更新緩存。
  • 請求e先寫數據庫,接著刪除了緩存。
  • 請求f更新舊值到緩存中。

這時,緩存和數據庫的數據同樣出現不一致的情況了。

但這種情況還是比較少的,需要同時滿足以下條件才可以:

  • 緩存剛好自動失效。
  • 請求f從數據庫查出舊值,更新緩存的耗時,比請求e寫數據庫,并且刪除緩存的還長。

我們都知道查詢數據庫的速度,一般比寫數據庫要快,更何況寫完數據庫,還要刪除緩存。所以絕大多數情況下,寫數據請求比讀數據情況耗時更長。

由此可見,系統同時滿足上述兩個條件的概率非常小。

如果大家想更詳細的了解數據和緩存雙寫一致性問題,可以看看我之前寫的一篇文章《如何保證數據庫和緩存雙寫一致性?》,里面有非常詳細的介紹。

5 大key問題

我們在使用緩存的時候,特別是Redis,還有一個經常會遇到的問題是大key問題。

可能系統剛上線時,數據量少,在Redis中定義的key比較小,開發人員在做系統設計時,也沒考慮這個問題。

系統運行了很長一段時間也沒有問題。

但隨著時間的推移,用戶的數據越來越多,慢慢形成了大key問題。

可能在突然的某一天之后發現,線上某個接口耗時越來越長了。

追查原因,發現是大key問題導致的。

大key問題是指:緩存中單個key的value值過大。

之前我開發過一個分類樹查詢接口,為了性能考慮,使用job提前將分類樹,保存到緩存中。

剛開始分類不多,只有幾百個,分類樹查詢接口的響應挺快的。

但用了幾年之后,分類數據漲到了上萬個,該接口出現了性能問題,一查發現是大key引起的。

我們需要做優化,那么如何優化呢?

5.1 縮減字段名

為了優化在Redis中存儲數據的大小,我們首先需要對數據進行瘦身。

只保存需要用到的字段。

例如:

@AllArgsConstructor
@Data
public class Category {

    private Long id;
    private String name;
    private Long parentId;
    private Date inDate;
    private Long inUserId;
    private String inUserName;
    private List<Category> children;
}

像這個分類對象中inDate、inUserId和inUserName字段是可以不用保存的。

修改自動名稱。

例如:

@AllArgsConstructor
@Data
public class Category {
    /**
     * 分類編號
     */
    @JsonProperty("i")
    private Long id;

    /**
     * 分類層級
     */
    @JsonProperty("l")
    private Integer level;

    /**
     * 分類名稱
     */
    @JsonProperty("n")
    private String name;

    /**
     * 父分類編號
     */
    @JsonProperty("p")
    private Long parentId;

    /**
     * 子分類列表
     */
    @JsonProperty("c")
    private List<Category> children;
}

由于在一萬多條數據中,每條數據的字段名稱是固定的,他們的重復率太高了。

由此,可以在json序列化時,改成一個簡短的名稱,以便于返回更少的數據大小。

5.2 數據做壓縮

這還不夠,需要對存儲的數據做壓縮。

之前在Redis中保存的key/value,其中的value是json格式的字符串。

其實RedisTemplate支持,value保存byte數組。

先將json字符串數據用GZip工具類壓縮成byte數組,然后保存到Redis中。

再獲取數據時,將byte數組轉換成json字符串,然后再轉換成分類樹。

這樣優化之后,保存到Redis中的分類樹的數據大小,一下子減少了10倍,Redis的大key問題被解決了。

如果大家對大key問題如何優化,比較感興趣,可以看看我的另一篇文章《分類樹,我從2s優化到0.1s》,里面有真實的案例。

6 熱key問題

不知道大家聽說過二八原理沒有。

80%的用戶經常訪問20%的熱點數據。

這樣帶來的結果是數據的傾斜,不能均勻分布,尤其是高并發系統中問題比較大。

比如你現在搞了一個促銷活動,有幾款商品性價比非常高,這些商品數據在Redis中按分片保存的,不同的數據保存在不同的服務器節點上。

如果用戶瘋狂搶購其中3款商品,而這3款商品正好保存在同一臺Redis服務端節點。

這樣會出現大量的用戶請求集中訪問同一天Redis服務器節點,該節點很有可能會因為扛不住這么大的壓力,而直接down機。

這個就是熱key問題帶來的危害。

那么,如何解決這個問題呢?

6.1 拆分key

在促銷活動開始之前,我們要提前做好評估,分析這些商品哪些是熱點商品。

然后將熱點商品分開保存,不要集中保存到同一臺Redis服務器節點。

這樣不同的Redis服務器節點,可以分攤一些用戶的請求壓力。

6.2 增加本地緩存

對應熱key,我們可以增加一層本地緩存,能夠提升性能的同時也能避免Redis訪問量過大的問題。

但帶來的壞處是,可能會出現數據不一致問題,要根據實際的業務場景選擇。

7 命中率問題

緩存的命中率問題,是一個讓人非常頭疼的問題。

前面的章節已經介紹過。

一般情況下,如果有用戶請求過來,先查緩存,如果緩存中存在數據,則直接返回。

如果緩存中不存在,則再查數據庫,如果數據庫中存在,則將數據放入緩存,然后返回。如果數據庫中也不存在,則直接返回失敗。

流程圖如下:

圖片圖片

緩存命中:直接從緩存中獲取數據。

緩存不命中:無法從緩存中獲取數據,而要從數據庫獲取其他途徑獲取數據。

我們肯定是希望緩存命中率越高越好,這樣接口的性能越好,但實際工作中卻經常啪啪打臉。

因為可能會出現緩存不存在,或者緩存過期等問題,導致緩存不能命中。

那么,如何提升緩存的命中率呢?

7.1 緩存預熱

我們在API服務啟動之前,可以先用job,將相關數據先保存到緩存中,做預熱。

這樣后面的用戶請求,就能直接從緩存中獲取數據,而無需訪問數據庫了。

7.2 合理調整過期時間

有時候,我們給緩存設置的過期時間太短,導致后面會產生大量的過期緩存。

會導致緩存命中率非常低。

這時需要合理調整過期時間,比如:之前設置1秒的,現在改成5秒,10秒,30秒或者1分鐘等等。

7.3 增加緩存內存

如果我們部署的Redis服務器的內存太小,很容易出現內存不足的情況,從而會頻繁觸發內存淘汰機制。

也會影響緩存的命中率。

這種情況下,我們需要增加緩存內存。

緩存的內存過小問題,也經常會出現。

今天的內容先分享到這里,感謝你的閱讀,希望對你會有所幫助。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2017-07-17 15:46:20

Oracle并行機制

2019-10-30 14:44:41

Prometheus開源監控系統

2024-04-01 08:05:27

Go開發Java

2015-03-24 16:29:55

默認線程池java

2020-11-03 13:50:31

Redis緩存數據庫

2023-12-14 17:34:22

Kubernetes集群K8s

2025-04-29 10:17:42

2025-10-16 08:10:59

2024-04-10 08:39:56

BigDecimal浮點數二進制

2018-01-10 13:40:03

數據庫MySQL表設計

2025-11-06 02:55:00

2024-06-26 10:37:05

2018-09-11 09:14:52

面試公司缺點

2023-03-13 13:36:00

Go擴容切片

2024-02-04 08:26:38

線程池參數內存

2025-06-03 06:30:05

2024-03-14 10:30:05

緩存場景DEMO

2025-05-16 10:53:43

開發異步編程JavaScrip

2021-02-21 09:28:24

kafka系統并發量

2022-04-26 21:49:55

Spring事務數據庫
點贊
收藏

51CTO技術棧公眾號

在线日韩欧美| 日韩制服一区| 99久久精品国产一区二区三区 | 高h放荡受浪受bl| 欧美在线不卡| 精品播放一区二区| 黑人糟蹋人妻hd中文字幕| 飘雪影院手机免费高清版在线观看| 伊人久久久大香线蕉综合直播| 亚洲韩国日本中文字幕| www.日本xxxx| 二区在线播放| 粉嫩av一区二区三区粉嫩| 午夜欧美不卡精品aaaaa| www在线观看免费视频| 日本成人一区二区| 亚洲一区视频在线| 免费看成人片| 国产三级三级在线观看| 亚洲午夜激情在线| 亚洲男人天堂2019| 三级一区二区三区| 少妇淫片在线影院| 国产精品三级av| 97超碰人人模人人爽人人看| www.av麻豆| 亚洲女同中文字幕| 精品亚洲永久免费精品| 999这里有精品| heyzo一区| 1000精品久久久久久久久| 国产精品视频福利| 中文字幕一区二区人妻痴汉电车| 欧美+亚洲+精品+三区| 亚洲摸下面视频| 久久久精品人妻一区二区三区| 性欧美xxx69hd高清| 国产精品高清亚洲| 欧美日韩国产免费一区二区三区 | 亚洲狠狠婷婷| 日韩综合视频在线观看| 中文幕无线码中文字蜜桃| 电影一区中文字幕| 色婷婷综合激情| 中国黄色录像片| fc2在线中文字幕| 99久久综合99久久综合网站| 91精品国产综合久久男男| 麻豆一区二区三区精品视频| 91久久久精品国产| 亚洲新声在线观看| 中文在线观看免费视频| 久久九九精品视频| 欧美精品xxxxbbbb| 国产97在线 | 亚洲| 亚洲欧美成人影院| 亚洲人精品午夜| 亚洲一区二区在线免费观看| 日本福利片高清在线观看| 成人av资源在线观看| 亚洲最大av在线| 国产男男gay体育生网站| 欧美a级理论片| 26uuu亚洲国产精品| 免看一级a毛片一片成人不卡| 欧美永久精品| 九九热99久久久国产盗摄| 熟女av一区二区| 欧美中文一区二区| 日韩中文综合网| 亚洲熟女少妇一区二区| 国产一区二区观看| 亚洲香蕉av在线一区二区三区| 韩国女同性做爰三级| 亚洲福利网站| 亚洲欧美激情一区| 熟女俱乐部一区二区视频在线| 日韩成人av在线资源| 日韩国产欧美区| 亚洲成人av免费在线观看| 国产+成+人+亚洲欧洲在线| 亚洲国产精品小视频| 无码人妻精品一区二区三区99不卡| 天堂va欧美ⅴa亚洲va一国产| 欧美放荡的少妇| 久久婷婷中文字幕| 亚洲va欧美va人人爽成人影院| 欧美一级电影网站| 亚洲 自拍 另类 欧美 丝袜| 户外露出一区二区三区| 欧美性生交片4| 中文字幕 日韩 欧美| 95精品视频| 日韩视频国产视频| www.啪啪.com| 97人人澡人人爽91综合色| 精品sm在线观看| 巨胸大乳www视频免费观看| 国产精品一线天粉嫩av| 亚洲天堂网站在线观看视频| 精品一区二区三孕妇视频| 91精品久久久久久久蜜月| 欧美另类极品videosbest最新版本| 永久看片925tv| 伊人久久婷婷| 国产成人精品久久二区二区| 亚洲专区在线播放| 久久99精品国产| 不卡的av一区| 免费在线性爱视频| 亚洲欧洲成人自拍| 僵尸世界大战2 在线播放| 天天综合av| 欧美日韩国产高清一区| 欧美图片自拍偷拍| 美女av一区| 色妞欧美日韩在线| 久草网在线观看| 中文久久精品| 国产日韩精品综合网站| 亚洲欧美另类一区| 欧美激情中文字幕| 国产青草视频在线观看| 成人黄色免费短视频| 日韩一级大片在线| 国产真实乱人偷精品人妻| 成人羞羞网站入口免费| 久久艹在线视频| 中文字幕国产在线观看| 老色鬼精品视频在线观看播放| av一区二区三区四区电影| 噜噜噜噜噜在线视频| 亚洲精品伦理在线| 男女啪啪网站视频| 精品国模一区二区三区欧美 | 国产女主播一区| 日韩国产欧美一区| 国产精品186在线观看在线播放| 91国偷自产一区二区开放时间| 日本高清免费在线视频| 亚洲国产中文在线| 中文字幕日韩专区| 毛片视频网站在线观看| 国产黑丝在线一区二区三区| 欧美日韩在线精品| 久草在线视频福利| 欧美二区在线观看| 夫妇露脸对白88av| 欧美日韩一区二区国产| 国产精品一区二区久久国产| 天堂а在线中文在线无限看推荐| 亚洲欧美另类图片小说| 国产日产欧美视频| 福利电影一区| 欧美第一黄色网| 五月婷婷六月婷婷| 91性感美女视频| 欧美中日韩在线| 国产色99精品9i| 久久精品99无色码中文字幕 | 精品精品国产毛片在线看| 久久视频精品在线| 91麻豆成人精品国产免费网站| 久久综合久久综合久久综合| 免费观看中文字幕| 中文字幕日本一区| 久久综合伊人77777| 亚洲在线观看av| 国产精品国产精品国产专区不蜜| 日韩av片网站| 猛男gaygay欧美视频| 2019精品视频| 内射后入在线观看一区| 亚洲国产成人av| 深夜视频在线观看| 亚洲先锋成人| 亚洲一区二区久久久久久| 在线播放麻豆| 欧美日韩国产123区| 北条麻妃在线观看视频| 美国三级日本三级久久99| 午夜精品区一区二区三| 国产伦精品一区二区三区视频金莲| 国产视频在线观看一区二区| 欧美h在线观看| 国产婷婷色一区二区三区| 青青在线视频免费| 大片网站久久| 91亚洲国产成人精品性色| 九七电影韩国女主播在线观看| 欧洲一区二区av| 99久久精品久久亚洲精品| 国产一区欧美一区| av网站手机在线观看| 猫咪成人在线观看| 国产精品对白刺激| 蜜桃av在线免费观看| 欧美在线一区二区| 看免费黄色录像| 国产91精品一区二区麻豆网站| 蜜臀av色欲a片无码精品一区| 欧美一区自拍| 国产精品视频yy9099| 免费网站成人| 亚洲激情在线观看视频免费| 中文字幕一区二区三区波野结| 亚洲日本在线看| 亚洲黄色免费在线观看| 美女免费视频一区二区| 91精品国产毛片武则天| 三级小说欧洲区亚洲区| 国产精品网站入口| 丁香花在线影院| 亚洲日本中文字幕| 国产精品一区二区人人爽| 一区二区三区**美女毛片| 亚州av综合色区无码一区| 日韩电影在线一区二区| 天天爱天天做天天操| 亚洲成aⅴ人片久久青草影院| 成人啪啪免费看| 欧美少妇网站| 久久精品国产亚洲7777| 蜜臀av中文字幕| 欧美日韩久久久一区| 国产在线拍揄自揄拍无码视频| 国产亚洲综合在线| 麻豆传媒在线看| 日本成人中文字幕在线视频| 成年丰满熟妇午夜免费视频 | 69p69国产精品| 免费在线视频一区二区| 国产精品天干天干在观线| 少妇性l交大片7724com| 日韩黄色免费网站| 国产a级片网站| 欧美裸体在线版观看完整版| 国产精品永久免费观看| 精品丝袜在线| 色综合视频一区中文字幕| yourporn在线观看视频| 亚洲国产精品免费| 99精品视频在线播放免费| 精品久久久久久中文字幕| 色哟哟一一国产精品| 久久久久久久精| 亚洲少妇一区二区| 蜜桃精品视频在线| 好男人www社区| 亚洲GV成人无码久久精品| 国产女主播一区| 亚洲欧美va天堂人熟伦| 91在线观看污| 国产精品日日摸夜夜爽| 国产一区二区导航在线播放| 日本三级黄色网址| 日韩精品免费视频人成| 少妇无码av无码专区在线观看 | 秋霞午夜鲁丝一区二区老狼| 大陆极品少妇内射aaaaa| 欧美福利在线| 亚洲福利av在线| 欧美精品一二| 日本亚洲欧洲精品| 久9久9色综合| 国产尤物91| 欧美久久香蕉| 久久亚洲一区二区| 欧美变态网站| 久久综合一区二区三区| 麻豆一区二区| 精品欧美国产| 香蕉久久精品日日躁夜夜躁| 精品国产一区二区三区久久久久久| 国产亚洲字幕| 国内不卡一区二区三区| 米奇精品关键词| 精品欧美一区二区精品久久| 日韩大尺度在线观看| 91久久精品www人人做人人爽| 欧美不卡在线观看| 成人自拍视频网站| 日韩av不卡一区| 国产视频99| 神马香蕉久久| 色综合电影网| 午夜免费一区| 在线视频不卡一区二区| 精久久久久久| 男人揉女人奶房视频60分| 天堂一区二区在线| 亚洲综合色在线观看| 精东粉嫩av免费一区二区三区| 亚洲高清av一区二区三区| 国产精品亚洲综合一区在线观看| 亚洲精品鲁一鲁一区二区三区| www.亚洲国产| 久久久久久久久久久久久久久| 国产精品女主播av| 欧美日韩成人免费观看| 日本韩国欧美一区二区三区| 一卡二卡在线视频| 亚洲成人999| 偷拍25位美女撒尿视频在线观看| 亚洲人成网站免费播放| 日本中文字幕在线视频| 欧美乱大交xxxxx另类电影| 国产理论在线| 日韩美女主播视频| 91p九色成人| 99免费在线观看视频| 亚洲女娇小黑人粗硬| 日韩av一区二区三区在线| 亚洲精品在线观看91| 久久久久久久久久网| 日韩成人免费电影| 亚洲无人区码一码二码三码| 国产女同互慰高潮91漫画| 亚洲人做受高潮| 黄色成人av网| 国产999久久久| 亚洲一区第一页| 白白色在线观看| 国产区亚洲区欧美区| www.豆豆成人网.com| 日韩亚洲不卡在线| 亚洲成人直播| 午夜精品中文字幕| 99久久久免费精品国产一区二区 | 亚洲欧洲日韩在线| 国产成人精品a视频一区| 欧美日韩黄视频| 三级在线播放| 欧美激情第6页| 国产日韩中文在线中文字幕| 奇米888一区二区三区| 中文字幕日韩一区二区不卡 | 久久久综合香蕉尹人综合网| 99久久九九| 免费毛片小视频| aaa亚洲精品| 免费在线观看黄视频| 欧美精品 日韩| jizz在线观看| 国产精品成人va在线观看| 欧美日韩一区二区三区不卡视频| 黑人巨大国产9丨视频| 日韩电影在线一区二区| 精品夜夜澡人妻无码av| 亚洲欧美电影院| www.国产麻豆| 久青草国产97香蕉在线视频| 欧美成人黄色| 亚洲自拍三区| 久久99国产精品尤物| 日韩黄色中文字幕| 欧美影院午夜播放| 青草久久伊人| 日本伊人精品一区二区三区介绍 | 色噜噜夜夜夜综合网| 手机看片福利永久| 久久久中精品2020中文| 亚洲不卡视频| www亚洲国产| 国内精品久久久久影院色| 中文字幕第69页| 欧美日韩日本视频| 日本美女高清在线观看免费| 国产精品丝袜一区二区三区| 色偷偷综合网| 在线观看中文av| 一区二区三区不卡视频在线观看| 亚洲国产999| 性欧美激情精品| 青草久久视频| 奇米影音第四色| 亚洲欧美怡红院| 国产白浆在线观看| 欧美高跟鞋交xxxxxhd| 国产精品99久久免费| 韩日视频在线观看| 99热99精品| 欧美a视频在线观看| 青青国产91久久久久久| 美女爆乳18禁www久久久久久| 色成年激情久久综合| yjizz视频网站在线播放| 国产精品视频999| 日韩欧美视频在线播放| 曰本三级日本三级日本三级| 午夜在线电影亚洲一区| 天堂а在线中文在线无限看推荐| 国产91九色视频| jizzjizz欧美69巨大| 中文字幕亚洲日本| 福利精品视频在线| wwwww在线观看免费视频| 成人激情春色网| 国产午夜精品一区二区三区欧美 | 国产综合成人久久大片91|