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

Easy-cache:統一緩存解決方案,讓開發人員告別重復的緩存代碼

開發 項目管理
為了讓開發人員告別重復的緩存代碼,專注于業務邏輯,把緩存問題交給框架處理,基于RocksCache的思想實現了一個統一的緩存一致性解決方案:Easy-cache。

1、引言

1.1 核心理念

2、核心實現

2.1 實現目標:簡單易用的緩存工具

2.2 設計思路

2.3 緩存決策:多級緩存動態升降級

2.4 數據一致性保證機制

2.5 Lua腳本預加載:解決開銷問題

3、核心特性

3.1 分布式鎖保證一致性

3.2 多級緩存架構

3.3 彈性過期機制

3.4 注解驅動的簡化設計

4、總結

1、引言

在分布式系統開發中,緩存問題一直是開發人員的"痛點":如何保證數據一致性?Redis宕機怎么辦?緩存穿透、緩存擊穿、緩存雪崩等問題怎么處理?每個項目都要重復編寫類似的緩存處理代碼,既浪費時間又容易出錯。

1.1 核心理念

為了讓開發人員告別重復的緩存代碼,專注于業務邏輯,把緩存問題交給框架處理,基于RocksCache的思想實現了一個統一的緩存一致性解決方案:Easy-cache。方案通過Spring AOP提供簡單易用的注解式緩存操作,還支持 Redis 集群緩存和本地二級緩存,具備多級緩存動態升降級、容錯機制、彈性過期、最終一致性保障等高級特性。開發人員在開發需求時不需要額外編寫代碼保證一致性、宕機、穿透等問題,只需要在注解設置對應策略即可。

2、核心實現

2.1 實現目標:簡單易用的緩存工具

我們的目標是設計一個簡單易用、代碼侵入性小的緩存工具。Spring AOP就是一個非常好的實現方式,在切面中編寫好緩存邏輯,開發者只需要在查詢方法上添加指定注解,就能獲得緩存能力,無需編寫任何緩存邏輯代碼。

@Cacheable(clusterId = "cluster1", prefix = "user", keys = {"#userId"})
public User getUserById(Long userId) {
    return userRepository.findById(userId);
}

@UpdateCache(clusterId = "cluster1", prefix = "user", keys = {"#userId"})
public User update(User user) {
    return userRepository.update(user);
}

基于常見的緩存問題和場景,切面應該實現以下功能:

  • 實現緩存的查詢與更新邏輯
  • 保證數據一致性
  • 容錯處理(防穿透、多級緩存、自動升降級)

接下來,我將詳細介紹緩存切面的具體設計實現。

2.2 設計思路

工具的入口為AOP攔截到指定注解,通過中央調度器依次進行容錯處理、查詢緩存、處理結果、返回結果。具體流程如圖所示:

圖片圖片

  • 注解驅動:通過Spring AOP攔截 @Cacheable 和 @CacheUpdate注解觸發查詢和更新緩存
  • 統一調度:調度器處理所有查詢/更新緩存邏輯
  • 容錯機制:裝飾器模式增加容錯功能,防止緩存穿透等問題
  • 多級緩存:Redis + 本地緩存,保證高可用;監控和維護集群健康度,緩存自動升降級,保證服務穩定性。
  • 彈性數據一致性保障:執行Lua腳本保證一組緩存操作的原子性。支持設置數據庫緩存不一致時間,默認為1.5s,框架在1.5s后保證最終一致性。當用戶設置不一致時間為0s時,框架保證實時一致性。

2.3 緩存決策:多級緩存動態升降級

框架的默認多級緩存策略為:優先查詢并更新Redis集群,當Redis集群不可用時,查詢并更新本地緩存。為此需要一個決策器,當Redis宕機時請求能夠直接請求本地緩存,在Redis恢復后請求會重新優先請求Redis。決策流程如圖所示:

圖片圖片

查詢請求A首先經過決策器,當前時刻故障信息類集群異常事件未達到閾值,仍然優先請求Redis。

此時查詢Redis異常,發送異常事件,故障動態管理類監聽到異常事件后通知異常事件+1。

故障動態管理類內部定時任務查詢發現集群異常事件已到達閾值:

  • 標記集群不可用。
  • 啟動集群探活定時任務。

