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

如何保證數據庫和緩存雙寫一致性?

數據庫 其他數據庫
今天這篇文章我會從淺入深,跟大家一起聊聊,數據庫和緩存雙寫數據一致性問題常見的解決方案,這些方案中可能存在的坑,以及最優方案是什么。

大家好,我是蘇三,又跟大家見面了。

前言

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

我很負責的告訴大家,該問題無論在面試,還是工作中遇到的概率非常大,所以非常有必要跟大家一起探討一下。

今天這篇文章我會從淺入深,跟大家一起聊聊,數據庫和緩存雙寫數據一致性問題常見的解決方案,這些方案中可能存在的坑,以及最優方案是什么。

1、 常見方案

通常情況下,我們使用緩存的主要目的是為了提升查詢的性能。大多數情況下,我們是這樣使用緩存

的:

  1. 用戶請求過來之后,先查緩存有沒有數據,如果有則直接返回。
  2. 如果緩存沒數據,再繼續查數據庫。
  3. 如果數據庫有數據,則將查詢出來的數據,放入緩存中,然后返回該數據。
  4. 如果數據庫也沒數據,則直接返回空。

這是緩存非常常見的用法。一眼看上去,好像沒有啥問題。

但你忽略了一個非常重要的細節:如果數據庫中的某條數據,放入緩存之后,又立馬被更新了,那么該如何更新緩存呢?

不更新緩存行不行?

答:當然不行,如果不更新緩存,在很長的一段時間內(決定于緩存的過期時間),用戶請求從緩存中獲取到的都可能是舊值,而非數據庫的最新值。這不是有數據不一致的問題?

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

目前有以下4種方案:

  1. 先寫緩存,再寫數據庫。
  2. 先寫數據庫,再寫緩存。
  3. 先刪緩存,再寫數據庫。
  4. 先寫數據庫,再刪緩存。

接下來,我們詳細說說這4種方案。

2、先寫緩存,再寫數據庫

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

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

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

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

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

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

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

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

3、 先寫數據庫,再寫緩存

既然上面的方案行不通,接下來,聊聊先寫數據庫,再寫緩存的方案,該方案在低并發編程中有人在用(我猜的)。 用戶的寫操作,先寫數據庫,再寫緩存,可以避免之前“假數據”的問題。但它卻帶來了新的問題。

什么問題呢?

(1)寫緩存失敗了

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

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

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

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

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

(2) 高并發下的問題

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

其中請求a獲取的是舊數據,而請求b獲取的是新數據,如下圖所示:

  1. 請求a先過來,剛寫完了數據庫。但由于網絡原因,卡頓了一下,還沒來得及寫緩存。
  2. 這時候請求b過來了,先寫了數據庫。
  3. 接下來,請求b順利寫了緩存。
  4. 此時,請求a卡頓結束,也寫了緩存。

很顯然,在這個過程當中,請求b在緩存中的新數據,被請求a的舊數據覆蓋了。

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

(3) 浪費系統資源

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

為什么這么說呢?

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

尤其是cpu和內存資源。

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

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

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

如果你已經用了,趕緊看看踩坑了沒?

4、 先刪緩存,再寫數據庫

通過上面的內容我們得知,如果直接更新緩存的問題很多。

那么,為何我們不能換一種思路:不去直接更新緩存,而改為刪除緩存呢?

刪除緩存方案,同樣有兩種:

  1. 先刪緩存,再寫數據庫。
  2. 先寫數據庫,再刪緩存。

我們一起先看看:先刪緩存,再寫數據庫的情況。

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

(1)高并發下的問題

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

  1. 請求d先過來,把緩存刪除了。但由于網絡原因,卡頓了一下,還沒來得及寫數據庫。
  2. 這時請求c過來了,先查緩存發現沒數據,再查數據庫,有數據,但是舊值。
  3. 請求c將數據庫中的舊值,更新到緩存中。
  4. 此時,請求d卡頓結束,把新值寫入數據庫。

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

那么,這種場景的數據不一致問題,能否解決呢?

(2) 緩存雙刪

在上面的業務場景中,一個讀數據請求,一個寫數據請求。當寫數據請求把緩存刪了之后,讀數據請求,可能把當時從數據庫查詢出來的舊值,寫入緩存當中。

有人說還不好辦,請求d在寫完數據庫之后,把緩存重新刪一次不就行了?

