99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

緩存穿透、擊穿、雪崩一次講透:高并發(fā)緩存防御實(shí)戰(zhàn)指南

緩存穿透、擊穿、雪崩一次講透:高并發(fā)緩存防御實(shí)戰(zhàn)指南 線上業(yè)務(wù)半夜報警數(shù)據(jù)庫連接數(shù)打滿慢查詢堆積成山緩存Redis里明明還有數(shù)據(jù)上游接口卻一片超時。翻了一圈監(jiān)控發(fā)現(xiàn)罪魁禍?zhǔn)撞皇谴abug也不是流量突增而是一個本該在緩存層就被攔下來的無效請求直接穿透到了數(shù)據(jù)庫。這種事故我在不同團(tuán)隊(duì)遇到過至少三次每一次的根因都繞不開三個詞緩存穿透、緩存擊穿、緩存雪崩。這三個問題聽起來像兄弟實(shí)際上成因、表現(xiàn)、殺傷力完全不同對應(yīng)的防御方案也各有講究。這篇內(nèi)容我打算把這三個“高并發(fā)緩存殺手”一次性講透從原理層面拆解它們?yōu)槭裁磿寯?shù)據(jù)庫崩潰再到布隆過濾器、互斥鎖、多級緩存這些主流防御手段的落地細(xì)節(jié)。文章會貼大量實(shí)操代碼、參數(shù)配置和我在生產(chǎn)環(huán)境里實(shí)測過的數(shù)據(jù)適合正在維護(hù)高并發(fā)服務(wù)的后端開發(fā)、架構(gòu)師以及準(zhǔn)備系統(tǒng)學(xué)習(xí)緩存知識的技術(shù)人??赐曛竽阒辽倌芨闱宄患庐?dāng)緩存失效的那一瞬間你的系統(tǒng)到底在經(jīng)歷什么以及怎么把它扛住。1. 三種緩存失效場景別再把它們混為一談很多文章把穿透、擊穿、雪崩并列來講但實(shí)際工作中我發(fā)現(xiàn)很多人對這三個概念停留在“都會導(dǎo)致數(shù)據(jù)庫壓力暴增”的模糊印象。其實(shí)它們的觸發(fā)條件、影響范圍、修復(fù)手段差別非常大搞混了會直接導(dǎo)致方案選型錯誤。我先用最直白的方式把它們區(qū)分開。1.1 緩存穿透查詢了一個根本不存在的數(shù)據(jù)穿透的本質(zhì)是請求的key在緩存中不存在在數(shù)據(jù)庫中也不存在于是每次請求都直接打到數(shù)據(jù)庫。攻擊者如果構(gòu)造一批隨機(jī)不存在的ID比如負(fù)數(shù)ID、超長字符串、隨機(jī)UUID就能讓數(shù)據(jù)庫承受大量無意義的查詢。舉個例子。一個電商訂單查詢接口訂單號是19位數(shù)字。正常情況下用戶查的都是真實(shí)訂單第一次查詢沒命中緩存回源數(shù)據(jù)庫然后回填緩存。但如果有惡意請求連續(xù)傳入12938192831928391283這種并不存在的訂單號緩存永遠(yuǎn)不可能命中數(shù)據(jù)庫每次都要去做一次全表掃描級別的查詢連接池很快就會被耗盡。最陰險的地方在于這種流量很難通過常規(guī)的限流手段識別因?yàn)樗鼈兊膮?shù)看起來完全合法只是在業(yè)務(wù)語義上不存在。而且穿透請求往往帶有隨機(jī)性緩存中不可能被提前寫入這些key所以緩存層約等于透明。1.2 緩存擊穿熱點(diǎn)Key在過期瞬間被高并發(fā)打穿擊穿針對的是某一個熱點(diǎn)Key。比如一個秒殺商品的詳情頁平時QPS可能只有幾百活動開始后瞬間飆升到幾萬。這個商品信息的緩存設(shè)置了30分鐘過期緩存服務(wù)在過期時間到達(dá)的那一刻如果正好有一大批請求同時來查這個Key從Redis中取不到數(shù)據(jù)它們會一起回源數(shù)據(jù)庫。這里的關(guān)鍵詞是“同時”。如果只有一兩個請求回源數(shù)據(jù)庫毫無壓力但如果同一時刻有幾千個請求同時回源數(shù)據(jù)庫瞬間就被打垮。擊穿和穿透的最大區(qū)別是擊穿的數(shù)據(jù)在數(shù)據(jù)庫中是真實(shí)存在的只是緩存恰好過期穿透的數(shù)據(jù)在數(shù)據(jù)庫中壓根不存在永遠(yuǎn)無法回填緩存。對業(yè)務(wù)的影響也完全不同擊穿恢復(fù)后緩存會被重新回填系統(tǒng)能自動恢復(fù)穿透則會持續(xù)打數(shù)據(jù)庫直到流量停止或采取了額外防護(hù)。1.3 緩存雪崩大量Key同時過期導(dǎo)致緩存層整體失效雪崩的覆蓋面比擊穿大得多。如果一批緩存Key設(shè)置的過期時間相同比如都是整點(diǎn)過期、都是30分鐘過期到了某個時間點(diǎn)這大批Key會一起失效。此時請求全部回源數(shù)據(jù)庫數(shù)據(jù)庫壓力瞬間達(dá)到峰值很容易觸發(fā)連接池耗盡、慢查詢堆積、主從延遲等一系列連鎖反應(yīng)。我見過一個典型事故運(yùn)營人員把一批活動頁面的緩存過期時間統(tǒng)一設(shè)置為600秒結(jié)果每天上午10點(diǎn)整這批頁面同時刷新數(shù)據(jù)庫在10點(diǎn)整那一分鐘內(nèi)的QPS比平時翻了20倍直接宕機(jī)。更麻煩的是Redis中大量Key失效后如果緩存服務(wù)本身也扛不住回源請求比如Redis線程被阻塞故障會從數(shù)據(jù)庫向上蔓延形成級聯(lián)效應(yīng)。還有一種雪崩場景不是Key過期導(dǎo)致的而是Redis實(shí)例宕機(jī)。Redis掛了之后所有請求直接繞過緩存打到數(shù)據(jù)庫這種物理級別的雪崩往往比Key過期更致命因?yàn)榫彺鎸用嬉呀?jīng)完全沒有保護(hù)能力。1.4 三兄弟對比一張表看懂差異維度緩存穿透緩存擊穿緩存雪崩觸發(fā)場景查詢不存在的Key單個熱點(diǎn)Key過期大量Key同時過期 / Redis宕機(jī)數(shù)據(jù)真實(shí)性數(shù)據(jù)庫不存在數(shù)據(jù)庫存在數(shù)據(jù)庫存在影響范圍單個無效請求持續(xù)不斷單個Key高并發(fā)瞬間多個Key全局性壓力恢復(fù)方式無需回填需要攔截回填緩存自動恢復(fù)回填大量緩存耗時較長核心防御布隆過濾器、空值緩存互斥鎖、邏輯過期過期時間隨機(jī)、多級緩存、高可用分清這三種場景之后下面我逐個講對應(yīng)的防御方案每一步都會給出可以直接抄作業(yè)的實(shí)現(xiàn)。2. 布隆過濾器攔截穿透請求的第一道閘門布隆過濾器的核心價值在于用極低的內(nèi)存成本快速判斷一個Key“一定不存在”。它允許誤判存在但不允許誤判不存在。也就是說如果布隆過濾器說“這個Key不存在”那它一定不存在可以安心攔截如果它說“可能存在”則需要放行到后續(xù)邏輯去驗(yàn)證。2.1 布隆過濾器的原理和數(shù)學(xué)直覺布隆過濾器的底層是一個位數(shù)組bit數(shù)組 一組哈希函數(shù)。插入一個Key時用k個哈希函數(shù)分別計算得到k個位置把這些位置上的bit全部置為1查詢一個Key時同樣計算k個位置如果所有位置都是1則認(rèn)為“可能存在”只要有一個位置是0就認(rèn)為“一定不存在”。為什么說“可能存在”因?yàn)楣E鲎病2煌琄ey可能映射到相同的位置導(dǎo)致某個Key雖然沒有插入過但它的所有哈希位置都已經(jīng)被其他Key置為1這就產(chǎn)生了誤判。誤判率可以估算經(jīng)典公式是誤判率 p ≈ (1 - e^(-kn/m))^k其中n是預(yù)計插入的元素數(shù)量m是位數(shù)組長度k是哈希函數(shù)個數(shù)。實(shí)際操作中可以先預(yù)估n然后根據(jù)可接受的誤判率p反推m和k。常用的簡化公式是m -n * ln(p) / (ln2)^2 k m/n * ln2舉個例子。假設(shè)預(yù)計插入100萬個訂單號希望誤判率控制在1%代入公式m約等于958萬位換算成字節(jié)約1.2MBk約等于7。也就是說用1.2MB內(nèi)存和一億分之一的誤判概率就能擋住幾乎所有不存在的Key查詢。這個性價比非常高。2.2 布隆過濾器在生產(chǎn)環(huán)境中的三種落地姿勢第一Guava的BloomFilter。適合單機(jī)應(yīng)用數(shù)據(jù)在本地內(nèi)存中加載后只能單機(jī)判斷。對于部署在多個實(shí)例上的服務(wù)每個實(shí)例都需要各自構(gòu)建一份適合Key集合相對固定、實(shí)例數(shù)不多、數(shù)據(jù)量在百萬級的場景。BloomFilterString filter BloomFilter.create( Funnels.stringFunnel(StandardCharsets.UTF_8), 1_000_000, // 預(yù)計元素數(shù) 0.01); // 期望誤判率 filter.put(order_123456); boolean mightContain filter.mightContain(order_987654);第二Redis的布隆過濾器插件。Redis 4.0之后可以通過模塊方式安裝bf命令常見的是RedisBloom模塊。這種方式的好處是過濾器數(shù)據(jù)集中在Redis中所有應(yīng)用實(shí)例共享同一個判斷結(jié)果不必每個實(shí)例各自構(gòu)建。缺點(diǎn)是Redis需要額外加載模塊有一定的運(yùn)維成本。BF.RESERVE order_filter 0.01 1000000 BF.ADD order_filter order_123456 BF.EXISTS order_filter order_987654第三基于Redis字符串位圖手動實(shí)現(xiàn)。用SETBIT和GETBIT命令來模擬位數(shù)組操作代碼可控性強(qiáng)不依賴額外模塊適合已有Redis集群不想引入新組件的情況。不過哈希函數(shù)需要自己在代碼里實(shí)現(xiàn)處理起來稍微繁瑣一些。2.3 布隆過濾器誤判的后果和處理方法誤判意味著某些不存在的Key會被放行到數(shù)據(jù)庫。雖然誤判率可以控制在1%甚至更低但1%的無效回源請求在千萬級QPS下依然很可觀。所以要組合使用布隆過濾器做第一層攔截攔截掉99%的穿透流量剩下1%的漏網(wǎng)之魚再用空值緩存方案兜底——把查詢結(jié)果為null的Key也緩存起來設(shè)置一個較短的過期時間比如60秒。這樣即使布隆過濾器誤判放行第二次相同請求也會被空值緩存擋住。我在實(shí)際項(xiàng)目中推薦的組合邏輯是請求進(jìn)來 - 布隆過濾器判斷不存在 - 直接返回空結(jié)果 請求進(jìn)來 - 布隆過濾器判斷可能存在 - 查Redis緩存 - 命中直接返回 請求進(jìn)來 - 布隆過濾器判斷可能存在 - 查Redis緩存未命中 - 查數(shù)據(jù)庫 - 回填緩存含空值緩存注意布隆過濾器無法刪除元素。如果想刪除舊數(shù)據(jù)只能用“定期重建過濾器”的方式或者選擇支持刪除的變體比如布谷鳥過濾器但這個變體的實(shí)現(xiàn)復(fù)雜度會明顯上升。3. 互斥鎖與邏輯過期擊穿防御的兩條實(shí)戰(zhàn)路線擊穿的核心矛盾是熱點(diǎn)Key過期后一瞬間有大量并發(fā)請求同時回源。要解決這個問題思路很簡單——讓這些請求不要同時回源而是只放一個請求去數(shù)據(jù)庫重建緩存其余請求要么等要么拿舊值。3.1 互斥鎖方案的實(shí)現(xiàn)細(xì)節(jié)互斥鎖的思路是當(dāng)緩存未命中時不是立刻查數(shù)據(jù)庫而是先嘗試獲取一把分布式鎖。拿到鎖的請求去查數(shù)據(jù)庫并回填緩存其他請求在鎖上等待然后重新讀取緩存。這里的關(guān)鍵問題是用哪種分布式鎖等待多久鎖何時釋放我推薦直接用Redis的SET NX PX命令實(shí)現(xiàn)避免引入額外的ZooKeeper或Etcd依賴畢竟Redis已經(jīng)在鏈路里了。// 嘗試獲取鎖設(shè)置5秒超時 String token UUID.randomUUID().toString(); Boolean locked redisTemplate.opsForValue() .setIfAbsent(lock:hot_key, token, Duration.ofSeconds(5)); if (Boolean.TRUE.equals(locked)) { try { // 二次檢查緩存防止在等鎖期間緩存已經(jīng)被其他線程重建 Object cached redisTemplate.opsForValue().get(key); if (cached ! null) { return cached; } // 查數(shù)據(jù)庫 Object data queryFromDatabase(key); redisTemplate.opsForValue().set(key, data, Duration.ofSeconds(600)); return data; } finally { // 釋放鎖時需要校驗(yàn)持有者身份防止誤刪其他線程的鎖 String lockValue redisTemplate.opsForValue().get(lock:hot_key); if (token.equals(lockValue)) { redisTemplate.delete(lock:hot_key); } } } else { // 沒拿到鎖休眠一小段時間后重試 Thread.sleep(50); return getFromCacheOrDb(key); // 遞歸重試注意控制重試次數(shù) }這段代碼有幾個細(xì)節(jié)值得展開。關(guān)于鎖的持有者校驗(yàn)釋放鎖時如果直接delete可能把其他線程剛獲取的新鎖誤刪。比如線程A的鎖5秒超時自動釋放線程B獲取了新鎖此時線程A的finally塊執(zhí)行delete就會把B的鎖刪掉導(dǎo)致B的互斥失效。所以釋放前必須比對value值我這里用UUID做標(biāo)識只有持有者自己才能刪除。關(guān)于等待和重試沒拿到鎖就短睡眠然后遞歸重試但這個遞歸需要加次數(shù)限制。我見過一個線上問題熱點(diǎn)Key的數(shù)據(jù)庫查詢特別慢超過鎖的5秒超時第一個線程的鎖已經(jīng)自動失效了第二個線程拿到鎖又開始查庫結(jié)果多個線程實(shí)際上都在查庫互斥完全失效。所以鎖超時時間必須大于“建緩存”的耗時通常建議壓測后確定一般取數(shù)據(jù)庫查詢耗時的3-5倍。關(guān)于JVM內(nèi)鎖的補(bǔ)充如果所有請求都落在同一個Java進(jìn)程內(nèi)用JDK內(nèi)置的synchronized或ReentrantLock做本地鎖就夠了性能遠(yuǎn)高于分布式鎖。只有當(dāng)服務(wù)是集群部署時才需要跨進(jìn)程的分布式鎖。我常用的優(yōu)化方案是“本地鎖分布式鎖”兩級結(jié)合先獲取本地鎖同一個實(shí)例內(nèi)的并發(fā)先被本地鎖擋掉只有不同實(shí)例之間才需要競爭分布式鎖。這種方式能大幅減少Redis鎖請求的壓力。3.2 邏輯過期方案用舊數(shù)據(jù)扛過真空期互斥鎖的痛點(diǎn)是如果熱點(diǎn)Key過期瞬間有大量請求在等待響應(yīng)時間會變長重試也會占用線程資源。邏輯過期方案則完全不同——它不存在“緩存過期”的概念。具體做法是緩存數(shù)據(jù)中額外存儲一個邏輯過期時間字段但Redis中的Key本身不過期或者設(shè)置一個很長的物理過期時間。請求讀取到數(shù)據(jù)后先判斷邏輯過期時間是否已到。如果沒過期直接返回如果已過期則嘗試獲取互斥鎖獲取成功后開啟一個異步線程去數(shù)據(jù)庫更新緩存當(dāng)前請求則直接返回“過期的舊數(shù)據(jù)”。public Object getProductInfo(String key) { // 從緩存讀取Redis中的Key永不過期 String json redisTemplate.opsForValue().get(key); if (json null) { return null; // 理論上這種情況非常少Key被手動清理了 } CacheEntry entry JSON.parseObject(json, CacheEntry.class); if (entry.getExpireTime() System.currentTimeMillis()) { return entry.getData(); // 邏輯時間未過期直接返回 } // 邏輯過期嘗試獲取鎖異步刷新 if (tryGetLock(key)) { try { // 異步更新緩存 executorService.submit(() - { Object data queryFromDatabase(key); String newJson JSON.toJSONString(new CacheEntry(data, System.currentTimeMillis() 600_000)); redisTemplate.opsForValue().set(key, newJson); }); } finally { releaseLock(key); } } // 未拿到鎖的請求直接返回舊數(shù)據(jù) return entry.getData(); }這個方案的核心優(yōu)勢是請求永遠(yuǎn)都不會因?yàn)榫彺孢^期而等待響應(yīng)時間穩(wěn)定。核心缺點(diǎn)是在緩存異步更新的窗口期內(nèi)用戶看到的是舊數(shù)據(jù)。對于實(shí)時性要求不高的場景比如商品詳情、文章內(nèi)容、配置信息這個缺點(diǎn)完全可以接受。但如果數(shù)據(jù)是余額、庫存這種強(qiáng)一致要求的數(shù)據(jù)就不能用邏輯過期。這里有一個生產(chǎn)環(huán)境常見的坑異步線程池如果處理不過來緩存永遠(yuǎn)不更新舊數(shù)據(jù)會一直返回。所以要給這個線程池加上合理的隊(duì)列大小、拒絕策略和監(jiān)控報警。我一般用獨(dú)立線程池核心線程數(shù)和最大線程數(shù)根據(jù)數(shù)據(jù)庫能承受的并發(fā)來定同時監(jiān)控隊(duì)列深度超過閾值就報警。4. 雪崩防御多級緩存與過期時間的藝術(shù)雪崩的殺傷力在于覆蓋面大動輒幾十上百個Key同時失效。防御思路也分兩條一是讓失效時間分散二是讓數(shù)據(jù)庫上面不止緩存一道防線。4.1 過期時間的隨機(jī)化與業(yè)務(wù)錯峰最基礎(chǔ)的方案是把固定的過期時間改成“基礎(chǔ)過期時間隨機(jī)偏移量”。比如原來統(tǒng)一3600秒現(xiàn)在改成“3600 隨機(jī)數(shù)60~600秒”。這個策略在代碼里改動最小卻能顯著降低同時失效的概率。基礎(chǔ)時間 隨機(jī)偏移 實(shí)際過期時間 3600 random(60, 600) 3660~4200秒要注意的一點(diǎn)是不要所有Key都用一個隨機(jī)算法生成完全隨機(jī)的過期時間那樣會導(dǎo)致緩存命中率下降。更好的做法是“按業(yè)務(wù)分組打散”。比如活動頁面的Key集中在300~600秒隨機(jī)商品詳情的Key集中在3600~7200秒隨機(jī)這樣同類Key的過期時間大致在一個接近的區(qū)間但具體時間點(diǎn)錯開既保持了緩存效果又避免了集中失效。另一個工程上的細(xì)節(jié)很多團(tuán)隊(duì)用同一個RedisTemplate的set(key, value, time)方法設(shè)置緩存如果key的命名規(guī)則里包含業(yè)務(wù)前綴可以通過前綴來配置不同的隨機(jī)范圍。我習(xí)慣在緩存工具類中維護(hù)一個過期時間策略表用Map維護(hù)前綴和隨機(jī)范圍新增緩存場景時只需要加一行配置而不需要到處改業(yè)務(wù)代碼。4.2 多級緩存把壓力分散到更靠近用戶的地方當(dāng)Redis整實(shí)例宕機(jī)時隨機(jī)化過期時間完全失效。這時真正能扛住的是多級緩存架構(gòu)。常見的分級是本地緩存Caffeine - Redis緩存 - 數(shù)據(jù)庫。本地緩存放在應(yīng)用進(jìn)程內(nèi)讀寫納秒級不依賴網(wǎng)絡(luò)。即使Redis掛了只要本地緩存還有數(shù)據(jù)請求就不會打到數(shù)據(jù)庫。這里最常用的組件是Caffeine它支持基于時間的過期策略和基于大小的淘汰策略。CacheString, Object localCache Caffeine.newBuilder() .maximumSize(10_000) // 最多緩存1萬個Key .expireAfterWrite(Duration.ofSeconds(30)) // 寫入30秒后過期 .build();讀流程變成讀取本地緩存 - 未命中則讀取Redis - 未命中則查數(shù)據(jù)庫 - 回填兩級緩存這里強(qiáng)調(diào)一個關(guān)鍵點(diǎn)本地緩存的過期時間必須比Redis短。否則本地緩存長期持有舊數(shù)據(jù)Redis中的數(shù)據(jù)更新后本地緩存感知不到就會出現(xiàn)數(shù)據(jù)不一致。常見的設(shè)置為本地緩存30秒Redis緩存10-15分鐘。這樣Redis更新后最多30秒內(nèi)本地緩存會過期重新從Redis拉取新數(shù)據(jù)。多級緩存最大的槽點(diǎn)是數(shù)據(jù)一致性。如果后臺更新了數(shù)據(jù)庫需要主動失效Redis中的舊緩存但本地緩存分布在每個應(yīng)用實(shí)例中無法統(tǒng)一失效。我的實(shí)踐經(jīng)驗(yàn)是對一致性要求不高的讀取場景接受本地緩存30秒的短時不一致對一致性要求較高的場景不要加本地緩存直接走Redis。4.3 Redis高可用的兜底還有一個層面需要重視Redis本身的可用性。Redis主從切換、哨兵、集群模式都是基礎(chǔ)設(shè)施層面的雪崩防御。但要注意的是即便Redis是高可用的主從切換的那幾秒內(nèi)緩存寫入依然可能失敗。所以在業(yè)務(wù)代碼中寫緩存必須捕獲異常并降級不能因?yàn)镽edis報錯而影響主流程。try { redisTemplate.opsForValue().set(key, value, timeout); } catch (Exception e) { // Redis異常時降級本次不寫緩存下次請求繼續(xù)嘗試 log.warn(write redis failed, e); }同理讀緩存也要做降級。如果Redis讀超時不要拋異常讓請求失敗而是直接返回null并進(jìn)入數(shù)據(jù)庫查詢流程。雖然這會加重數(shù)據(jù)庫壓力但至少業(yè)務(wù)是可用的配合熔斷機(jī)制可以控制住影響范圍。5. 一套完整的防御體系高并發(fā)讀接口的落地框架前面分別講了穿透、擊穿、雪崩的防御手段但真實(shí)的生產(chǎn)環(huán)境要的是把這些手段組合成一個統(tǒng)一的讀接口框架而不是在每一個業(yè)務(wù)代碼里東拼西湊。我構(gòu)建過一套比較通用的“四級防御”讀接口在這里給出完整的設(shè)計。5.1 四級防御鏈路拆解整個讀請求的流程可以分為四層第一層本地緩存。Caffeine承載過期時間30秒。這一層的目的是扛住極端QPS下對Redis的壓力。如果本地緩存命中整體響應(yīng)時間在毫秒級。第二層布隆過濾器。判斷Key是否可能存在。如果不存在直接返回空結(jié)果或緩存中的空標(biāo)記杜絕穿透流量進(jìn)入數(shù)據(jù)庫。布隆過濾器可以放在RedisRedisBloom模塊中也可以放在本地Guava根據(jù)數(shù)據(jù)量權(quán)衡。第三層Redis緩存。承載主要的緩存命中流量過期時間根據(jù)業(yè)務(wù)配置采用基礎(chǔ)時間隨機(jī)偏移。這一層是系統(tǒng)的主力緩存層。第四層數(shù)據(jù)庫。只有前面三層全部未命中才會到達(dá)這一層。到達(dá)這一層時還要用互斥鎖控制并發(fā)回源的數(shù)量保證同時只有少數(shù)請求在查庫。5.2 統(tǒng)一的讀接口模板代碼下面是我常用的一個泛型化模板的骨架業(yè)務(wù)方只需要傳入Key生成函數(shù)和數(shù)據(jù)庫查詢函數(shù)public T T queryWithDefense(String key, FunctionString, T dbQuery, ClassT clazz) { // 本地緩存1Caffeine Object local localCache.getIfPresent(key); if (local ! null) { return (T) local; } // 防線2布隆過濾器不存在直接返回 if (!bloomFilter.mightContain(key)) { return null; } // 防線3Redis緩存 String json redisTemplate.opsForValue().get(key); if (json ! null) { T data JSON.parseObject(json, clazz); localCache.put(key, data); // 回填本地緩存 return data; } // 防線4互斥鎖控制回源 T data loadFromDbWithLock(key, dbQuery, clazz); if (data ! null) { localCache.put(key, data); } return data; }要注意的是這個模板把布隆過濾器的判斷放在Redis緩存之前。這么做的原因是布隆過濾器的查詢時間比較快而且如果它判斷Key不存在就沒有必要再去Redis執(zhí)行一次G一邊GET。另一個細(xì)節(jié)如果業(yè)務(wù)允許一定程度的延遲這里的“防線2”可以在本地緩存中實(shí)現(xiàn)但如果布隆過濾器數(shù)據(jù)量較大本地內(nèi)存撐不住就必須放在Redis中。5.3 實(shí)測效果與調(diào)優(yōu)參數(shù)參考我把這套框架用在一個商品詳情接口上壓測結(jié)果供大家參考接口原生QPS約800數(shù)據(jù)庫單機(jī)可承受約2000 QPS的查詢。加四級防御后Jmeter壓測線程數(shù)從100調(diào)到1000數(shù)據(jù)庫實(shí)際接收的查詢QPS穩(wěn)定在30左右接口P99響應(yīng)時間從40ms降到了12ms。主要參數(shù)配置是這樣的參數(shù)值說明本地緩存過期時間30秒必須小于Redis緩存過期時間本地緩存最大條目10000防止內(nèi)存溢出需要根據(jù)Heap大小調(diào)整Redis緩存過期時間600秒隨機(jī)120秒兼顧命中率和防雪崩布隆過濾器預(yù)計元素量實(shí)際數(shù)據(jù)量×1.1留出10%余量布隆過濾器誤判率0.01取值越低內(nèi)存越大鎖超時時間5秒大于數(shù)據(jù)庫慢查詢耗時異步刷新線程池核心4最大8隊(duì)列1000根據(jù)數(shù)據(jù)庫能力配置這個配置不是固定不變的僅供參考。核心原則是數(shù)據(jù)庫回源量必須壓到數(shù)據(jù)庫能承受的范圍以內(nèi)同時保證緩存命中率在95%以上。6. 常見問題與排查技巧實(shí)錄在實(shí)際維護(hù)這套體系的過程中我踩過不少坑也總結(jié)了一些排查路徑。單獨(dú)拎出來說一遍可能比上面那些代碼更有價值。6.1 布隆過濾器誤判偏高怎么辦誤判率升高先別急著調(diào)大位數(shù)組。排查一下是不是數(shù)據(jù)量增長超出預(yù)期導(dǎo)致初始化的n值過小。比如你初始化的預(yù)計元素量是100萬實(shí)際寫進(jìn)了500萬誤判率會急劇升高。解決辦法是監(jiān)控過濾器中的BF.INFORedisBloom或者布隆過濾器當(dāng)前元素數(shù)的估算值超過預(yù)計量的80%就觸發(fā)自動重建或者提前把預(yù)計量設(shè)大一點(diǎn)。還有一個容易忽略的問題業(yè)務(wù)代碼中對Key的序列化方式不統(tǒng)一。有的地方用String有的地方用DigestUtils.md5DigestAsHex做了哈希如果Key的格式不統(tǒng)一布隆過濾器中的數(shù)據(jù)和查詢的數(shù)據(jù)無法對應(yīng)會產(chǎn)生大量“假誤判”。排查時可以先打日志確認(rèn)同一個Key在寫入和查詢時經(jīng)過的字符串是否完全一致。6.2 互斥鎖失效緩存被重復(fù)重建鎖失效最典型的場景是持鎖線程執(zhí)行時間超過了鎖的自動過期時間。鎖被Redis自動刪除后其他線程又拿到新鎖造成多個線程同時查庫。排查時看日志里“acquire lock”和“release lock”的間隔如果經(jīng)常接近鎖超時時間說明建緩存過程太慢需要優(yōu)化數(shù)據(jù)庫查詢或者把鎖的超時時間拉長。還有一個更隱蔽的問題鎖的key設(shè)置了過期時間但釋放鎖時用delete命令如果恰好在這個時刻鎖已經(jīng)過期刪除操作就會把別人剛創(chuàng)建的新鎖刪掉。前面代碼里面已經(jīng)提到解決方案就是用UUID作為鎖的value并校驗(yàn)后再刪。這個細(xì)節(jié)能擋住很多人都會踩的坑。6.3 多級緩存數(shù)據(jù)不一致如何緩解多級緩存一定會面臨不一致的問題。Redis更新了本地緩存可能還是舊數(shù)據(jù)數(shù)據(jù)庫更新了Redis緩存也還是舊數(shù)據(jù)。我的建議是不要追求強(qiáng)一致而是把一個可接受的不一致時間明確寫進(jìn)文檔。對于主動更新的場景可以在更新數(shù)據(jù)庫后先刪Redis緩存再通過延遲雙刪1秒后再次刪除來清理可能被讀請求重新寫入的舊緩存。本地緩存這邊如果框架支持消息通知可以通過Redis的Pub/Sub廣播一個“清本地緩存”的消息如果沒條件就接受它最多30秒的過期時間。重要提示多級緩存的一致性考驗(yàn)的不是技術(shù)而是業(yè)務(wù)容忍度。設(shè)計架構(gòu)前先和業(yè)務(wù)方確認(rèn)數(shù)據(jù)更新后最多可以接受多少秒的延遲把這個數(shù)字寫清楚比你用再高級的組件都重要。6.4 緩存回填風(fēng)暴的預(yù)防當(dāng)大量緩存同時失效時回填過程本身也會造成數(shù)據(jù)庫壓力。除了隨機(jī)過期時間以外還有個技巧是“回填節(jié)流”——不是所有請求都去數(shù)據(jù)庫回填而是只讓一部分請求去查詢其他請求直接返回默認(rèn)值或空數(shù)據(jù)。比如用互斥鎖保證同一時刻只有一個請求回填或者用一個“回填信號量”控制全局的最大回填并發(fā)數(shù)。我在高并發(fā)場景下還用過一種“漸進(jìn)式回填”緩存失效時返回的舊數(shù)據(jù)里帶一個refresh_after字段表示“這個數(shù)據(jù)最多再服務(wù)多久”。到達(dá)這個時間后只允許一個異步任務(wù)去刷新而同步請求永遠(yuǎn)拿舊數(shù)據(jù)。這是邏輯過期方案的變種非常適用于數(shù)據(jù)更新不頻繁但讀取量極大的場景。7. 這些方案的邊界和取舍布隆過濾器、互斥鎖、多級緩存這些方案都不是銀彈它們有各自的邊界。我在實(shí)際項(xiàng)目中反復(fù)調(diào)整過很多次逐漸摸索出一些取舍的經(jīng)驗(yàn)。布隆過濾器最大的邊界是它只能用于“判斷存在性”不適合作為唯一的穿透防御。如果業(yè)務(wù)中合法請求都是“近期創(chuàng)建的數(shù)據(jù)”那么布隆過濾器很快就會被塞滿重建成本很高。這種情況下空值緩存也許更直接。兩種方案可以組合空值緩存放Redis布隆過濾器放本地前者兜底后者攔截絕大多數(shù)惡意流量。互斥鎖的邊界在于它本質(zhì)上是在“用性能換一致性”——請求需要等待必然增加延遲。如果熱點(diǎn)Key的過期頻率很高比如每分鐘都過期那么鎖競爭本身就會成為新的瓶頸。這時候邏輯過期方案更合適因?yàn)樗鼛缀鯖]有鎖等待。多級緩存的邊界在于“數(shù)據(jù)一致性”和“內(nèi)存成本”。本地緩存的引入意味著每個應(yīng)用實(shí)例要額外占用內(nèi)存如果緩存條目太大會導(dǎo)致JVM GC壓力上升。選擇哪些數(shù)據(jù)進(jìn)本地緩存、哪些只走Redis需要按數(shù)據(jù)熱度來分。熱度高的、讀取量大的、一致性要求低的數(shù)據(jù)才適合放本地。我個人的原則是先解決主要矛盾。如果問題是穿透流量大優(yōu)先上布隆過濾器如果問題是熱點(diǎn)數(shù)據(jù)偶爾過期導(dǎo)致抖動優(yōu)先上互斥鎖如果問題是周期性雪崩優(yōu)先隨機(jī)化過期時間。不要一上來就上一個全量的“緩存防御全家桶”復(fù)雜度會翻倍排查問題的難度也會翻倍。8. 一次真實(shí)事故的復(fù)盤從報警到修復(fù)的完整思路最后分享一次我親身經(jīng)歷的事故把前面這些理論串起來看效果會更好。某次大促預(yù)熱期凌晨兩點(diǎn)監(jiān)控突然報警數(shù)據(jù)庫CPU打滿慢查詢暴漲。查看Redis的hit ratio從平時的98%掉到了76%。第一反應(yīng)是查RedisKey的過期情況發(fā)現(xiàn)大量活動相關(guān)的Key同時過期——運(yùn)營同學(xué)在后臺定時任務(wù)里批量刷新活動數(shù)據(jù)刷新代碼統(tǒng)一設(shè)置的過期時間是300秒而定時任務(wù)每5分鐘執(zhí)行一次相當(dāng)于每300秒就有幾百個Key同時被重建。解決思路分了三步第一步止血。臨時把定時任務(wù)的刷新邏輯改掉刷新完成后不刪舊緩存而是先更新數(shù)據(jù)庫再通過異步任務(wù)在后臺批量重寫緩存讓緩存過期時間錯開。這一步花了5分鐘數(shù)據(jù)庫壓力立即回落。第二步治理。把活動緩存代碼統(tǒng)一改成隨機(jī)過期時間并且加了一個開關(guān)如果某個批次Key的數(shù)量超過閾值就隨機(jī)挑選其中一半先刷新剩下的延遲30秒再刷新避免瞬時并發(fā)回填。第三步預(yù)防穿透。大促當(dāng)天存在大量用戶反復(fù)刷新不存在的活動頁面布隆過濾器提前添加了所有活動ID的集合無效請求在過濾器就直接被攔掉。事故復(fù)盤后我意識到一個核心問題很多緩存故障不是技術(shù)方案不行而是業(yè)務(wù)側(cè)的定時任務(wù)、批量操作沒有考慮緩存失效的“共振效應(yīng)”。技術(shù)防御是必要的但更重要的是在業(yè)務(wù)流程中加入緩存意識——比如批量更新數(shù)據(jù)的任務(wù)一定要把“集中過期”作為一項(xiàng)風(fēng)險來評估。這套防御體系我的建議是你不用全上根據(jù)自己的業(yè)務(wù)體量從布隆過濾器或互斥鎖選一個開始逐步疊加。先把最痛的那一個問題解決了再考慮引入更多組件。緩存這層看上去簡單但真正要扛住高并發(fā)那些“緩存失效瞬間”的處理才見功底。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91精品无码| 五月噜噜噜色综合| 202丰满熟女妇大| 996日日爱| YJLZZJLZZ亚洲乱熟无码| 久久九色| 激情 婷婷| 久久亚洲网| 99在线一区| 午夜色婷婷| 五月天综合视频| 久久这里只有精品07| 九九热在线观看视频网站| 色婷婷另类| 激情深爱五月婷婷| 五月丁香色色色| 亚洲色五月| 五月综合六月婷婷| 爱草视频在线观看| 色播五月婷婷综合| 99re99热| 色六月丁香婷婷啪啪啪| 久久婷婷婷| 九九操屄| www.色五月| 色情婷婷| 亭亭五月色男人| 深爱婷婷丁香五月激情| 色五月婷婷DVD| 激情婷婷五月天| 丁香五月天婷婷大香蕉| 天天干天天日蜜臀av| www.色99| 色婷婷成人做爰A片免费看网站 | 深爱女色婷婷丁香五月亚洲图区| 久久婷色| 视频这里只有精品| wuyuedingxiang99| 亭亭丁香久久五月| 热99精品视频观看| 丁香狠狠| 久久涩视频| 79精品视频在线观看,| 五月婷婷丁香瑟瑟视频| 色偷偷五月天| 婷婷色色丁香五月天| 夜夜夜夜夜骑撸| 日日操,夜夜爽| 日日操夜夜爽天天天| 综合激情五月天| www.91.com黄| 热99这里只是精品| 丁香五月婷婷在线| 99re熱| 国产九九一区二区三区| 97艹| 成人视屏在线观看| 色婷婷五月天亚洲| 五月丁香好婷婷A片网| 五月丁香综合啪啪| 人人爽人人爽人人爽人人爽| 丁香五月中文字幕久色| 亚洲中文乱字字幕在线永久| 大香蕉久久久| www.色婷婷.com| 99热首页| 万月丁香狠狠爱| 91精品国产综合久久久不卡电影| 丁香九月色| 丁香色色五月| 九九综合网色全集 | 五月五丁香婷婷| 色婷婷国色天香综合| 色欲婷婷夜夜| av在线色五月丁香婷区久| 色色网站免费观看| 婷婷五月天天天| 亚洲激情综合| 99性爱视频| 思思热在线| 99热99精品| 91视频精品99| 久久久99精品免费观看| 99色免费在线观看| 日本色色色| 婷婷综合欧美| 九九性视频| 亚洲第一综合| 桃色五月天| 日韩AV中文在线观看| 婷婷五月花.97| 国产亚洲成人综合| 久久性爱视频| 天天日天天爱天天噪| 久久精品人妻| 日韩精品AV一区二区三区| 97日韩无套内| 丁香五月首页| 这里只有精品免费视频在线观看| 免费婷婷| 9|人妻人人操| 精品思思久久| 久久只有18视频| 色噜噜五月天| 五月美女婷婷风骚| 色九九综合| 日日干日日s| 色婷婷九月| 七七色色综合| 伊人网色婷婷五月天| 天堂网色婷婷| 天天爱天天做综合| 深夜男女福利刺激影院一区| 另类国产欧美视频| 99er国产| 亚洲五月婷| 色狠狠色噜噜AV天堂五区| 天天综合色99| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 婷婷无五月无码视频| 亚洲国产成人AV在线| 久久色五月| 91精品婷婷国产综合久久| 狠狠做五月| 天天干,噜噜色,狠狠色| www.99视频| 久99久视频| 91fuliwang| 亚洲九区| 狠狠色97| 麻豆123区| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 五月综合视频| 68热超碰在线| 五月婷婷色色| 久久总和99| 4438亚洲欧美| 可以免费看av网站| 久久久久久久97| 婷婷五月综合社区在线| 狠色狠色狠色狠色狠色网| 无码髙清| 五月天婷婷激情在线色图| 狠狠狠狠狠狠狠狠草| 亚洲成人AV在线播放| 沈娜娜av| aaa日韩| 五月婷婷中文字幕| 日韩三及成人AV片| 五月激情小说网| av国产精品| 六月丁香色色| AV在线中文| 狠狠精品干练久久久无码中文字幕 | 久热九九| 婷婷五月天丁香久久| 日本五月婷婷久久久六月丁香| 五月天国产婷婷精品视频在线| 国产67194| 久久久久亚洲AV成人无码电影| 伊人AV五月婷| 综合激情四射一theav| 天天做天天干天天综合网| 国产激情视频在线观看| 激情五月天色色| 99福利导航| 91猫咪国产在线播放| 国产寻花在线| 九九爱激情| 婷婷丁香五月久久| 日本黄色三级片内射| 婷婷国产日本欧美| 91久久日日| 婷婷第六色| 日本一级| 五月网激情| 色久九| 亚洲av午夜精品一区二区| 丁香六月视频免费观看| 色玖玖网| 色婷婷9| 日本九九视频| 91啪啪视频| 婷婷六月天天| 99热这里| 五月天激情子轮| 欧美va在线| 91色久| 婷婷伊人网| 91ncom.色| www99热| 丁香婷婷人妻| 99燥99日| 成功精品影院| 婷婷色五月丁香六月欧美啪| 九九热精品在线| 婷婷丁香久久五月综合| 91综合网| 99热爱爱干干日| 激情婷婷九月| 青青草五月天| SS丁香五月婷婷| 97人人妻人人艹| 天天色五月| 97色婷婷| 综合XX网| 六月色日韩| 全部老头和老太XXXXX| 青青草蜜臀| 97超级碰碰碰久久久| 日日干日日| 久久综合婷| 久久婷婷综合基地| 五月婷婷中文网| 丁香花社区av| 丁香婷婷五月天在线视频| 大香蕉人人人| 亚洲精品V天堂中文字幕 | 天天操夜夜啊| 综合婷| 五月婷婷综合久久| 九九综合精品| 婷婷亚洲在线| 狠狠色丁香| 亚洲尤物在线| 99熟女视频| www99热| 天天 日综合| 91久女| 美国十月色婷婷在线观看| 五月婷婷色影院| 国产成人精品一区二三区熟女在线| 日日夜夜天天爽| 婷婷五月天丁香社区| 丁香六月啪| 深爱激情丁香五月| 99在线观看这里都是精品| 伊人在线另类| 久99热| 99久久激情视频| 婷婷五月天成人网| 在线视频激情网站| 激情五月黄色| 久久九九国产精品怡红院| 亚洲激情电影五月天色婷婷丁香一起草 | 日本韩国视频在线观看社区免费的9| 国产在这里只有精品| 五月天色色激情综合| 久久久91精品| 99精品国产在热久久| 日韩aaaaa| 一起草AV| 丁香六月综合激情| 女力报到正好爱上你| 99在线观看| 天天干天天av天天射 | 五月婷婷久久开心网| 9久久精品视频| 日本乱子人伦在线视频| 天天久久狠狠色综合| 欧美日本一区二区三区| 婷婷色啪| 狠狠爱夜夜| 亚洲精品一区无码A片| 99热碰碰| 五月激情丁香| 狠狠干激情五月| 五月丁香婷婷中文| 成人一区在线观看| 欧美五月婷婷综合| 五月日韩中文字幕| 国产精品美女久久久久AV超清| 大香蕉伊人爱在线| 激情五月综合| www色五月| 亚洲精品五月| 天天爱天天日| 久月婷婷| 色综合丁香| 六月婷婷AV| 无码人妻少妇色欲AV一区二区 | 狠狠色噜噜狠狠| 丁香五月天操B| 激情四射五月天| 狠狠人妻色综合| 日韩AAAAAAAAAAA片| 99热在线观看免费| 天天综合永久| 天天看夜夜看| 婷婷丁香综合成人| 色播五月丁香| 激情五月色播五月| 国产精品VA在线| 这里只有精品免费观看网占| 五月婷婷综合色拍| 第一区久久网站| 99热 在线观看| 97啪啪| 色综合区| 99re思思热在线视频| 久久久久久欧美精品se一二三四| 亚洲狠狠婷婷综合久久久| 深夜男女福利刺激影院一区完整| 五月丁香九九| 九月激情综合| 九九精品9| 性欧美大战久久久久久久83| 六月激情网| 婷婷丁香六月| 中文字幕丰满孑伦无码专区| 香蕉久久国产AV一区二区| 啪啪91| 色婷婷五月综合| 激情小说五月天| www超碰| 中文字幕AV在线播放| 婷婷成人AV| 91九色欧美| 丁香五月亚洲婷婷| 五月天激情小说欧美激情| 开心激情综合| 久久久18| 青青草视频免费观看| 少妇伦子伦精品无吗| 淫五月停停| 色综合99色| 欧美精品A片一区在线观看| 任你操精品免费| 日本99在线视频| 99无码超碰| 五月婷婷综合丁香视频| 婷婷久久五月| 天天日天天久久青青| 九久久九精品视频| 五月丁香六月成人| 亚洲视频色色| 夜夜撸夜夜骑| 婷婷五月丁香久久| www,99热在线观看| 亚洲成人一区| 精品皮股午夜AV| 99视频在线精品免费观看2| 丁香五月六月综合激情| 激情丁香五月天| 天天干天天插| 人妻五月天激情开心网| 开心五月六月婷婷| 五月激情网站| 性爱视频99| 婷婷五月天天| 欧美人人操| 丁香久久AV| 久久久久久xxxxx| 天天干夜夜欢| 综合大香蕉| 超碰高清在线| 9精品久久999| www久久久久久久久久久| 伊人9草在线观看| 婷婷丁香五月天婷婷| 久久这里只有精品无码| 五月婷婷天堂| 亚洲无码猫咪| 狠狠狠狠免费| 在线另类视频| 日日夜夜天天| 成年人夜夜喷水| 日韩欧美四五区| 激情综合色婷婷啪啪六月天| 三级片AAA久久久AAA久久久AAA| 91在线视频综合| 色天天狠狠干| 日本啪啪网| 2025神马午夜福利| 色综合天堂| 99在线观看亚洲| www.99热这里只有精品| 久久一级AV| 综合久久综合久久| 思思热视频| 成熟妇人A片免费看网站| 国产精品色婷婷久久久精品| 亚洲婷婷激情五月天| 99热免| 97婷婷五月激情六月丁香伊人| 激情小说五月丁香在线视频观看视频| 五月婷婷九九热| 婷婷五月天久久| 免费99色| 五月天六月婷| 人妻AV中文系列| 超碰A V在线| 天天爱天天做天天舔| 九九亚洲| 99超碰在线免费| 丁香五月天婷婷中文| 精品人妻伦一二三区久久| 国产真实乱对白精彩| 激情五月天色色| 5月婷婷6月六月丁香| 日韩av一区二区在线/日产精品久久久 | 五月婷婷六月丁香| 丁香六月天之亚州热女| 日本三级成人秘书精品片| 婷婷99中文字幕| 九九热这里只有精品一| av免费在线看不卡无毒| 国产精品久久久99视频| 97色色色色色| 九九热99re8热免费观看| 亚洲免费av在线| 9999热精品| 五月综合激情图片| 国产肥白大熟妇BBBB视频| 9.1综合网| 91婷婷在线| yellow视频在线观看91| 99热只有| 婷婷激情性爱| 26uuu国产| 在线播放成人网站| 久久怡红院| 9+1视频网址| www夜夜操| 五月六月播婷婷| 亚洲精品视频在线| 这里只有精品免费在线视频| 99激情在线| 色五月综合在线| 97中文在线| 国产亚洲99久久| 99综合视频| 欧美日韩五月婷婷| 色哟哟精品| 五月婷婷久久久| 9久精品| 一级片sese片.COM| 青青久在线视频免费观看| 亚洲熟妇AV综合网五月丁香伊人 | 丁香网五月天| 五月天婷婷激情综合| 国产4P视频精品五区| 噜噜狠狠色| 日韩五月婷婷| 激情五月丁香五月| 婷婷激情五月综合基地| 丁香色色五月| 天天干天天干天天干天天干天天干| 秋霞丝袜啪啪啪| 亚洲啪啪网| 亚洲成人免费在线| 成人无码精品1区2区3区免费看| 久久免费精品小视频| 丁香成人五月天| 玖玖在线视频福利| www.金莲av| AAAA网站| 99re在线视频精品,这里只有精品18,| 99精品偷自拍| 天天爱天天操| 欧洲亚洲免费视频区| 婷婷丁香五月综合网| 精品人妻一区二区三区四区不卡在| 日本熟女啪啪| 九九热精品| 大香蕉久操| 色色国产| 丁香五月天色婷婷| 伊九九三级区| yjzz亚洲国产| 婷婷五月成人| 夜丁香五月婷婷| 91精品丝袜久久久久久久久粉嫩| 丁香五月在线观看| 99这里只有精品视频| 99在线观看| 五月天丁香婷婷久久九| 亚洲超碰在线| 毛片色五月| 婷婷色五月丁香六月欧美啪| 久久99草五月婷婷| 天天操综合网| 日日撸夜夜操| 激情五月婷婷啪啪| 9久精品视频| 狠狠插.com| ww久久| 五月中旬婷婷丁香六| 色婷婷五月天成人网| 天天日天天插| 超碰九九热| 五六月丁香激情视频| 欧美性猛交99久久久99| 五月综合视频| 丁香五月先锋| 久播影院免费观看电视剧大全最新网| 五月天婷婷色五月天| 高清一区二区三区日本久| 丁香 婷婷 亚洲 熟女| 91五月天| 色久影院| 欧亚中文A V| 五月天成人综合| 99热在线这里| 丁香涩涩五月天| 青青草网武则天| CHINESE熟女老女人HD视频| 亚洲无码yw| 天天免费日日夜夜夜夜| 老司机午夜福利视频金瓶梅| 99九九在线观看免费| 99精品视频播放| www.久久久久| 五月激情站| 1区2区视频| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 婷婷久久五月天| 九九中文字幕九| 在线免费视频caop| 麻豆AV一区二区三区| 亚洲成人免费电影| 大香蕉久久久| 成人在线视频一区| 五月丁香综合激情| 五月丁香六月综合激情无码软件亮点| www.丁香黄色五月天人与| 色色色国产| 无码AV大香线蕉伊人| 欧美槡BBBB槡BBB少妇| 天天干,夜夜爽| 欧美色五月天| 久久精品亚洲一级牲爱综合| 天天操天天日天天操| 亚洲狠狠婷婷综合久久久| 久久五月天色婷婷| 婷婷五月色综合| 人妻五月天激情开心网| 久久久久亚洲AV综合| 久久99视频| 99热.com| 激情婷婷五月天| 色欧洲| 久草a片| 五月伊人婷婷| 亚洲综合狠狠艹| 91热爆在线| 亚洲欧美国产A片免费观看| www.com久久久久久久久久久久久久久久久| 九九色婷婷| 婷婷色中文字幕| 大香蕉综合| 亚洲成人高清在线| 色婷婷综合网| 成人精品视频99在线观看免费| 日日夜夜干| 极品人妻VIDEOSSS人妻| 婷婷五月,综合伊人| 天天日天天肏天天奸| 激情性爱五月天网页| 五月天久久婷| 《丁香激情综合久久伊人久久》影视在线观看 -高清预告手机免费播放 -三妹影院 | 色综合久久88色综合天天看| 国产SUV精品一区二区883| 成人在线观看国产| 我想看国产大学生口爆吞精的视频| 久久一伦| www.91九色| 亚洲综合字幕色色| 色婷婷五月基地在线| 五月天四色房丁香| 五月婷婷69| 91干在线| 婷婷综合久久| 天堂成人A片永久免费网站| 七月丁香五月婷婷在线| www.久9| 亚洲在线操| 激情五月天久久丁香| 天天网站天天爽| 日本成人噜噜| 9l视频自拍九色9l视频自拍九色9l社区 | 亚州性爱99| 色视频五月天| 99这里只有| 怡红院AV亚洲一区二区三区H| 99精品视频播放| 91日韩美女被插视频| 日韩黄色网络| 激情图片99| 婷婷激情五月天综合| 99热99在线| 99热这里只有精品2024| 天天日夜夜| 色色操| 激情超碰网| 成人国产网| 玖玖在线| www色中色综合| 永久免费视频| 色五月亚洲| 91精品婷婷国产综合| 五月香蕉综合| 丁香五月影院| 密着浓厚中出乚交尾GvG935| 色婷婷六月天| 亚洲激情精品| 欧美99热| 97热在线精品| 99热这里只有精品 搜| 99热综合网| 国产成人精品一区二三区熟女在线| AV片一区在线观看| 激情性爱网站| 日韩按摩二区| 色婷婷9| 97超碰,人人舔,人人操,人人摸| 色噜噜狠狠色综合网| 色婷婷六月精品| 婷婷五月天电影网| 六月色婷婷| 97碰成超视频免费视频| 欧洲高清免费久久| 91日本在线观看| www.综合久久| 99热成人在线| 天天狠天天叉| www.五月天色色色| 蜜桃五月天| 丁香五月激情综合| 亚洲愉拍99热成人精品| 久草xx性爱视频| 欧美在线97| 无码AV久久久久久久久| 五月婷色| 思思99久久| 婷婷丁香黄色| 狠狠草综合网| 国产亚洲精品久久久久久郑州| 色狠狠999综合| 五月久久亚洲| 无遮挡国产高潮视频免费观看| 91人人爽狠狠狠| 五月婷婷色五月| 婷婷干| 六月丁香五月亭亭| 超碰狠狠操| 九九Av| 天堂中文国产| 亚洲乱码日产精品BD| 亚洲国产网站| 欧美人妻一区二区| 天天色五月婷婷91久久久久久久| 五月天婷婷色小说| 成人精品视频99在线观看免费| 婷婷午夜| 日韩色色视频| 亚洲精品乱码久久久久久按摩观| 九九热九九| 欧美在线视频9| 五月婷婷影| 婷婷五月综合色小姐小说| 色色色色av777| 国产日产亚系列精品版优势| 激情综合激情五月| 国产成人网站在线观看| 激情五月伊人婷婷| 久久精品9| 久操激情| 婷婷五月天六月丁香| 五月丁香啪啪网| 五月婷中文字幕| 五月激情在线| 色七七九九| 色九网| 五月天色色激情综合| 婷婷月综合| 黑人熟妇一区二区三区| 六月婷婷综合激情| 六月婷婷激情图片| AAA久久| 婷婷激情四射| 日日夜夜噜噜爽爽| 99视频极品在线香蕉| 97色色色| 97人人干人人操| 婷婷综合五月| 丁香六月激情蜜桃| 久久大香免费| 日本久久精品| 婷婷五月丁香高清无码| 色图亚洲91| 直接看的AV| 五月天丁香成人社| 天天爽天天操| 五月天婷亚洲天综合网综合| 九九婷婷五月天| 丁香午夜天| 婷婷五月综合色拍| 欧美精品999| 婷婷五月天成人五月天| 另类激情中文| 五月天色婷婷av| 成人片在线播放| 亚洲综合新99视频| 一本到不卡高清DVD| 日韩99精品| 涩综合网| 操操操97| 婷婷综合97| 亚洲中文无码成人| wuyuedingxiang| 六月久久婷婷| 99热在线观看精品| 欧美成人猛片AAAAAAA| 欧洲激情精品婷婷| 伊人五月天久久| 99爱在线免费视频| 婷婷色丁香五月| 超碰成人电影| 久噜久噜| 国产激情综合五月久久| 好叼操在线观看| 激情综合无码| 日本婷婷综合精品| 激情伊人网| 婷色五月天| 天天激情欧美美女| 婷婷久久五月天亚洲欧美国产日韩在线观看| 丁香婷婷久久五月天| 99热这里都是精品| 五月香六月婷| 精a品a视a频| 久久一级免费黄色片| 婷婷综合五月天| 婷婷丁香五月天亚洲| 免费观看亚洲AV片| 激情婷婷五月综合| 久久丁香| 4399亚洲视频| 丁香五月六月婷婷怡红院| 丁香五月情| 婷婷在线日韩综合| www九九热| 丁香六月婷| 五月婷婷九月婷婷九月婷婷| 久久丁香| 热99精品视频| 婷婷五月日本| 福利视频在线播放| 五月丁香婷婷色| 色婷婷五月天视频网站| 亚洲 在线 性爱| 久久婷婷亚洲| 99人人操人人操人人精| 六月丁香AV| 青青草免费公开视频| 99热这里只有精品18| 激情com| 情色五月天网站| 免费观看日韩成人av| 亚洲精品大片| 午夜成人天堂久久无码日韩久久| 九九热视频首页/这里只有精品| 五月婷婷,六月婷婷| 亚洲中字AV电影在线网站| 久久五月天网| 天天舔天天操| 99视频在线观看欧| 精品婷婷五月天| 区区久久妻| 日本色色影院| 天天久久婷婷| 婷婷99狠| 校园春色亚洲色| 先锋影音av色五月天资源站| 99网| 亚洲精品久久久久久久久久吃药| 五月丁香天堂网| 91碰| 久草五月婷婷| 庭庭久久内射| 婷婷婷婷色| 日日舔夜夜操| 夜夜操激情| av人人操| 在线可以看的av网址| 思思热99在线| WWW.99热| 五月天激情无码专区| 五月丁香六月婷婷玖玖| 五月花综合网| 操笔无码| 天天色,天天操,天天射| 五月天婷婷在线啪啪视频| 蜜臀A∨在线水帘洞| site:xiongshengzz.com| 婷婷色中文字幕| 丁香六月婷婷久久综合| 大香蕉久久伊人婷婷五月丁香| 超碰99在线观看| 天天综合网、天天综合色| 9.1综合网| 就要去操亚洲成人精品五月天丁香婷婷| 一级黄色影片| 思思热思在线精品视频| 色婷婷成人影片| 婷婷丁香五月精品| 99热精品10| 影音先锋 91工厂| 五月色丁香激情| 亚洲综合激情五月| 久久久人妻| 亚洲精品亚洲人成人网| 免费黄色视频网址| 欧美性生交XXXXX无码小说| 欧美色一级色| 色婷婷另类| 色99在线看| 黑人无码一区| 中文字幕永久在线| www.色五月| 日韩操人| 综合色天天| 色婷婷色久综| 五月婷婷啪啪啪啪| 99热主页日本| 欧美槡BBBB槡BBB少妇| seuuu婷婷| 香蕉乱插| 天天日天天狠狠操| 日日夜夜噜噜爽爽| 国产精品色色| 六月丁香啪啪啪| 中文字幕有多少字| 98色丁香五月婷婷综合网| 六月丁香狠狠爱| 欧洲激情网站| 五月丁香婷在线| 亚洲色夜| 性一交一乱一交A片久| 亚洲综合碰| 婷婷的久久网站| 激情黄色五月天| 五月天久久综合婷婷| 久热91| 色色图五月天| 色婷婷丁香五月| 精品成人无码A片观看香草视频| 综合久久99| 久久激情网| 国产午夜精品一区二区三区四区| 影音先锋91资源站| 第二色AⅤ| 五月色婷婷综合| 婷婷五月影院| 欧美婷婷综合网| 亚洲色婷婷色| 婷婷五月色播| 被强行糟蹋的女人A片| 综合www色| 亚洲视频丁香网va| 久9久成人精品视频| 国产亚洲精品久久久久苍井松 | 性生活视频98791| 黄色五月婷婷| 久色精品| 99色五月| 日本欧美国产| 欧美三级大片AA在线看| www夜夜| 久久伊人五月天| 五月天色图| 日本3级片一区2区| 亚洲精品五月| 九九热视频精品| 97AV人人插人人操| 午夜丁香六月婷| 啪啪色区| 啊v视频在线观看| 婷婷色在线播放| 台湾佬天天日丁香婷婷五月天| 九九九九国产| 久久久九九视频精品18| 五月丁香婷婷综合激情基地| 第五色婷婷| 伊人久久大香线蕉精品| site:hcxsz888.com| 日日干夜夜干| 99精品丁香五月| 五月丁香在线观看99| 99国产性感视频| 亚洲精品一区中文字幕乱码| 五月天激情图片| 亚洲综合五月| 色啪久| 激情婷婷丁香色情五月天| 国产亚洲在线| 99狠狠| 婷婷射图五月天| 99综合免费视频| 亚洲婷婷基地| 99精品免费欧美小视频| 国产肥白大熟妇BBBB视频| 激情婷婷| 91超级碰| 啪啪婷婷五月天激情| 狠狠操狠狠操AV| 99九九热播在线免费视频| 亚洲综合色丁香五月天| 99精品偷自拍| 国产永久一二一起草| 伊人啪啪网| WWW.久久久久久久| 欧美人妻一区二区| 五月婷婷中文字幕| 国产 亚洲 在线| A片一曲| 9l视频自拍九色9l视频自拍九色9l社区| 丁香五月天社区| 丁香色影院| 五月丁香六月欧美综合网站| 久久99精品久| 婷婷五月天在线观看免费| 五月婷婷黄网站大全| 天天色官网| 97色五月丁香婷婷| 99这里只有精品在线| 青柠影视免费高清电视剧| 亚洲欧洲国产精品| 六月婷婷av| 久热欧美| 婷婷五月情| 色色网站免费在线视频| 婷婷五月天视频| 国产精品久久在线观看技巧| 五月丁香色色| 九九色热| 中文字幕成人| 狠狠干总合| 九九热123| 人妻精品久久久久久久| 亚洲AV在线免费看| 丁香六月婷婷综合麻豆| 婷婷99视频全集高清| 夜夜骑日日夜夜| 九九婷婷热| 五月丁香六月婷婷国产视频| 久婷婷五月天影院| 在线成人网站| 日韩一区二区在线播放| 99re热视频这里只精品| 五月天激情综合10p| 99碰碰碰| 婷婷五月天小说网| 色五月婷婷在线观看第一页舔| 先锋av性爱成人电影| 婷婷伊人綜合中文| 日韩成人AV在线播放| 青青热视频| 欧美成人猛片AAAAAAA| 婷婷深爱五月丁香网| www.激情五月天.con| 五月丁香色| 思思热99er在线视频| 九九色网专区| 久久久人妻| 快乐婷婷五月天| 99热 日韩| 久久99激情| 色A网| 色愛综合网| 丁香五月在线播放| 丁香网五月网| 免费播放片大片| 丁香六月啪| 久久久久人妻精选| 久久总和99| 国产成人精品一区二三区熟女在线 | 天堂久久婷婷| 五月天伊人网| 国产激情在线| 人人操插| 这里只有精品视频看看| 亚洲黄网在线| 97人人干| 婷婷六月丁香久| 综合网网欲色| 综合网色| 天天色视频| 91精品久久久久| 2050人人操免费工开爱 | 色婷综合| 婷婷五月色综合| 五月天开心成人网| 麻豆精品| 国产午夜精品一区二区三区嫩草| 亚洲最大激情无码| 婷婷六月爽| 五月婷婷综合社区| 国产成人精品一区二三区熟女在线| 婷婷五月天影视首页| 色婷婷国色天香综合| 日本97在线| 精品人妻久久久久久| 久久久久久久合一狠狠做深爱| 深夜男女福利刺激影院一区| 天堂成人A片永久免费网站| 99热这里只有精品在线| 婷婷色系婷色| 中文字幕,综合,91| 欧美天堂婷婷日韩| 五月激情偷拍| 色婷婷在线视频综合| 人人干女人| 五月婷婷激情综合| 久久国产色| 六月丁香深深爱| 四虎成人精品永久免费AV九九| 不卡成人免费| 天天综合精品| 欧美婷婷日本| 欧美综合激情丁香五月六月婷| 综合狠狠五月婷婷| 日韩欧美颜射| 亚洲9久久精品| 欧美性色A片免费免费观看的| 免费亚洲婷婷中文字幕| 夜夜躁爽日| Www.婷婷五月| 人人操Av| 五月色网| 在线资源av-超碰中文在线-成人AV| 狠狠婷婷综合| 国产全是老熟女太爽了| 久久精品性爱| 激情网婷婷婷| 另类图片 五月激情| 综合97五月| 婷婷午夜精品久久久| 久久综合五月| 婷婷丁香综合色AV| 久久中文网| 欧美日本韩国亚洲| 性做久久久久久久免费看| 天天色天天操天天射| 久久丁香五月婷| 伊人午夜综合色啪| 五月丁香天堂网婷婷| 五月天色播网| 全亚洲最大的婷婷五月天网站COM| www久久艹| 日韩日比视频| 99色日本| 97人人草| 97人人草| 久久九九综合| 六月丁香久久| 九久9精品| 久久婷婷丁香| 午夜激情综合| 无码人妻电影| 欧美99热| 色很很96| 婷婷久久五月天丁香| 九九九九九九九九九九九九九国产精品 | 丁香六月婷婷激情综合| 色婷婷亚洲婷婷| 日本69日人视频| 日本色色色| 日韩淑女人妻luan伦激情精品一区二| www色综合亚洲92| 97久久五月丁香婷婷| AAA久久久AAA久久久AAA| 五月丁香黄色| www.99婷婷| 六月99天天婷婷激情综合| 丁香五月香蕉在线| 这里只有精品99视频| 天天操夜夜夜拍拍拍| 天天日天天摸天天| 欧美在线看| 色婷婷五月天中文字幕| 丁香五月婷婷av| 色综合丁香| 天天舔天天插天天爱| www.99热最新视频8| 操逼福利视频| 久久99久久99精品免观看软件| 五月丁香做爱视频| 婷婷五亚洲| 在线只有精品| 超碰99热| 九九热精品在线| 色五月婷婷成人| 亚洲人成网站999久久久综合| www.精品久9| 99啪啪视频| 色婷婷五月天激情在线播放| 天天撸夜夜爽| 五月丁香婷婷AV| 亚洲成人影视在线观看| 极品人妻VIDEOSSS人妻| 亚洲一二三网| 九九色人| 色婷婷4| 婷婷六月情| 婷婷色五月激情强奸四射| 深爱开心激情| 男女激情久久| 激情四射婷婷| 五月婷婷co.m| 色情五月停停丁香| 色综合com| 激情综合色婷婷啪啪五月天| 97碰碰碰| 亚洲婷婷开心五月| 色五婷婷开心缴| 婷婷五月天成人网| 91人久| 琪琪色热色色| 婷婷五月综合欧美在线播放| 五月天涩涩| 99热婷婷| 日韩啪啪视品| 粉嫩av懂色av蜜臀av熟妇| 五月丁香大香蕉| 欧美色骚婷婷五月天| 色综合五月在线| 少妇丁香婷婷 | 久久这里有精品视频在线免费观看| 亚艹艹| 99操碰| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 五月天亚洲综合网| 久草热在线视频| 91伦| 婷婷,五月天,丁香,第一| 丁香花五月天| 婷婷五月天影院| AA久久| 亚洲乱码日产精品BD| 天堂在线9| 99re这里只有精品首页| 亚洲天堂99| 久久久久久9热不雅视频| 天天做天天爱天天爽夜夜揉| 五月天涩涩| 婷婷色在线| 五月婷狠狠| 99九九在线| 开心婷婷五月天激情网| 激情五月婷婷综合| 六月婷婷香蕉| 日韩欧美骚货| 五月天婷婷色| 91人人澡人人爽人人看| 婷婷五月丁香伊人网| 大香线蕉伊人| 偷拍99在线视频观看| 久久激情视频99| 激情网婷婷五月天| AV成人在线网站| 99久热在线精品| 操日挥操日日| 99热这里只有精品4| 五月丁香久久综合色| 香蕉婷婷色五月| 色五婷婷| 大战熟女丰满人妻AV| 六月色色| 婷婷婷久久久| 丁香五月欧美| 六月婷久久| 五月在线| 精品人妻伦九区久久AAA片| 五月丁香啪。| 婷婷五月天综合中文| 粉嫩AV久久一区二区三区| 欧美久久婷婷| 九九成人视频| 五月婷久久| 99在线免费观看| 精品二区| 99精品在线播放| 婷婷丁香九月| 婷婷综合网性| 国产无套精品一区二区| 日本操B视频| 丁香婷婷六月激情文学| 黄色成人网站在线播放| 九九色婷婷五月天| 色。 婷婷婷| 色色五月婷婷| 婷婷五月天激情四射五月天激情| 亚洲av网站在线观看| 色www.con| 色五月婷婷亚洲最大| 久久九九经典| 第一区久久网站| 久热91| 五月综合视频在线| 久热这里只有精品6| av在线观看免费| 久久性爱视频| 久操大香蕉| 五月婷婷基地| 老司机视频lsj爱就色| 青青草搞屄视频网站| 99久久综合网| 99热在线99| 北京熟妇搡BBBB搡BBBB| 五月天婷a在线| 99无码精品| 五六月婷婷| 99热国产精品| 五月花婷婷丁香| 99在线免费视频| 99久久婷婷综合| 99热免| 亚洲精品一二三| 思思热AV| 九月婷婷综合网| 日本一级| 五月婷婷高清| 噼里啪啦在线观看免费完整版视频| 一本久道综合色婷婷五月| 色色网站| 亚洲精品操一操、噜一噜、摸一摸、爽 | 亚洲免费99| 99资源人人| 色婷婷激情| 激情综合久久| 日本乱子人伦在线视频| 五月天欧美激情| 激情五月天.色网| 精品久热69| 欧日美女Va| 国产精品第一国产精品| 激情婷婷五月社区| 六月婷欧美| 操人无码| 色色 9| 婷婷的色色五月天| www.99热| 99热在线观看这里只有精品| 97热超碰| 这里只有精品免费视频| 丁香五月六月婷婷自拍| 国产在线网址1| 婷婷久久久久| 激情校园 亚洲| 免费观看日韩成人av| 色人久久| 欧美色小说婷婷| 狠狠综合色网| 丁香色色网| 狠狠做深爱婷婷久久综合一区| 天天综合五月| 国产日韩精品SUV| 久热这里| 五月丁香综合激情在线观看| 日韩AV成人电影| 色五月天婷婷| 快色t v在线入口| 五月婷久久| 一本狠婷婷综合|