查詢請求B經過決策器,發現集群不可用,直接與本地緩存交互,實現緩存降級

當集群探活成功后,會標識集群可用,此時探活定時任務關閉,后續查詢請求會優先請求Redis,實現緩存升級

2.4 數據一致性保證機制

基于RocksCache思想,通過Redis-Hash結構和Lua腳本原子操作,確保緩存數據的最終一致性。

緩存中的數據是具有以下字段的哈希結構:

  • value:數據本身
  • lockInfo:鎖定狀態信息('locked' 或 'unLock')
  • unlockTime:數據鎖過期時間,當一個進程查詢緩存沒有數據時,則鎖定緩存一小段時間,然后查詢DB、更新緩存
  • owner:數據鎖唯一ID,標識當前鎖的持有者其中,owner、lockInfo、unlockTime基于Lua腳本執行的原子性實現了一個分布式鎖。
查詢緩存時,Lua腳本會執行以下邏輯

如果數據為空且鎖已過期: 則鎖定緩存,返回 NEED_QUERY,同步執行"取數據"并返回結果

如果數據為空且被鎖定: 則返回 NEED_WAIT,休眠100ms并再次查詢

如果數據不為空且被鎖定: 則立即返回SUCCESS_NEED_QUERY和緩存數據,異步執行"取數據"

如果數據不為空且未鎖定: 則立即返回SUCCESS和緩存數據

private staticfinal String GET_SH =
        "local key = KEYS[1]\n"
            + "local newUnlockTime = ARGV[1]\n"
            + "local owner = ARGV[2]\n"
            + "local currentTime = tonumber(ARGV[3])\n"
            + "local value = redis.call('HGET', key, '" + VALUE + "')\n"
            + "local unlockTime = redis.call('HGET', key, '" + UNLOCK_TIME + "')\n"
            + "local lockOwner = redis.call('HGET', key, '" + OWNER + "')\n"
            + "local lockInfo = redis.call('HGET', key, '" + LOCK_INFO + "')\n"
            + "if unlockTime and currentTime > tonumber(unlockTime) then\n"
            + "    redis.call('HMSET', key, '" + LOCK_INFO + "', 'locked', '" + UNLOCK_TIME + "', 'newUnlockTime', '" + OWNER + "', owner)\n"
            + "    return {value, '" + NEED_QUERY + "'}\n"
            + "end\n"
            + "if not value or value == '' then\n"
            + "    if lockOwner and lockOwner ~= owner then\n"
            + "        return {value, '" + NEED_WAIT + "'}\n"
            + "    end\n"
            + "    redis.call('HMSET', key, '" + LOCK_INFO + "', 'locked', '" + UNLOCK_TIME + "', newUnlockTime, '" + OWNER + "', owner)\n"
            + "    return {value, '" + NEED_QUERY + "'}\n"
            + "end\n"
            + "if lockInfo and lockInfo == 'locked' then \n"
            + "    return {value, '" + SUCCESS_NEED_QUERY + "'}\n"
            + "end\n"
            + "return {value , '" + SUCCESS + "'}";

"取數據"操作定義:查詢數據庫并更新緩存。如果滿足以下兩個條件之一,則需要更新緩存:

  • 數據為空且未鎖定
  • 數據鎖定已過期

更新緩存時,Lua腳本會執行以下邏輯

無論key是否被鎖定,強制標識鎖過期,并刪除鎖持有者。鎖的過期時間默認為1.5s

private staticfinal String INVALID_SH =
        "local key = KEYS[1]\n"
            + "local newUnlockTime = tonumber(ARGV[1])\n"
            + "redis.call('HDEL', key, '" + OWNER + "')\n"
            + "local value = redis.call('HGET', key, '" + VALUE + "')\n"
            + "redis.call('HSET', key, '" + LOCK_INFO + "', 'locked')\n"
            + "if not value or value == '' then\n"
            + "    return {true, '" + EMPTY_VALUE_SUCCESS + "'}\n"
            + "end\n"
            + "if newUnlockTime > 0 then\n"
            + "    redis.call('HSET', key, '" + UNLOCK_TIME + "', newUnlockTime)\n"
            + "end\n"
            + "return {'', '" + SUCCESS + "'}";

2.4.1 數據一致性

1)讀讀并發的數據一致性

圖片圖片