這就是我們所說的緩存雙刪,即在寫數據庫之前刪除一次,寫完數據庫后,再刪除一次。

該方案有個非常關鍵的地方是:第二次刪除緩存,并非立馬就刪,而是要在一定的時間間隔之后。

我們再重新回顧一下,高并發下一個讀數據請求,一個寫數據請求導致數據不一致的產生過程:

  1. 請求d先過來,把緩存刪除了。但由于網絡原因,卡頓了一下,還沒來得及寫數據庫。
  2. 這時請求c過來了,先查緩存發現沒數據,再查數據庫,有數據,但是舊值。
  3. 請求c將數據庫中的舊值,更新到緩存中。
  4. 此時,請求d卡頓結束,把新值寫入數據庫。
  5. 一段時間之后,比如:500ms,請求d將緩存刪除。

這樣來看確實可以解決緩存不一致問題。

那么,為什么一定要間隔一段時間之后,才能刪除緩存呢?

請求d卡頓結束,把新值寫入數據庫后,請求c將數據庫中的舊值,更新到緩存中。

此時,如果請求d刪除太快,在請求c將數據庫中的舊值更新到緩存之前,就已經把緩存刪除了,這次刪除就沒任何意義。必須要在請求c更新緩存之后,再刪除緩存,才能把舊值及時刪除了。

所以需要在請求d中加一個時間間隔,確保請求c,或者類似于請求c的其他請求,如果在緩存中設置了舊值,最終都能夠被請求d刪除掉。

接下來,還有一個問題:如果第二次刪除緩存時,刪除失敗了該怎么辦?

這里先留點懸念,后面會詳細說。

5、 先寫數據庫,再刪緩存

從前面得知,先刪緩存,再寫數據庫,在并發的情況下,也可能會出現緩存和數據庫的數據不一致的情況。

那么,我們只能寄希望于最后的方案了。

接下來,我們重點看看先寫數據庫,再刪緩存的方案。

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

  1. 請求e先寫數據庫,由于網絡原因卡頓了一下,沒有來得及刪除緩存。
  2. 請求f查詢緩存,發現緩存中有數據,直接返回該數據。
  3. 請求e刪除緩存。

在這個過程中,只有請求f讀了一次舊數據,后來舊數據被請求e及時刪除了,看起來問題不大。

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

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

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

答:對的。

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

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

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

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

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

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

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

推薦大家使用先寫數據庫,再刪緩存的方案,雖說不能100%避免數據不一致問題,但出現該問題的概率,相對于其他方案來說是最小的。

但在該方案中,如果刪除緩存失敗了該怎么辦呢?

6、 刪緩存失敗怎么辦?

先寫數據庫,再刪緩存的方案,跟緩存雙刪的方案一樣,有一個共同的風險點,即:如果緩存刪除失敗了,也會導致緩存和數據庫的數據不一致。

那么,刪除緩存失敗怎么辦呢?

答:需要加重試機制。

在接口中如果更新了數據庫成功了,但更新緩存失敗了,可以立刻重試3次。如果其中有任何一次成功,則直接返回成功。如果3次都失敗了,則寫入數據庫,準備后續再處理。

當然,如果你在接口中直接同步重試,該接口并發量比較高的時候,可能有點影響接口性能。

這時,就需要改成異步重試了。

異步重試方式有很多種,比如:

  1. 每次都單獨起一個線程,該線程專門做重試的工作。但如果在高并發的場景下,可能會創建太多的線程,導致系統OOM問題,不太建議使用。
  2. 將重試的任務交給線程池處理,但如果服務器重啟,部分數據可能會丟失。
  3. 將重試數據寫表,然后使用elastic-job等定時任務進行重試。
  4. 將重試的請求寫入mq等消息中間件中,在mq的consumer中處理。
  5. 訂閱mysql的binlog,在訂閱者中,如果發現了更新數據請求,則刪除相應的緩存。

7、 定時任務

使用定時任務重試的具體方案如下:

當用戶操作寫完數據庫,但刪除緩存失敗了,需要將用戶數據寫入重試表中。如下圖所示:

在定時任務中,異步讀取重試表中的用戶數據。重試表需要記錄一個重試次數字段,初始值為0。然后重試5次,不斷刪除緩存,每重試一次該字段值+1。如果其中有任意一次成功了,則返回成功。如果重試了5次,還是失敗,則我們需要在重試表中記錄一個失敗的狀態,等待后續進一步處理。