假設當前緩存沒有數據或數據鎖已過期

  • 線程A查詢緩存,發現沒有數據或數據鎖已過期,會對當前key加鎖,標識鎖持有者為當前線程,鎖時長為1s。
  • 線程B查詢緩存:發現key已經被鎖定且鎖未過期,會sleep 100ms再次嘗試查詢
  • 線程A查詢數據庫數據后更新緩存,并釋放鎖
  • 線程B查詢緩存,返回緩存數據。

執行第2步時線程B若發現key被鎖定但鎖已過期,會將鎖持有者更新為線程B,查詢數據庫并更新緩存、釋放鎖,這樣可以保證鎖不會被同一線程一直占有。線程A更新緩存時發現鎖持有者不是自己,不會更新緩存。 讀讀并發場景下,通過分布式鎖確保只有一個線程查詢數據庫并更新緩存,保證了數據一致性。

2)讀寫并發的數據一致性

圖片圖片

  • 線程A查詢緩存,發現沒有數據,于是對當前key加鎖,標識鎖持有者為當前線程,鎖時長為1s。
  • 在線程A查詢數據庫的過程中,線程B更新了數據庫,同時更新緩存。此時更新線程不會關注鎖信息,會強制刪除鎖持有者,并標識key被鎖定。
  • 線程A更新緩存,發現鎖持有者不是當前線程(此時鎖持有者為空),不會更新緩存
  • 線程C查詢緩存,發現沒有數據,于是對當前key加鎖,標識鎖持有者為當前線程,鎖時長為1s。
  • 線程C查詢數據庫成功,更新緩存并釋放鎖
  • 讀寫并發場景下,框架保證了更新線程將key標記刪除后,進行中的查詢線程不會再將舊值寫入緩存,保證了數據一致性。

2.4.2 標記刪除:彈性過期時間

通常情況下為了防止在key過期或主動刪除的瞬間有大量請求擊穿緩存打到數據庫,我們會讓所有請求搶同一把分布式鎖。但是這樣做可能出現一個場景:搶到鎖的線程訪問數據庫時間較長,大量等待線程響應時間過慢,導致當前服務響應上游服務請求超時。

為此我在框架中增加了彈性過期機制:更新線程不會真正的刪除緩存,而是標記當前key為過期,過期時間默認1.5s。在這1.5s內,所有的查詢請求會返回舊值(即1.5s內可能出現數據庫緩存不一致),同時嘗試異步查庫并更新緩存(異步操作需要搶分布式鎖),此時可能出現兩種情況:

  • 1.5s內有一個線程查庫成功并更新了緩存,那么就完成了一次平滑更新,實現數據的最終一致,后續查詢線程會從緩存拿到新值。
  • 1.5s內沒有線程更新成功,1.5s后鎖過期,所有查詢線程會變成“讀讀并發”場景,保證了1.5s后的數據一致性。

如果業務場景無法容忍最終一致,必須保證實時一致,可以設置彈性過期時間為0s,此時如果緩存被更新,會立刻變成“讀讀并發”場景,保證實時一致性。

2.5 Lua腳本預加載:解決開銷問題

2.5.1 設計帶來的性能開銷

在數據一致性保證機制中,為了保證Redis操作的原子性,使用提交Lua腳本的方式操作Redis緩存。這種設計雖然保證了功能的正確性,但也帶來了明顯的性能開銷:

內存開銷:緩存鎖信息的存儲為了支持分布式鎖機制,Redis中存儲的不僅僅是數據本身,還需要額外的鎖相關信息。這種設計確實增加了Redis的內存開銷:每個key最多增加50 bytes(非更新和緩存過期場景不會增加額外的內存開銷),但相比數據不一致帶來的業務風險,這個內存開銷是可以接受的。

網絡IO開銷:Lua腳本傳輸更大的性能開銷來自于網絡IO。以獲取緩存值的操作為例,每次都需要傳輸完整的Lua腳本,腳本大小約為500 bytes。在高并發場景下,這個網絡開銷會迅速累積,成為性能瓶頸。

在解決網絡IO開銷問題之前,我們需要簡單了解一下,常用的Redis執行Lua腳本命令方式有以下兩種:

特性\命令方式

EVAL

EVALSHA

腳本傳輸

每次傳輸完整腳本

僅傳輸腳本對應SHA1哈希值

性能

較低(網絡開銷大)

較高(適合頻繁調用)

適用場景

一次性腳本或調試

生產環境高頻調用的腳本

本文采用EVALSHA命令執行Lua腳本,相比于EVAL方式,從每次傳輸500字節的腳本內容,減少到只需要傳輸40字節的哈希值,網絡開銷減少了約92%。

2.5.2 Lua腳本預加載

圖片圖片

在服務啟動時觸發Lua腳本的預加載機制。具體流程如下:

  • 啟動檢測:服務啟動時,LuaShPublisher組件會自動初始化
  • 腳本收集:組件會收集所有預定義的Lua腳本,包括獲取緩存、設置緩存、解鎖緩存、失效緩存等操作
  • 腳本上傳:對每個集群,通過scriptLoad命令上傳所有Lua腳本
  • 哈希值記錄:將Redis返回的SHA1哈希值記錄到本地緩存中

考慮到網絡不穩定或Redis服務器臨時不可用的情況,還需要考慮重試機制:

  • 異常捕獲:當腳本上傳失敗時,系統會捕獲異常信息
  • 重試判斷:系統會判斷是否需要重試,避免無限重試導致服務啟動失敗
  • 延遲重試:采用指數退避策略,每次重試的間隔逐漸增加
  • 成功退出:當所有腳本都成功上傳后,重試任務會自動退出

3、核心特性

3.1 分布式鎖保證一致性

  • 原子性操作:Lua腳本保證Redis緩存操作的原子性
  • 最終一致性:通過Lua腳本實現分布式鎖,保證數據一致性
  • 性能優化:服務啟動時會自動將需要執行的Lua腳本同步到Redis服務器,減少網絡傳輸開銷

3.2 多級緩存架構

  • 高可用性:實時監控集群健康狀態,Redis宕機時自動切換到本地緩存
  • 智能升級:集群恢復后自動升級

3.3 彈性過期機制

  • 標記刪除:通過標記機制實現軟刪除
  • 彈性過期:支持動態調整過期時間,默認為1.5s,框架保證最終一致性。當用戶設置不一致時間為0s時,框架保證實時一致性。
  • 一致性保證:解決緩存與數據庫不一致問題

3.4 注解驅動的簡化設計

  • 開發效率提升:一行注解替代緩存代碼
  • 降低學習成本:開發者只需了解注解參數
  • 統一規范:所有緩存操作遵循相同模式

4、總結

Easy-cache通過統一的設計解決了開發人員在緩存使用中的痛點,實現了以下核心價值:

  • 重復代碼問題:通過注解驅動,讓開發者告別重復的緩存處理代碼
  • 緩存穿透問題:通過空值緩存和智能防護機制,有效防止惡意請求穿透到數據庫
  • 緩存擊穿問題:通過分布式鎖機制和標記刪除方式,防止熱點數據失效導致的數據庫崩潰
  • 數據不一致問題:通過Redis-Hash結構+Lua腳本實現分布式鎖,確保緩存與數據庫的數據同步
  • Redis宕機問題:通過自動降級和探活機制,保證服務的高可用性

以上就是Easy-cache的核心內容,希望能為分布式系統的緩存使用提供一些參考和思路。

關于作者

伊鑫海,轉轉履約中臺研發工程師,主要負責售后業務

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

2025-09-15 01:55:00

緩存代碼Easy-Cache開發

2013-06-14 08:47:45

2011-05-10 17:14:49

開發人員產品經理

2023-10-30 07:56:46

Spring緩存

2022-09-12 15:51:38

JavaScrip開發編程語言

2023-06-15 15:48:36

Grafana開發前端

2012-07-10 01:43:36

程序員開發人員測試人員

2021-06-29 19:26:29

緩存Spring CachSpring

2012-07-20 10:46:44

Web

2023-11-10 14:58:03

2023-02-08 08:32:58

2020-12-01 00:02:16

開發人員用戶體驗高層管理人員

2010-08-09 16:09:25

2012-05-30 15:15:42

ibmdw

2023-03-15 07:12:53

企業開發人員提供商

2020-03-05 09:09:18

緩存原因方案

2024-07-12 08:48:50

2021-01-31 10:51:37

緩存lock數據