在高并發場景中,定時任務推薦使用elastic-job。相對于xxl-job等定時任務,它可以分片處理,提升處理速度。同時每片的間隔可以設置成:1,2,3,5,7秒等。

如果大家對定時任務比較感興趣的話,可以看看我的另一篇文章《學會這10種定時任務,我有點飄了》,里面列出了目前最主流的定時任務。

使用定時任務重試的話,有個缺點就是實時性沒那么高,對于實時性要求特別高的業務場景,該方案不太適用。但是對于一般場景,還是可以用一用的。

但它有一個很大的優點,即數據是落庫的,不會丟數據。

8、mq

在高并發的業務場景中,mq(消息隊列)是必不可少的技術之一。它不僅可以異步解耦,還能削峰填谷。對保證系統的穩定性是非常有意義的。

對mq有興趣的朋友可以看看我的另一篇文章《mq的那些破事兒》。

mq的生產者,生產了消息之后,通過指定的topic發送到mq服務器。然后mq的消費者,訂閱該topic的消息,讀取消息數據之后,做業務邏輯處理。

使用mq重試的具體方案如下:

  1. 當用戶操作寫完數據庫,但刪除緩存失敗了,產生一條mq消息,發送給mq服務器。
  2. mq消費者讀取mq消息,重試5次刪除緩存。如果其中有任意一次成功了,則返回成功。如果重試了5次,還是失敗,則寫入死信隊列中。
  3. 推薦mq使用rocketmq,重試機制和死信隊列默認是支持的。使用起來非常方便,而且還支持順序消息,延遲消息和事務消息等多種業務場景。

當然在該方案中,刪除緩存可以完全走異步。即用戶的寫操作,在寫完數據庫之后,不用立刻刪除一次緩存。而直接發送mq消息,到mq服務器,然后有mq消費者全權負責刪除緩存的任務。

因為mq的實時性還是比較高的,因此改良后的方案也是一種不錯的選擇。

9、 binlog

前面我們聊過的,無論是定時任務,還是mq(消息隊列),做重試機制,對業務都有一定的侵入性。

在使用定時任務的方案中,需要在業務代碼中增加額外邏輯,如果刪除緩存失敗,需要將數據寫入重試表。

而使用mq的方案中,如果刪除緩存失敗了,需要在業務代碼中發送mq消息到mq服務器。

其實,還有一種更優雅的實現,即監聽binlog,比如使用:canal等中間件。

具體方案如下:

  1. 在業務接口中寫數據庫之后,就不管了,直接返回成功。
  2. mysql服務器會自動把變更的數據寫入binlog中。
  3. binlog訂閱者獲取變更的數據,然后刪除緩存。

這套方案中業務接口確實簡化了一些流程,只用關心數據庫操作即可,而在binlog訂閱者中做緩存刪除工作。

但如果只是按照圖中的方案進行刪除緩存,只刪除了一次,也可能會失敗。

如何解決這個問題呢?

答:這就需要加上前面聊過的重試機制了。如果刪除緩存失敗,寫入重試表,使用定時任務重試。或者寫入mq,讓mq自動重試。

在這里推薦使用mq自動重試機制。

在binlog訂閱者中如果刪除緩存失敗,則發送一條mq消息到mq服務器,在mq消費者中自動重試5次。如果有任意一次成功,則直接返回成功。如果重試5次后還是失敗,則該消息自動被放入死信隊列,后面可能需要人工介入。

責任編輯:姜華 來源: 蘇三說技術
相關推薦

2022-04-01 16:55:22

數據庫緩存日志

2020-09-03 09:45:38

緩存數據庫分布式

2021-06-11 09:21:58

緩存數據庫Redis

2022-12-05 08:24:32

mongodb數據庫數據

2018-05-16 16:10:28

數據庫緩存MySQL

2024-10-28 12:41:25

2022-03-29 10:39:10

緩存數據庫數據

2024-12-26 15:01:29

2020-06-01 22:09:48

緩存緩存同步緩存誤用

2024-01-22 08:52:00

AQS雙異步數據一致性

2022-02-23 09:17:09

數據庫分離變更

2025-04-27 08:52:21

Redis數據庫緩存

2021-12-01 08:26:27

數據庫緩存技術

2022-10-19 12:22:53