2009-11-23 20:07:51

ibmdw開發

2021-02-19 09:33:01

kubernetesJAVA服務
點贊
收藏

51CTO技術棧公眾號

激情五月婷婷综合网| 日韩精品在线观看av| 色噜噜狠狠一区二区| 成人福利小视频| 欧美日韩高清| 色综合久久中文综合久久牛| 亚洲97在线观看| 97人人模人人爽人人澡| h视频在线播放| 在线亚洲a色| 午夜a成v人精品| 99在线高清视频在线播放| 国产精品无码专区| 欧美xxxx做受欧美88bbw| 精品一区二区在线视频| 最新亚洲国产精品| www.日日操| 精品电影在线| 日韩综合一区二区| 亚洲全黄一级网站| 97xxxxx| 色视频免费在线观看| 亚洲人www| 亚洲国产成人精品女人久久久| 国产日韩第一页| 亚洲日本韩国在线| 国产精品巨作av| 亚洲福利国产精品| 激情视频一区二区| 久久人妻免费视频| 少妇一区二区视频| 欧美性大战久久久久久久| 亚洲国产一区二区三区在线播| 久久精品视频1| 少妇一区二区视频| 亚洲国产精品高清久久久| 日韩av自拍偷拍| 欧美人与禽性xxxxx杂性| 国产精品视频一二| 国产精品久久一区| 国产麻豆a毛片| 国产aa精品| 亚洲午夜在线电影| 美女亚洲精品| 99re热视频| 天天操夜夜操国产精品| 日韩欧美一二三四区| 青春草在线视频免费观看| 亚洲第一视频在线| 欧美亚洲一区二区三区| 尤物九九久久国产精品的分类| 男女男精品视频站| 污污的视频在线观看| 99re这里只有精品视频首页| 欧美性视频精品| 99国产精品无码| 99精品国产一区二区三区2021 | 五月婷婷综合在线观看| 黑人巨大精品| 亚洲三级电影网站| 久久草视频在线看| 中文字幕在线观看精品| 女人天堂亚洲aⅴ在线观看| 日韩高清免费观看| 亚洲激情在线看| 日本三级一区| 中文字幕一区二区在线播放 | 一级黄色大片免费| 99精品全国免费观看视频软件| 尤物九九久久国产精品的特点| 亚洲午夜精品久久久久久高潮| 9999精品| 在线亚洲免费视频| 欧美在线观看黄| 1769视频在线播放免费观看| av一区二区不卡| 91精品视频免费| 久久久久久无码午夜精品直播| 欧美激情五月| 日韩色av导航| 亚洲国产果冻传媒av在线观看| 美女视频免费精品| 欧美一级理论性理论a| 黄色片在线免费| 性欧美18~19sex高清播放| 亚洲精品成人在线| 亚洲欧洲一区二区| av免费在线观| 国产精品毛片a∨一区二区三区| 伊人av成人| 国产区视频在线| 91年精品国产| 精品午夜一区二区三区| 九色视频在线播放| |精品福利一区二区三区| 日本一区二区在线视频观看| 男人天堂一区二区| 国产精品888| 成人免费福利视频| 在线观看视频中文字幕| 国产激情一区二区三区| 久久99精品国产一区二区三区| youjizz在线播放| 亚洲一区二区影院| 美女喷白浆视频| 成人午夜大片| 日韩视频中文字幕| 在线观看亚洲天堂| 国产一区二三区好的| 国产日韩精品在线播放| 中文字幕在线网站| 国产成人av电影在线观看| 亚洲最大av网站| 99久久久久久久| 国产风韵犹存在线视精品| 欧美精品一区二区三区在线看午夜 | 久久99久久99精品免费看小说| 亚洲天堂成人| 欧美激情videos| 玖玖爱免费视频| 国产精品porn| 国产精品色午夜在线观看| 日韩在线视频观看免费| 亚洲日本在线看| 日本激情视频在线| 中国av一区| 欧美在线视频免费播放| 国产精品一区二区三区四| 激情伊人五月天久久综合| 日韩精品一区二区三区四区五区| 成人在线免费公开观看视频| 亚洲国产人成综合网站| 免费看的av网站| 国产精品成人a在线观看| 国产精品www网站| 国产影视一区二区| 国产农村妇女精品| 五月天色婷婷综合| 国产成人77亚洲精品www| 91精品国产一区二区三区蜜臀 | 一区二区三区| 日韩在线视频观看正片免费网站| 7799精品视频天天看| 91在线视频网址| 怡红院av亚洲一区二区三区h| 中文在线аv在线| 亚洲电影免费观看高清完整版在线 | 午夜精品美女自拍福到在线| 亚洲第一成年人网站| 亚洲主播在线播放| 国产成人久久婷婷精品流白浆| 粉嫩久久久久久久极品| 欧美精品久久久久久久久久| 欧美一区免费看| 91美女在线视频| 欧美日韩在线不卡视频| 国产成人精品免费视| 久久综合伊人77777| 国产 欧美 日韩 在线| 六月丁香综合在线视频| 国产精品久久久久久免费观看 | 免费99精品国产自在在线| 日韩精品在线免费看| 蜜桃av一区二区| 国产精品日韩欧美一区二区| 欧美巨大xxxx做受沙滩| 精品粉嫩超白一线天av| 五月天精品在线| 亚洲国产精品第一区二区三区| 国产二区一区| 嫩草香蕉在线91一二三区| 欧美日韩精品二区| 老司机av网站| 欧美电影一区| 欧美亚洲另类制服自拍| 国产在线观看免费| 欧美日本一道本| 亚洲理论片在线观看| 极品日韩av| 91久久精品国产91性色| 亚洲性图自拍| 亚洲精品在线91| 日本一级淫片色费放| 久久影院电视剧免费观看| www污在线观看| 蜜臀91精品国产高清在线观看| 国产欧美日韩专区发布| 自由的xxxx在线视频| 亚洲精品国偷自产在线99热 | 亚洲在线久久| 国产精品一区专区欧美日韩| 嫩草精品影院| 色综合久久综合网| 久久久久久视频| 六月丁香综合在线视频| 中国丰满熟妇xxxx性| 波多野结衣一区| 国产精品成人免费电影| www在线观看播放免费视频日本| 欧美三级中文字| 免费看黄色三级| 国产成人免费视频网站| 亚洲狼人综合干| 黄色欧美成人| 一区精品在线| 九九热精品视频在线观看| 亚洲一区二区免费| 日韩毛片免费观看| 亚洲激情成人网| 91尤物国产福利在线观看| 精品日韩中文字幕| 2021亚洲天堂| 国产精品综合网| 99久久99久久精品| 精品久久久久久久| 精品国产乱码一区二区三区四区 | 9.1成人看片免费版| 国产一二三精品| 日本xxxx黄色| 久久久久久久高潮| 午夜一区二区三区| 国产亚洲精品精品国产亚洲综合| 中文字幕日韩在线观看| 中文字幕 国产| 欧美日韩国产激情| 亚洲久久久久久久| 成人动漫一区二区| 欧美日韩亚洲第一| 亚洲人人精品| 国产欧美日韩小视频| 亚洲高清影视| 999在线免费观看视频| 国产精品麻豆成人av电影艾秋| 欧洲亚洲免费视频| 深夜av在线| 7777精品视频| 成年人视频免费在线观看| 亚洲精品videossex少妇| 亚洲国产成人精品一区二区三区| 7777精品伊人久久久大香线蕉超级流畅 | 久久国产精品免费视频| 男人天堂久久久| 日韩午夜在线视频| 欧美a免费在线| 久久久国产精彩视频美女艺术照福利| 亚洲AV无码精品自拍| 欧美一区二区三区在线观看| 国产精品伦一区二区三区| 亚洲国产精品一区二区www| 麻豆一区产品精品蜜桃的特点| 亚洲欧洲综合另类| 欧美三级 欧美一级| 伊人夜夜躁av伊人久久| 少妇久久久久久被弄高潮| 亚洲精品视频在线观看免费 | 中文欧美字幕免费| 美国美女黄色片| 国产精品久久毛片a| 亚洲一二三在线观看| 亚洲精品国产一区二区精华液| 麻豆一区产品精品蜜桃的特点| 午夜精品久久一牛影视| 精品在线播放视频| 欧美伊人久久久久久久久影院| 亚洲资源在线播放| 日韩一级片在线观看| 免费观看的毛片| 亚洲视频免费一区| 超碰在线免费公开| 欧美激情a∨在线视频播放| 欧美13videosex性极品| 国产精品久久久久久久久久久久 | 久久精品主播| 手机av在线网| 国产v综合v亚洲欧| 插吧插吧综合网| 国产精品蜜臀av| 久热这里只有精品在线| 国产精品久久毛片av大全日韩| 动漫性做爰视频| 国产精品久久久久aaaa樱花 | 欧美福利网址| 欧美 日韩 激情| 麻豆一区二区三| 在线播放第一页| 国产乱一区二区| 无码精品一区二区三区在线播放| 久久久久久亚洲综合| 这里只有精品在线观看视频| 国产精品一区一区三区| 亚洲黄色免费在线观看| 国产精品网站导航| 国产黄色片视频| 欧美日韩一级片在线观看| 亚洲黄色小说网| 日本毛片在线免费观看| av资源网在线播放| 日韩在线播放一区| a'aaa级片在线观看| 国产成人亚洲精品| 中文字幕一区二区三区最新| 影视一区二区三区| 国产69精品久久久久9| 超碰在线caoporen| 日产日韩在线亚洲欧美| 高清在线视频不卡| 欧美激情18p| 精品69视频一区二区三区| 国产一区视频观看| 欧美wwwwww| 国产综合18久久久久久| 日韩伦理视频| 综合久久国产| 午夜影院日韩| 性猛交╳xxx乱大交| 欧美韩国日本综合| 久久久国产精品成人免费| 日韩欧美色综合网站| 在线免费观看黄色av| 欧美一区二区三区四区在线| 亚洲精品一区二区三区中文字幕| 99久久久精品免费观看国产| 精品一区二区三区的国产在线观看| 精品国产av无码一区二区三区| 久久97超碰国产精品超碰| 国产精品jizz| 精品女同一区二区三区在线播放| 一起草在线视频| 国产精品人妖ts系列视频| 国产成人在线免费观看视频| 91精品婷婷国产综合久久性色| www在线免费观看| 日韩av电影在线网| 香蕉久久夜色精品国产使用方法| 日韩精品av一区二区三区| 亚洲国产激情| 中文字幕一区二区人妻电影丶| 亚洲美女精品一区| 国产精品久久久久久久一区二区| 中文字幕日韩精品在线| 精品视频在线一区二区在线| 国产精品永久免费在线| 精品国产一区二区三区四区| 成年人网站大全| 麻豆精品国产91久久久久久| 天天躁夜夜躁狠狠是什么心态| 色中色一区二区| 好男人免费精品视频| 国产成人av在线播放| 国产影视精品一区二区三区| 成年人在线观看视频免费| 国产女人aaa级久久久级| 在线免费看av的网站| 日韩一二三在线视频播| 亚洲福利影视| 精品欧美一区二区精品久久| 国产一区二区三区的电影 | 黄色aaa视频| 亚洲欧美成人一区二区三区| 97视频免费在线| 欧美国产在线电影| 日韩大尺度在线观看| 日本老熟妇毛茸茸| 国产精品黄色在线观看| 国产欧美久久久| 久久久久久久久久久av| 首页亚洲中字| 国产福利在线免费| 一区二区理论电影在线观看| 四虎精品一区二区三区| 久久精视频免费在线久久完整在线看| 996久久国产精品线观看| 欧洲精品在线播放| 狠狠色狠狠色综合| 欧美极品aaaaabbbbb| 精品国产髙清在线看国产毛片| 蜜桃麻豆影像在线观看| 亚洲春色综合另类校园电影| 国产九色精品成人porny| 草久视频在线观看| 色噜噜狠狠狠综合曰曰曰88av| 麻豆国产一区| 中文字幕日韩精品一区二区| 国产成人午夜精品5599| 国产欧美一区二区三区在线看蜜臂| 中文字幕在线看视频国产欧美在线看完整| 99综合久久| 亚洲午夜无码av毛片久久| 国产精品国产a级| 囯产精品久久久久久| 久久99精品久久久久久噜噜| 欧美视频免费看| 成人午夜免费在线| 成人免费毛片app| 久久免费黄色网址| 国产香蕉一区二区三区在线视频 | 97视频精彩视频在线观看| 99在线视频首页| 美女在线视频一区| 奇米影视第四色777|