并發扣款一致性

2019-08-30 12:46:10

并發扣款查詢SQL

2025-03-27 08:20:54

2023-09-07 08:11:24

Redis管道機制

2021-06-04 09:56:12

RedisMySQL美團

2024-08-06 09:42:23

2022-12-14 08:23:30

點贊
收藏

51CTO技術棧公眾號

国产乱子伦精品无码码专区| 国产1区2区在线| 国产精品日韩无码| 99re国产精品| 国产一区二区精品丝袜| 久久久精品视频国产| 中国av在线播放| aaa亚洲精品一二三区| 国产精品普通话| 欧美黄色免费看| 亚洲黄页网站| 日韩欧美在线观看一区二区三区| 亚洲熟妇av日韩熟妇在线| 在线毛片网站| 99r精品视频| 99久久免费国产| 成人免费在线视频| 国产成人自拍高清视频在线免费播放| 欧美一区午夜视频在线观看| 日韩日韩日韩日韩日韩| 在线视频91p| 99麻豆久久久国产精品免费| 91亚洲一区精品| 国产成人精品亚洲| 中国女人久久久| 欧美成人第一页| 99在线视频免费| 日韩av三区| 精品国产亚洲一区二区三区在线观看| 亚洲欧洲日本精品| 欧美成人ⅴideosxxxxx| 亚洲国产日日夜夜| 日本黄网站色大片免费观看| 福利视频在线导航| 久久久国际精品| 久久久久久a亚洲欧洲aⅴ| 亚洲成人一级片| 国产乱码字幕精品高清av| 国产精品吴梦梦| 天堂av免费在线观看| 国产午夜久久| 91国产美女视频| 国产成人无码精品亚洲| 激情婷婷久久| 久久久久久久香蕉网| 国产av 一区二区三区| 99久久夜色精品国产亚洲狼| 色yeye香蕉凹凸一区二区av| 一级在线观看视频| 残酷重口调教一区二区| 在线播放国产精品| 懂色av粉嫩av浪潮av| 成人激情开心网| 中文字幕久久久av一区| 欧美xxxx精品| 欧美顶级大胆免费视频| 久久精品99久久香蕉国产色戒| 天堂网av2018| 在线成人直播| 欧美极品美女视频网站在线观看免费 | 日韩黄色三级视频| 欧美日韩国产成人精品| 欧美激情精品久久久久久| 中文字幕第28页| 国产欧美精品久久| 国产成人在线精品| 91av久久久| 国产高清精品在线| 国产一区二区无遮挡| 奇米影视888狠狠狠777不卡| 国产日韩欧美综合在线| 一本一道久久a久久综合精品| 日本激情在线观看| 亚洲黄色小说网站| 无码专区aaaaaa免费视频| 二区三区不卡| 欧美日韩一区二区三区四区| 亚洲欧美日韩网站| 黑人久久a级毛片免费观看| 国产丝袜一区视频在线观看| 奇米网一区二区| 综合天天久久| 91产国在线观看动作片喷水| 自拍偷拍精品视频| 国产99久久久精品| 欧洲精品久久| 污污视频在线| 日本精品视频一区二区三区| 想看黄色一级片| 欧美人妖在线观看| xvideos亚洲人网站| 亚洲精品午夜久久久久久久| 日韩电影网1区2区| 成人av蜜桃| 毛片在线能看| 亚洲精品久久嫩草网站秘色| 黄色动漫网站入口| 国产 日韩 欧美| 精品亚洲男同gayvideo网站| 爱爱视频免费在线观看| 久久久久国内| 91精品国产高清久久久久久91裸体| 视频一区二区三区在线看免费看| 最新成人av在线| 欧美日韩中文在线视频| 日韩免费精品| 色视频www在线播放国产成人| 国产精品999久久久| 日精品一区二区| 国产欧美日韩一区| а√中文在线8| 91久久香蕉国产日韩欧美9色| 熟女人妻一区二区三区免费看| 尤物tv在线精品| 久操成人在线视频| 中文字幕乱码视频| 久久影院午夜片一区| 97超碰国产精品| 先锋影音网一区二区| 亚洲欧美在线看| 亚洲国产综合久久| 国产精品亚洲第一区在线暖暖韩国| 欧美一进一出视频| 免费毛片b在线观看| 日韩丝袜情趣美女图片| 国产一区第一页| 蜜桃久久久久久久| 日本一区二区免费看| 免费毛片b在线观看| 精品国产精品一区二区夜夜嗨| 国精品无码一区二区三区| 免费在线观看一区二区三区| 久久一区二区三区av| aa级大片免费在线观看| 精品久久久久久久久久久久久久久| 永久免费未视频| 精品一区二区三区在线观看国产 | 麻豆视频在线免费观看| 日本高清成人免费播放| 精品人伦一区二区三电影| 亚洲欧美日韩在线观看a三区| 国产伦精品一区二区三区视频黑人 | 91黄色在线视频| 中文av字幕一区| 日韩欧美国产片| 99热精品久久| 1卡2卡3卡精品视频| www久久日com| 日韩美女视频在线| 久久黄色小视频| 成人精品高清在线| 欧美一级视频免费看| 偷窥自拍亚洲色图精选| 性欧美亚洲xxxx乳在线观看| 五月天婷婷在线播放| 精品久久久久久久久久久| 欧美大喷水吹潮合集在线观看| 亚洲激情亚洲| 欧美日韩精品免费观看| 欧美123区| 日韩在线观看免费av| 国产suv精品一区二区69| 一区二区三区波多野结衣在线观看| 91视频免费入口| 亚洲理论在线| 青青草国产精品| 亚洲一区二区小说| 久久999免费视频| 天堂中文网在线| 欧美在线不卡视频| 91插插插插插插| 91日韩一区二区三区| 国产 porn| 这里只有精品在线| 精品亚洲欧美日韩| 久久91视频| 欧美激情精品久久久久久久变态| 亚洲色偷精品一区二区三区| 欧洲精品在线观看| 欧美爱爱小视频| 2024国产精品视频| 在线观看岛国av| 18成人免费观看视频| 日本10禁啪啪无遮挡免费一区二区| 久久日本片精品aaaaa国产| 九九精品视频在线观看| 免费一级在线观看播放网址| 欧美一区二区三区视频免费播放| 日本在线播放视频| 中文字幕中文字幕中文字幕亚洲无线| 中文字幕99页| 日本成人在线一区| 免费看欧美一级片| 久久影院100000精品| 国产伦精品一区二区三区视频黑人| 欧美国产日韩电影| 国内精品中文字幕| 黄色网页在线观看| 亚洲人高潮女人毛茸茸| 亚洲第一天堂网| 欧美图区在线视频| 亚洲天堂一区在线观看| 亚洲人成人一区二区在线观看 | 97免费视频在线播放| 欧美成人hd| 国产午夜精品麻豆| 丰满人妻一区二区| 欧美福利一区二区| 亚洲男人天堂网址| 福利视频一区二区| 久久久久成人精品无码| 国产精品久久精品日日| 波多野结衣办公室33分钟| 国产福利精品一区二区| 91插插插插插插插插| 欧美在线综合| 国产深夜男女无套内射| 综合久久十次| 中文字幕日韩精品久久| 久久99视频| 久久久久久九九九九| 成人香蕉社区| 51成人做爰www免费看网站| 日韩免费大片| 国产美女久久精品香蕉69| 欧美日韩五码| 欧美亚洲国产日韩2020| segui88久久综合9999| 欧美福利视频网站| 在线免费观看污| 久久精品一区中文字幕| 在线视频三区| 久久精品99无色码中文字幕| 91免费在线| 最近2019中文免费高清视频观看www99| 欧美色视频免费| 日韩精品中文在线观看| 日漫免费在线观看网站| 日韩av在线免费| 婷婷久久久久久| 日韩国产一区三区| 头脑特工队2免费完整版在线观看| 精品99久久久久久| 国产 日韩 欧美 综合| 日韩精品专区在线影院观看| 亚洲AV无码精品色毛片浪潮| 欧美成人一区二区三区在线观看| 99热这里只有精| 欧美岛国在线观看| 日本xxxx人| 亚洲韩国青草视频| 免费在线看v| 色妞一区二区三区| 成人在线观看网站| 精品精品国产国产自在线| 免费黄色网页在线观看| 久久视频在线播放| 欧美videosex性欧美黑吊| 国产+成+人+亚洲欧洲| 亚洲天堂手机| 国产精品美女在线| 国产日韩在线观看视频| 97人人干人人| 欧美网色网址| 欧美日韩一区二区三区在线视频| 精品日本12videosex| 亚洲国产一区二区三区在线| 香港欧美日韩三级黄色一级电影网站| 日本一区二区免费高清视频| 精品999网站| 精品99在线视频| 久久se精品一区精品二区| 福利二区91精品bt7086| 亚洲天堂精品一区| 亚洲精品视频自拍| 国产 日韩 欧美 在线| 欧美自拍偷拍一区| 亚洲黄色a级片| 亚洲欧美激情另类校园| 日本成a人片在线观看| 欧美日韩第一页| 中文在线аv在线| 国产主播喷水一区二区| 99亚洲乱人伦aⅴ精品| 日本免费高清一区| 欧美+日本+国产+在线a∨观看| 日本日本19xxxⅹhd乱影响| 美女在线观看视频一区二区| 白丝校花扒腿让我c| 国产欧美日韩久久| 免费中文字幕在线观看| 91福利在线导航| 亚洲乱码精品久久久久..| 亚洲欧洲黄色网| 日韩激情美女| 国产精品久久久久久久久久久不卡 | 青青青草网站免费视频在线观看| www.xxxx欧美| 亚洲天堂手机| 超碰97国产在线| 91蜜臀精品国产自偷在线| 国产青青在线视频| 国产一区二区三区久久久| 尤物视频最新网址| 亚洲线精品一区二区三区八戒| 老熟妇一区二区三区啪啪| 欧美精品一区二区三区很污很色的| av网站在线免费观看| 91国产在线精品| 亚洲性视频在线| 亚洲精品中字| 久久久777| 少妇被狂c下部羞羞漫画| 亚洲欧美中日韩| 婷婷激情五月综合| 亚洲精品成a人在线观看| 亚洲无线看天堂av| 成人免费网站在线看| 国产欧美亚洲精品a| 国产网站免费在线观看| 国产乱码精品一品二品| 女教师淫辱の教室蜜臀av软件| 欧美日韩一区二区在线| 丰满大乳国产精品| 日韩在线观看精品| 日日夜夜精品| 亚洲午夜精品久久久中文影院av | 日韩欧美精品一区| 女人另类性混交zo| 久久一区二区三区国产精品| 亚洲国产精品成人无久久精品 | 超碰在线播放97| 久久综合电影一区| 国产精一区二区| 亚洲国产精品综合| 日韩成人免费在线| 国产传媒在线看| 欧美网站一区二区| 免费黄色电影在线观看| 成人欧美一区二区三区在线| 97精品国产福利一区二区三区| 亚洲黄色av网址| 国产精品久久毛片| 伊人精品在线视频| 精品久久国产精品| 久久伊人精品| 一道本在线观看视频| 国产精品一区在线| 国产在线欧美在线| 亚洲精品美女久久久| 电影在线观看一区| 日本成人三级电影网站| 日韩极品在线观看| 男人晚上看的视频| 欧美一区二区三区在线观看 | 欧美xxxxx视频| 人人干人人干人人| 综合久久国产九一剧情麻豆| 国产特黄一级片| 97久久超碰福利国产精品…| 人妖一区二区三区| 国产精品igao| 国产精品系列在线| 国内老熟妇对白hdxxxx| 久久男人资源视频| 一区二区美女| 天天色天天综合网| 亚洲成人高清在线| 精品亚洲成a人片在线观看| 久久天天做天天爱综合色| 欧美丰满少妇人妻精品| 日本精品一级二级| 成人午夜在线影视| 国产视频一区二区不卡| 首页亚洲欧美制服丝腿| 一本一本久久a久久| 精品国产免费久久| 色婷婷综合久久久中字幕精品久久| 亚洲国产一区二区在线| 成人中文字幕合集| 51国产偷自视频区视频| 日韩中文字幕视频| 好吊妞国产欧美日韩免费观看网站| 国产精品-区区久久久狼| 亚洲视频小说图片| 亚洲色偷精品一区二区三区| 成人av色在线观看| 一本色道久久| 久久国产波多野结衣| 精品视频—区二区三区免费| 亚洲国产天堂| aa在线免费观看| 亚洲精品国产一区二区精华液| 欧美孕妇性xxxⅹ精品hd| 91中文字幕一区| 日韩成人伦理电影在线观看| 国产一卡二卡在线| 久久久精品电影| 国模精品一区| 91精品又粗又猛又爽|