亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

緩存穿透、擊穿、雪崩一次講透:高并發(fā)緩存防御實(shí)戰(zhàn)指南 線上業(yè)務(wù)半夜報(bào)警數(shù)據(jù)庫連接數(shù)打滿慢查詢堆積成山緩存Redis里明明還有數(shù)據(jù)上游接口卻一片超時(shí)。翻了一圈監(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ù)庫每次都要去做一次全表掃描級別的查詢連接池很快就會被耗盡。最陰險(xiǎn)的地方在于這種流量很難通過常規(guī)的限流手段識別因?yàn)樗鼈兊膮?shù)看起來完全合法只是在業(yè)務(wù)語義上不存在。而且穿透請求往往帶有隨機(jī)性緩存中不可能被提前寫入這些key所以緩存層約等于透明。1.2 緩存擊穿熱點(diǎn)Key在過期瞬間被高并發(fā)打穿擊穿針對的是某一個熱點(diǎn)Key。比如一個秒殺商品的詳情頁平時(shí)QPS可能只有幾百活動開始后瞬間飆升到幾萬。這個商品信息的緩存設(shè)置了30分鐘過期緩存服務(wù)在過期時(shí)間到達(dá)的那一刻如果正好有一大批請求同時(shí)來查這個Key從Redis中取不到數(shù)據(jù)它們會一起回源數(shù)據(jù)庫。這里的關(guān)鍵詞是“同時(shí)”。如果只有一兩個請求回源數(shù)據(jù)庫毫無壓力但如果同一時(shí)刻有幾千個請求同時(shí)回源數(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同時(shí)過期導(dǎo)致緩存層整體失效雪崩的覆蓋面比擊穿大得多。如果一批緩存Key設(shè)置的過期時(shí)間相同比如都是整點(diǎn)過期、都是30分鐘過期到了某個時(shí)間點(diǎn)這大批Key會一起失效。此時(shí)請求全部回源數(shù)據(jù)庫數(shù)據(jù)庫壓力瞬間達(dá)到峰值很容易觸發(fā)連接池耗盡、慢查詢堆積、主從延遲等一系列連鎖反應(yīng)。我見過一個典型事故運(yùn)營人員把一批活動頁面的緩存過期時(shí)間統(tǒng)一設(shè)置為600秒結(jié)果每天上午10點(diǎn)整這批頁面同時(shí)刷新數(shù)據(jù)庫在10點(diǎn)整那一分鐘內(nèi)的QPS比平時(shí)翻了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同時(shí)過期 / Redis宕機(jī)數(shù)據(jù)真實(shí)性數(shù)據(jù)庫不存在數(shù)據(jù)庫存在數(shù)據(jù)庫存在影響范圍單個無效請求持續(xù)不斷單個Key高并發(fā)瞬間多個Key全局性壓力恢復(fù)方式無需回填需要攔截回填緩存自動恢復(fù)回填大量緩存耗時(shí)較長核心防御布隆過濾器、空值緩存互斥鎖、邏輯過期過期時(shí)間隨機(jī)、多級緩存、高可用分清這三種場景之后下面我逐個講對應(yīng)的防御方案每一步都會給出可以直接抄作業(yè)的實(shí)現(xiàn)。2. 布隆過濾器攔截穿透請求的第一道閘門布隆過濾器的核心價(jià)值在于用極低的內(nèi)存成本快速判斷一個Key“一定不存在”。它允許誤判存在但不允許誤判不存在。也就是說如果布隆過濾器說“這個Key不存在”那它一定不存在可以安心攔截如果它說“可能存在”則需要放行到后續(xù)邏輯去驗(yàn)證。2.1 布隆過濾器的原理和數(shù)學(xué)直覺布隆過濾器的底層是一個位數(shù)組bit數(shù)組 一組哈希函數(shù)。插入一個Key時(shí)用k個哈希函數(shù)分別計(jì)算得到k個位置把這些位置上的bit全部置為1查詢一個Key時(shí)同樣計(jì)算k個位置如果所有位置都是1則認(rèn)為“可能存在”只要有一個位置是0就認(rèn)為“一定不存在”。為什么說“可能存在”因?yàn)楣E鲎?。不同Key可能映射到相同的位置導(dǎo)致某個Key雖然沒有插入過但它的所有哈希位置都已經(jīng)被其他Key置為1這就產(chǎn)生了誤判。誤判率可以估算經(jīng)典公式是誤判率 p ≈ (1 - e^(-kn/m))^k其中n是預(yù)計(jì)插入的元素?cái)?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ù)計(jì)插入100萬個訂單號希望誤判率控制在1%代入公式m約等于958萬位換算成字節(jié)約1.2MBk約等于7。也就是說用1.2MB內(nèi)存和一億分之一的誤判概率就能擋住幾乎所有不存在的Key查詢。這個性價(jià)比非常高。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ù)計(jì)元素?cái)?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下依然很可觀。所以要組合使用布隆過濾器做第一層攔截?cái)r截掉99%的穿透流量剩下1%的漏網(wǎng)之魚再用空值緩存方案兜底——把查詢結(jié)果為null的Key也緩存起來設(shè)置一個較短的過期時(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í)回源。要解決這個問題思路很簡單——讓這些請求不要同時(shí)回源而是只放一個請求去數(shù)據(jù)庫重建緩存其余請求要么等要么拿舊值。3.1 互斥鎖方案的實(shí)現(xiàn)細(xì)節(jié)互斥鎖的思路是當(dāng)緩存未命中時(shí)不是立刻查數(shù)據(jù)庫而是先嘗試獲取一把分布式鎖。拿到鎖的請求去查數(shù)據(jù)庫并回填緩存其他請求在鎖上等待然后重新讀取緩存。這里的關(guān)鍵問題是用哪種分布式鎖等待多久鎖何時(shí)釋放我推薦直接用Redis的SET NX PX命令實(shí)現(xiàn)避免引入額外的ZooKeeper或Etcd依賴畢竟Redis已經(jīng)在鏈路里了。// 嘗試獲取鎖設(shè)置5秒超時(shí) 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 { // 釋放鎖時(shí)需要校驗(yàn)持有者身份防止誤刪其他線程的鎖 String lockValue redisTemplate.opsForValue().get(lock:hot_key); if (token.equals(lockValue)) { redisTemplate.delete(lock:hot_key); } } } else { // 沒拿到鎖休眠一小段時(shí)間后重試 Thread.sleep(50); return getFromCacheOrDb(key); // 遞歸重試注意控制重試次數(shù) }這段代碼有幾個細(xì)節(jié)值得展開。關(guān)于鎖的持有者校驗(yàn)釋放鎖時(shí)如果直接delete可能把其他線程剛獲取的新鎖誤刪。比如線程A的鎖5秒超時(shí)自動釋放線程B獲取了新鎖此時(shí)線程A的finally塊執(zhí)行delete就會把B的鎖刪掉導(dǎo)致B的互斥失效。所以釋放前必須比對value值我這里用UUID做標(biāo)識只有持有者自己才能刪除。關(guān)于等待和重試沒拿到鎖就短睡眠然后遞歸重試但這個遞歸需要加次數(shù)限制。我見過一個線上問題熱點(diǎn)Key的數(shù)據(jù)庫查詢特別慢超過鎖的5秒超時(shí)第一個線程的鎖已經(jīng)自動失效了第二個線程拿到鎖又開始查庫結(jié)果多個線程實(shí)際上都在查庫互斥完全失效。所以鎖超時(shí)時(shí)間必須大于“建緩存”的耗時(shí)通常建議壓測后確定一般取數(shù)據(jù)庫查詢耗時(shí)的3-5倍。關(guān)于JVM內(nèi)鎖的補(bǔ)充如果所有請求都落在同一個Java進(jìn)程內(nèi)用JDK內(nèi)置的synchronized或ReentrantLock做本地鎖就夠了性能遠(yuǎn)高于分布式鎖。只有當(dāng)服務(wù)是集群部署時(shí)才需要跨進(jìn)程的分布式鎖。我常用的優(yōu)化方案是“本地鎖分布式鎖”兩級結(jié)合先獲取本地鎖同一個實(shí)例內(nèi)的并發(fā)先被本地鎖擋掉只有不同實(shí)例之間才需要競爭分布式鎖。這種方式能大幅減少Redis鎖請求的壓力。3.2 邏輯過期方案用舊數(shù)據(jù)扛過真空期互斥鎖的痛點(diǎn)是如果熱點(diǎn)Key過期瞬間有大量請求在等待響應(yīng)時(shí)間會變長重試也會占用線程資源。邏輯過期方案則完全不同——它不存在“緩存過期”的概念。具體做法是緩存數(shù)據(jù)中額外存儲一個邏輯過期時(shí)間字段但Redis中的Key本身不過期或者設(shè)置一個很長的物理過期時(shí)間。請求讀取到數(shù)據(jù)后先判斷邏輯過期時(shí)間是否已到。如果沒過期直接返回如果已過期則嘗試獲取互斥鎖獲取成功后開啟一個異步線程去數(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(); // 邏輯時(shí)間未過期直接返回 } // 邏輯過期嘗試獲取鎖異步刷新 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)時(shí)間穩(wěn)定。核心缺點(diǎn)是在緩存異步更新的窗口期內(nèi)用戶看到的是舊數(shù)據(jù)。對于實(shí)時(shí)性要求不高的場景比如商品詳情、文章內(nèi)容、配置信息這個缺點(diǎn)完全可以接受。但如果數(shù)據(jù)是余額、庫存這種強(qiáng)一致要求的數(shù)據(jù)就不能用邏輯過期。這里有一個生產(chǎn)環(huán)境常見的坑異步線程池如果處理不過來緩存永遠(yuǎn)不更新舊數(shù)據(jù)會一直返回。所以要給這個線程池加上合理的隊(duì)列大小、拒絕策略和監(jiān)控報(bào)警。我一般用獨(dú)立線程池核心線程數(shù)和最大線程數(shù)根據(jù)數(shù)據(jù)庫能承受的并發(fā)來定同時(shí)監(jiān)控隊(duì)列深度超過閾值就報(bào)警。4. 雪崩防御多級緩存與過期時(shí)間的藝術(shù)雪崩的殺傷力在于覆蓋面大動輒幾十上百個Key同時(shí)失效。防御思路也分兩條一是讓失效時(shí)間分散二是讓數(shù)據(jù)庫上面不止緩存一道防線。4.1 過期時(shí)間的隨機(jī)化與業(yè)務(wù)錯峰最基礎(chǔ)的方案是把固定的過期時(shí)間改成“基礎(chǔ)過期時(shí)間隨機(jī)偏移量”。比如原來統(tǒng)一3600秒現(xiàn)在改成“3600 隨機(jī)數(shù)60~600秒”。這個策略在代碼里改動最小卻能顯著降低同時(shí)失效的概率?;A(chǔ)時(shí)間 隨機(jī)偏移 實(shí)際過期時(shí)間 3600 random(60, 600) 3660~4200秒要注意的一點(diǎn)是不要所有Key都用一個隨機(jī)算法生成完全隨機(jī)的過期時(shí)間那樣會導(dǎo)致緩存命中率下降。更好的做法是“按業(yè)務(wù)分組打散”。比如活動頁面的Key集中在300~600秒隨機(jī)商品詳情的Key集中在3600~7200秒隨機(jī)這樣同類Key的過期時(shí)間大致在一個接近的區(qū)間但具體時(shí)間點(diǎn)錯開既保持了緩存效果又避免了集中失效。另一個工程上的細(xì)節(jié)很多團(tuán)隊(duì)用同一個RedisTemplate的set(key, value, time)方法設(shè)置緩存如果key的命名規(guī)則里包含業(yè)務(wù)前綴可以通過前綴來配置不同的隨機(jī)范圍。我習(xí)慣在緩存工具類中維護(hù)一個過期時(shí)間策略表用Map維護(hù)前綴和隨機(jī)范圍新增緩存場景時(shí)只需要加一行配置而不需要到處改業(yè)務(wù)代碼。4.2 多級緩存把壓力分散到更靠近用戶的地方當(dāng)Redis整實(shí)例宕機(jī)時(shí)隨機(jī)化過期時(shí)間完全失效。這時(shí)真正能扛住的是多級緩存架構(gòu)。常見的分級是本地緩存Caffeine - Redis緩存 - 數(shù)據(jù)庫。本地緩存放在應(yīng)用進(jìn)程內(nèi)讀寫納秒級不依賴網(wǎng)絡(luò)。即使Redis掛了只要本地緩存還有數(shù)據(jù)請求就不會打到數(shù)據(jù)庫。這里最常用的組件是Caffeine它支持基于時(shí)間的過期策略和基于大小的淘汰策略。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)本地緩存的過期時(shí)間必須比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秒的短時(shí)不一致對一致性要求較高的場景不要加本地緩存直接走Redis。4.3 Redis高可用的兜底還有一個層面需要重視Redis本身的可用性。Redis主從切換、哨兵、集群模式都是基礎(chǔ)設(shè)施層面的雪崩防御。但要注意的是即便Redis是高可用的主從切換的那幾秒內(nèi)緩存寫入依然可能失敗。所以在業(yè)務(wù)代碼中寫緩存必須捕獲異常并降級不能因?yàn)镽edis報(bào)錯而影響主流程。try { redisTemplate.opsForValue().set(key, value, timeout); } catch (Exception e) { // Redis異常時(shí)降級本次不寫緩存下次請求繼續(xù)嘗試 log.warn(write redis failed, e); }同理讀緩存也要做降級。如果Redis讀超時(shí)不要拋異常讓請求失敗而是直接返回null并進(jìn)入數(shù)據(jù)庫查詢流程。雖然這會加重?cái)?shù)據(jù)庫壓力但至少業(yè)務(wù)是可用的配合熔斷機(jī)制可以控制住影響范圍。5. 一套完整的防御體系高并發(fā)讀接口的落地框架前面分別講了穿透、擊穿、雪崩的防御手段但真實(shí)的生產(chǎn)環(huán)境要的是把這些手段組合成一個統(tǒng)一的讀接口框架而不是在每一個業(yè)務(wù)代碼里東拼西湊。我構(gòu)建過一套比較通用的“四級防御”讀接口在這里給出完整的設(shè)計(jì)。5.1 四級防御鏈路拆解整個讀請求的流程可以分為四層第一層本地緩存。Caffeine承載過期時(shí)間30秒。這一層的目的是扛住極端QPS下對Redis的壓力。如果本地緩存命中整體響應(yīng)時(shí)間在毫秒級。第二層布隆過濾器。判斷Key是否可能存在。如果不存在直接返回空結(jié)果或緩存中的空標(biāo)記杜絕穿透流量進(jìn)入數(shù)據(jù)庫。布隆過濾器可以放在RedisRedisBloom模塊中也可以放在本地Guava根據(jù)數(shù)據(jù)量權(quán)衡。第三層Redis緩存。承載主要的緩存命中流量過期時(shí)間根據(jù)業(yè)務(wù)配置采用基礎(chǔ)時(shí)間隨機(jī)偏移。這一層是系統(tǒng)的主力緩存層。第四層數(shù)據(jù)庫。只有前面三層全部未命中才會到達(dá)這一層。到達(dá)這一層時(shí)還要用互斥鎖控制并發(fā)回源的數(shù)量保證同時(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緩存之前。這么做的原因是布隆過濾器的查詢時(shí)間比較快而且如果它判斷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)時(shí)間從40ms降到了12ms。主要參數(shù)配置是這樣的參數(shù)值說明本地緩存過期時(shí)間30秒必須小于Redis緩存過期時(shí)間本地緩存最大條目10000防止內(nèi)存溢出需要根據(jù)Heap大小調(diào)整Redis緩存過期時(shí)間600秒隨機(jī)120秒兼顧命中率和防雪崩布隆過濾器預(yù)計(jì)元素量實(shí)際數(shù)據(jù)量×1.1留出10%余量布隆過濾器誤判率0.01取值越低內(nèi)存越大鎖超時(shí)時(shí)間5秒大于數(shù)據(jù)庫慢查詢耗時(shí)異步刷新線程池核心4最大8隊(duì)列1000根據(jù)數(shù)據(jù)庫能力配置這個配置不是固定不變的僅供參考。核心原則是數(shù)據(jù)庫回源量必須壓到數(shù)據(jù)庫能承受的范圍以內(nèi)同時(shí)保證緩存命中率在95%以上。6. 常見問題與排查技巧實(shí)錄在實(shí)際維護(hù)這套體系的過程中我踩過不少坑也總結(jié)了一些排查路徑。單獨(dú)拎出來說一遍可能比上面那些代碼更有價(jià)值。6.1 布隆過濾器誤判偏高怎么辦誤判率升高先別急著調(diào)大位數(shù)組。排查一下是不是數(shù)據(jù)量增長超出預(yù)期導(dǎo)致初始化的n值過小。比如你初始化的預(yù)計(jì)元素量是100萬實(shí)際寫進(jìn)了500萬誤判率會急劇升高。解決辦法是監(jiān)控過濾器中的BF.INFORedisBloom或者布隆過濾器當(dāng)前元素?cái)?shù)的估算值超過預(yù)計(jì)量的80%就觸發(fā)自動重建或者提前把預(yù)計(jì)量設(shè)大一點(diǎn)。還有一個容易忽略的問題業(yè)務(wù)代碼中對Key的序列化方式不統(tǒng)一。有的地方用String有的地方用DigestUtils.md5DigestAsHex做了哈希如果Key的格式不統(tǒng)一布隆過濾器中的數(shù)據(jù)和查詢的數(shù)據(jù)無法對應(yīng)會產(chǎn)生大量“假誤判”。排查時(shí)可以先打日志確認(rèn)同一個Key在寫入和查詢時(shí)經(jīng)過的字符串是否完全一致。6.2 互斥鎖失效緩存被重復(fù)重建鎖失效最典型的場景是持鎖線程執(zhí)行時(shí)間超過了鎖的自動過期時(shí)間。鎖被Redis自動刪除后其他線程又拿到新鎖造成多個線程同時(shí)查庫。排查時(shí)看日志里“acquire lock”和“release lock”的間隔如果經(jīng)常接近鎖超時(shí)時(shí)間說明建緩存過程太慢需要優(yōu)化數(shù)據(jù)庫查詢或者把鎖的超時(shí)時(shí)間拉長。還有一個更隱蔽的問題鎖的key設(shè)置了過期時(shí)間但釋放鎖時(shí)用delete命令如果恰好在這個時(shí)刻鎖已經(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)一致而是把一個可接受的不一致時(shí)間明確寫進(jìn)文檔。對于主動更新的場景可以在更新數(shù)據(jù)庫后先刪Redis緩存再通過延遲雙刪1秒后再次刪除來清理可能被讀請求重新寫入的舊緩存。本地緩存這邊如果框架支持消息通知可以通過Redis的Pub/Sub廣播一個“清本地緩存”的消息如果沒條件就接受它最多30秒的過期時(shí)間。重要提示多級緩存的一致性考驗(yàn)的不是技術(shù)而是業(yè)務(wù)容忍度。設(shè)計(jì)架構(gòu)前先和業(yè)務(wù)方確認(rèn)數(shù)據(jù)更新后最多可以接受多少秒的延遲把這個數(shù)字寫清楚比你用再高級的組件都重要。6.4 緩存回填風(fēng)暴的預(yù)防當(dāng)大量緩存同時(shí)失效時(shí)回填過程本身也會造成數(shù)據(jù)庫壓力。除了隨機(jī)過期時(shí)間以外還有個技巧是“回填節(jié)流”——不是所有請求都去數(shù)據(jù)庫回填而是只讓一部分請求去查詢其他請求直接返回默認(rèn)值或空數(shù)據(jù)。比如用互斥鎖保證同一時(shí)刻只有一個請求回填或者用一個“回填信號量”控制全局的最大回填并發(fā)數(shù)。我在高并發(fā)場景下還用過一種“漸進(jìn)式回填”緩存失效時(shí)返回的舊數(shù)據(jù)里帶一個refresh_after字段表示“這個數(shù)據(jù)最多再服務(wù)多久”。到達(dá)這個時(shí)間后只允許一個異步任務(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ù)惡意流量?;コ怄i的邊界在于它本質(zhì)上是在“用性能換一致性”——請求需要等待必然增加延遲。如果熱點(diǎn)Key的過期頻率很高比如每分鐘都過期那么鎖競爭本身就會成為新的瓶頸。這時(shí)候邏輯過期方案更合適因?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ī)化過期時(shí)間。不要一上來就上一個全量的“緩存防御全家桶”復(fù)雜度會翻倍排查問題的難度也會翻倍。8. 一次真實(shí)事故的復(fù)盤從報(bào)警到修復(fù)的完整思路最后分享一次我親身經(jīng)歷的事故把前面這些理論串起來看效果會更好。某次大促預(yù)熱期凌晨兩點(diǎn)監(jiān)控突然報(bào)警數(shù)據(jù)庫CPU打滿慢查詢暴漲。查看Redis的hit ratio從平時(shí)的98%掉到了76%。第一反應(yīng)是查RedisKey的過期情況發(fā)現(xiàn)大量活動相關(guān)的Key同時(shí)過期——運(yùn)營同學(xué)在后臺定時(shí)任務(wù)里批量刷新活動數(shù)據(jù)刷新代碼統(tǒng)一設(shè)置的過期時(shí)間是300秒而定時(shí)任務(wù)每5分鐘執(zhí)行一次相當(dāng)于每300秒就有幾百個Key同時(shí)被重建。解決思路分了三步第一步止血。臨時(shí)把定時(shí)任務(wù)的刷新邏輯改掉刷新完成后不刪舊緩存而是先更新數(shù)據(jù)庫再通過異步任務(wù)在后臺批量重寫緩存讓緩存過期時(shí)間錯開。這一步花了5分鐘數(shù)據(jù)庫壓力立即回落。第二步治理。把活動緩存代碼統(tǒng)一改成隨機(jī)過期時(shí)間并且加了一個開關(guān)如果某個批次Key的數(shù)量超過閾值就隨機(jī)挑選其中一半先刷新剩下的延遲30秒再刷新避免瞬時(shí)并發(fā)回填。第三步預(yù)防穿透。大促當(dāng)天存在大量用戶反復(fù)刷新不存在的活動頁面布隆過濾器提前添加了所有活動ID的集合無效請求在過濾器就直接被攔掉。事故復(fù)盤后我意識到一個核心問題很多緩存故障不是技術(shù)方案不行而是業(yè)務(wù)側(cè)的定時(shí)任務(wù)、批量操作沒有考慮緩存失效的“共振效應(yīng)”。技術(shù)防御是必要的但更重要的是在業(yè)務(wù)流程中加入緩存意識——比如批量更新數(shù)據(jù)的任務(wù)一定要把“集中過期”作為一項(xiàng)風(fēng)險(xiǎn)來評估。這套防御體系我的建議是你不用全上根據(jù)自己的業(yè)務(wù)體量從布隆過濾器或互斥鎖選一個開始逐步疊加。先把最痛的那一個問題解決了再考慮引入更多組件。緩存這層看上去簡單但真正要扛住高并發(fā)那些“緩存失效瞬間”的處理才見功底。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久久久久9999精品九九九| 亚洲AV成人无码一二三久久| 超碰97起碰| 99色色网| 免费看国产大AB| 91精品人妻一品二品三品| 天天做天天爱| 国产超碰人人爽人人做| 鸥美精品一区二区久久婷婷| 欧姜老司机| 国产成人免费观看在线视频| 国产乱码精品久久久久久| 天堂成人网| 国产精品网址| 熟妇艹鸡八| 少妇的嫩逼图片| 男女日B国产| 久久综合激情| 日本国产二线女色| 91天堂色男人的天堂| AV一二区| 欧美18老人禁| 日韩一级二级三级免费看完整版 | 人妻加勒比东京热| 亚洲无码视频免费在线观看网址!| 一级特级aaaa毛片免费观看| 精品9999| 亚洲制服aⅴ中文字幕| 天天爽天天操| 免费操逼91| 91黑丝露脚| 一本色道久久综合亚洲二区三区| 欧美色视频在线| 97色冈| 欧洲亚洲人妻无码久久三区四区| 国产精品999zyz| 超碰中文字幕人妻草一区| 久久久96| 日韩精品人妻中文字幕有码午| 加勒比海人人操超碰在线| 欧洲色色| 在线观看中文字幕| 91超碰碰在线| 久久久A∨| 亚洲图片欧美色| 欧美一区91大爱| 91综合网| 欧美组图日韩亚洲中文字幕| 天堂69亚洲精品中文字| 熟女丰满人妻一区| 亚洲天天操| 欧美日韩电影一区二区| 最新日韩黄片| 极品出轨视频网站| 东北黄色电影| 国产精品女aA片爽爽视频| 99999精品成人| 美国aaaaa一级黄片| 成人精品一区二区三区| 丁香五月婷婷五月| 操操逼操操逼操操逼逼| 成人五月天丁香激情综合| 亚洲天堂人人妻| 开心五月婷婷激情| 老司机香蕉久久久久| 久久久久久久久久久久久久久乱码| 成人无码在线超碰网| 色 婷97| 中文字幕日本久久| 国产资源中文字幕在线| 日韩无码第3页| 亚洲综合色婷婷| 五月天婷婷社区| 夜夜综合| 精品网站9999| 久久亚洲AV成人精品无码| 久久78| 精品人妻一区二区蜜桃视频| 91天天综合网,天天综合网| 一级啊性爱在线视频| 亚洲**2021在线观看| 综合少妇网| 亚洲宗合网| 精品在线观看视频在线| 内射老妇BBWX0C0CK| 欧美大的香蕉有线电视视频| 男人的天堂日韩| 久99热| 偷拍自拍在线视频观看| 久久久一区二区三区三州| 欧美亚洲高清不卡| 好湿好紧好爽 视频| 去干网最新版| 人人操人人摸人| 国产精品福利资源在线尤物| 欧美78P| 丁香六月综合激情| 三级三久久线久久99久目本WW| 国产亚洲美日韩Aⅴ中文字幕无码成人| 女生91网站| 97视频播放| 99久在线精品99re8蜜桃| 麻豆人妻偷人精品无码视频| 国产不卡的视频 | 日本精品一区二区中文字幕| 女人午夜视频777| 欧美偷拍区| 日本 色 导航| 亚洲天堂资源网| 女生自91网站| 国产视频三区四区| 亚洲激情色片| 国产精品电影推荐| 精品无人区麻豆乱码1区2区图片| 国产三级中文字幕粉嫩| 久久久久久人| 亚洲女人91| 97欧美日韩综合| 国产剧情在线| 北约熟女超碰| 97人人射| 97色色色综合网站| 天堂综合网| 欧美精品亚洲精品日韩传电影| 欧美熟爽综合| 玖玖资源中文字幕制服丝袜| 大香蕉视频啪啪啪啪| 亚洲人妻五月丁香婷婷| 日韩欧美性吧婷婷乱伦大香蕉| 蜜臀久久99精品久久久电影| 岛国免费黄色网址| 久久精品性| 嗯啊啊啊轻点视频 | 91欧美情色| 日日摸天天爽夜夜欢| 青青草视频爽一爽| 91狠狠综合久久久久久| 亚洲成人av色网| 久久大香蕉手机高清| 日日夜夜国产综合| 精品久操| 性爱网站一区二区| 丝袜狠狠草尤物人妻av91| 蜜桃精品视频一区| 夜夜爽夜夜| 亚洲一区二区久久久久| 久久婷婷色综合一区二区三区| 日韩欧亚太美不卡| 亚洲欧美97| 国产精品久久天天干| 欧美日韩精品一区二区三区高清| 人人操AV| 日韩高清一二三| 色综合av综合久久| 911粉嫩人妻| 麻豆区99999| 96一区二区三区| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 熟妇精品juliaannAV| 日韩成人人妻网站| 日本成人A片网站| 五月天激情影院| 老熟妇综合| 久一区久久蜜桃| 无码逼| 日本特黄f c2| 91精品老女人| 久久黄黄| 欧美色狠| 67914亚洲精品| 夜夜爽77777| 丝袜狠狠草尤物 91| 久九色| 色牛牛AV| 国产视频小说| 日韩射图| 在线一道啪| 欧美另类色图片| 高清孕妇孕交 交孕妇| www久久国产精品| 日本 欧美 亚中文字幕| 九九九精品| 亚洲偷拍自拍在线视频| 五月天精品| 人人爱人人操人人性| 五月激情视频| 中文字幕人妻丝袜乱一区三区| 亚洲国产婷婷在线播放| 91中文精品日韩欧美在线| 亚洲情色 无码专区| 约操熟妇| 麻豆区99999| 超碰97人妻| 97九色人妻| 亚洲素人网| 国产黄色影片在线观看| 日本999精品视频| 99久久国产精品免费高潮| 人人摸人人干| 九九九九国产| 综合国产97| 佐山爱中文字幕| 日韩免费在线观看不卡| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 最新日本中文字幕| 四虎884a| 亚洲蜜乳av| 精品一区二区三区蜜桃臀www| 精品人妻中文字幕4399| 欧美 色 亚洲| 青青11操操操操操操操操| 精品78| 97亚洲综合电影| 美女操逼A A| 精品乱子一区二区三区99| 少妇高潮流水av免费| 国产精品高潮久久AV| 九九精品99| 国产情色在线| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 樱花蜜乳av| 青青草国产盗摄一二三区| 亚洲精品国产熟女| 日本媚薬中文字幕在线| 99自拍B亚洲 | 欧洲黄色网| 走光一区92下载| 国产又大又硬又长又粗| 丝袜人妻av一区二区| 9久久美女首页| 秋霞蝌科网日本一区| 91美女视频直播| 91天天| 极品久久久久久久久久久久久久| 亚洲精品中文字幕一区在线视频| 综合色一区三区二区| 东京热av男人的天堂| 久久免费精品视频免一| 秋霞一级鲁丝片A片| 亚洲精品一区二区免费在线观看| 国产天美欧美| 第一高清av中文字幕| 久久久一区二区三区四区五区| 九九玖玖精品| 亚洲欧美日韩综合在线尤物| 91被操| 色爱天堂| 舔舔啊| 人人摸人人干| 国产美女口爆吞精视频| 中文字幕福利视频一区二区三区在线观看| 日日干夜夜操视频h| 久久国内| 天天躁日日躁AAAAXXXX国产| 嗯嗯不要视频| 91激情国产| 骚乳在线| 精品久久青青草| 欧洲一级性爱视频在线观看| 蜜乳AV免费观看| 中日992视频| 欧美日韩黄色片一区二区三区四区人与兽做爱 | 欧美日综合| 中文幕97| 蜜臀久久99精品久久久久免费观| 五月丁香综合| 综合色99| 一区三区啪啪| 亚洲欧美在线观看2021| 91在线秘 男同| 天天激清| 欧美一区二区三区大综合| 青青草天天亲夜夜操网| 乱伦1色页| 青娱乐老司机视频| 久久中文字幕一区不卡| 蜜乳中文字幕a在线| 欧美在线亚洲| 人妻人久久精品中文字幕| 久久久久ab| 九X超碰| 亚洲欧洲视频小说在线观看| 嗯啊不要啊在线 | 欧美黑人精品一区二区| 岛国免费黄色网址| 手机在线播放国产福利| 国产99精品一区二区三区免费| 91操操操操| 女人天堂av在线播放| 欧美色97| 久久伊人影院| 天天综合网~91| 亚洲高清91| 97资源站日韩| 亚州男人天堂| TS人妖另类精品视频系列 | 天天日熟妇| 少妇人妻在线| 视频二区美腿制服人妻欧美| 天天干夜夜鈤| 九七超碰| 能在线播放的国产三级| 思思热国产在线视频| 俄罗斯一区二区视频在线观看| 日韩欧美大片免费高清啪啪| 欧美伊人久久综合网| 涩涩涩综合| 天天情欲宗合网| 国产人妻精品一区二区三区秋霞 | 色老汉色| 亚洲高清在线se| 天天综合91入口| 玖玖久久久| 日日爱99| 三级特黄60分钟播放| 日韩人妻播放| 中文字幕在线观看丝袜| 白丝少妇一区二区| 欧美色图小说综合| 中文字幕丰满子伦无码专区在线视频最新 | 丝袜天堂| 韩国三级三级BD在线| 歐美性天天| 久久久久人| 9.1小视频| 屁股久久久久久| 一区二区免费电影久久| 欧亚性爱啪啪| 日韩内射视频| 中文子幕一二三| 97国产精品一区| 啊…啊…操我用力操我| 青娱乐福利99| 福利在线黄片| 97资源站国产精品| 亚洲精品三| 五月色网| 黄色二级片网站| 一级免费啪啪片| 香蕉色网| 黄色在线网站| 亚洲日韩美女丝袜美腿人妻视频| 96AV久久久| 无色无码| 操逼视频国产无套| 很狠操| 在线观看一卡二卡| 欧美—性—交—色| 91亚洲图片| 欧美综合天堂| 国产一国产一级毛片古装| 中文字幕在线免费观看| 偷拍精品一区二区三区| 欧美日韩国产一区二区小黄片大全| 外站AV在线| 九九九九精品| 国产精品久久天天干| 性爱综合一区二区| 人人摸人人添人人操| 一级特级aaaa毛片免费观看| a级理论午夜日本| 黄色欧美性爱视频| 丁香啪啪| 国产精品天美传媒| 久插综合| 欧美成人国产精品| 99热婷婷一区二区三| 操熟女91| 北约熟女超碰| 亚洲偷拍自拍在线视频| 精品人妻一二三| 日B操| 伊人网综合在线视频| 在线观看精品国产免费| 亚洲人妻一区二区三区| 成人五月天色网| 欧美洲精品一级| 久久久久久久唑| 国产精品高清2021在线| 婷婷伊人网| 97综合在线观看| 超碰98综合网| 精品999一区二区| 美国精品国产精品| 久久综合婷婷| 牛牛久久国产精品视频一二三| 大但人体久久久久| 黄骗免费网站| 欧美日韩在线国产在线| 日韩精品一区二区三区四虎影视| 日本东京热大香蕉a片| 精品女同一区| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 亚洲无码日韩电影| jizzjizz欧美| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 亚洲久9| 国产亚洲日韩欧| 亚洲欧洲国产综合av| 国产馆极品诱惑| 国产成人精品一区| 国产一区二区三区高清视频| 亚洲精品中文字幕一区在线视频| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 日本熟妇色熟妇在线视频播放| 日本岛国黄色网址| 国产黄片在线免费观看| 99热免费| 99re99在线视频| 国产探花日韩援交| 欧美|91色综合| 日本黄页视频在线观看| 亚洲人体视频在线观看| 青草视频在线看看看看看看看看看| 亚洲综合九| 国产精品美女视频诱惑| 婬女免费一二三区A片| 国产不卡中文字幕免费avi| 欧美碰碰综合色| 国产黄色 A 片免费看| 九久9热| 中文字幕一区二区无码成人| 国产精品一区二区三区,亚洲综合| 你操综合| 97干在线视频| 成人 日韩欧美一区| 丰满人妻一区二区中文| 国产精品永久免费10000| 亚洲欧美大| 九九九九一区| 亚洲加勒比久久日本道| 超碰av在线| wuyechaopeng| 亚洲天堂7777| 成人片视频| 伊人一区二区在线播放| 亚洲 图片 欧美 色图| 风月影院十八禁| 伊人99热| 天天综合网~91| 97操操| 少妇人妻在线| 日韩午夜啪啪视频| 亚春色色| 婷婷综合久久| 熟女熟妇一区二区三四区| 色婷婷网| 三级色影综合网| 激情五月综合网| 老熟女综合网| 99热综合| 亚洲欧洲激情卡通另类文学四射小说网站| 色99视频| 99九九久久| 亚洲人在线| a级免费在线观看| 国产熟女少妇一区| 欧美福利视频啊啊啊啊| 国产嫩草精品A88AV在线| 人人爱人人乐人人操| 91女神在线视频| 操逼无码操逼| 免费网色网站| 男人天堂久久精品不卡| 99色天堂| 97aiaiai| 六月丁操逼| 奇米四色影视777久久久| 国产欧美成人精品| 在线国产探花| 91精品91久久久久77777俄罗斯老妇姓x| 男人天堂电影院| 精品亚洲国产成人精品| 国产精品久久久久久9999| 一区二区三区激情在线观看| 精品人妻一区二区三区免费视频| 亚洲精品819| 日本性爱视频一级| 插入粉嫩少妇视频| 日韩人妻精品久久久久| 青娱乐福利99| 9美女超碰在线免费观看| 丁香五月激情综合| 国产av激情无码久久天堂| 亚洲电影91| 国产67194| 水多多映视AV| 色悠久久久av| 亚洲国男人的天堂| 日本成人A片网站| 日本免费一区二区不卡 | 中文操逼字幕| 色五月激情AV在线| 婷婷日韩一区二区三区中文字幕在线| 囯戸精品高潮呻吟旡码| 五月天精品| 国产精品久久久久无码Av网曝门| 加勒比性爱成人在线| 精品超碰中文在线| 黄色电影观看久久9| 日日骚网站| 大香蕉啪啪啪啪在线| 久操不卡视频| 丰满人妻一区二区三区性色| 久射吧| 打av高清| 亚洲成人av色网| 亚洲AV噜噜狠狠网址蜜桃动漫| 日韩无码第3页| 91夜夜蜜桃臀1区2区3区| 国产成人自拍视频在线| 国产精品ⅴ无码大片在线看.| 91熟女视频网| 免费看污网址| 亚洲最大黄网| 欧美日综合| 青娱乐亚洲自拍| 综合网91| 精品在线78| 亚洲资源网| 久久久久久大| 天天弄天天操| 日韩人妻一区二区精品| 国产一区二区三区久久久精品| 男人天堂新在线| WWW美腿丝袜香蕉中文| 亚洲人在线成线成人| 超碰成人免费| 国产美女mm131爽爽爽爽| 亚洲AV成人精品网站在AV| 欧美成97爱| 色五月AV在线| 婷婷丁香五月天综合东京热| 最新国内自拍av免费| 日日超碰亚洲| 亚洲人久久久久日| 日本道人妻久久久在线不卡色视频| 中文字幕久久精视频久久大全| 狠狠中文字幕| 欧美毛片在线网| 中文字幕一区日韩精| 人人操人人摸人人看人人干| 中文字幕一区二区三区四区在线视频| 91精片| 另类欧美色| 中文字幕免费在线观看| 国产九九九九九九| 国产精品久久久久999| juliaann丝袜大战黑鬼| 蜜桃不卡一区二区| 青草香蕉网| 天天干天天日天天射黄色大片| 亚洲日本成人动漫| 床上啊啊啊一区二区三区| 日韩999| 综合激情婷婷| 九九在线精品| 丰满人妻一区二区三区免费,| 99九九精品| 毛片电影一区二区三区| 国内精品久久久久影院亚洲| 亚洲成?V人片在线观看福利| 99热这里只有精品地址| 91色婷婷综合久久中文字幕二区| 久久婷色| 人妻熟女午夜精品在线| 蜜桃色色网站视频三区| 国产成人资源| 精品国产99| 中文字幕久久精品一区| 秋霞鲁丝午夜无码一区二区三| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 欧州色图区| 天天色悠悠激情| 亚洲一二三精品久久网| 草久久久| 福利大香蕉| 午夜福利 成人 91| 亚洲色图欧美| 超碰在线人妻中文字幕| 国产91啪| 亚洲成人免费在线| 欧美男女午夜啪啪| 97超碰免费人人性爱| 亚洲综合贴图91 | 久久久久精| 9超碰免费| 久久夜精品一区二区三区| 久艹视频在线| 亚洲色图91| AV和黑人在线播放| 欧美性爱另类综合| 你操综合| 91亚洲丝袜| 日本欧美不卡| 成人无码在线视频网站| 最新日韩黄片| 中文字幕日产av人| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 乱伦一二三区| 探花一区在线| 天天操天天射青青草| 亚洲精品一卡二卡三卡福利视频网站 | 少妇人妻在线| 少妇被c 黄 免费观看| 中日亚韩免费视频| 精品国产一区二区三区av在线资源| 亚洲中文人妻色| 97伦乱| 国产毛片毛片4p懂色| 亚洲成a人片在线观看中文!!!| 色丁香五月婷婷| 殴美日韩m| 97中文综合| 成人午夜高潮av猛片| 在线观看精品国产免费| 麻豆AV一区二区| 天天日骚逼熟女| 91视频精品| 一区二区三区机械有限公司| 成人日韩中文字幕| 一本色道人妻久久| 在线视频免费播放一区| 精品熟女一区=区三区| 97超级色碰碰| 日本操逼视频不卡直接放| 狠狠干婷婷| 使劲用力艹少妇视频一区二区| 夜夜爽夜夜高潮夜夜爽| 人妻系列无码专区中文有码| 91 丝袜在线| 欧美日综合| 欧美性爱www免费版| 精品网站9999| 人妻精品一区二区| 精品v日韩欧美国产| 亚洲蜜臀懂色| 久久男人的天堂| 性做久久久久久免费观看软件| 玖玖爱一区在线| av网站在线看| 亚洲综合小说另类图欧美视频激情小说色五月天 | 一本一道人妻久久一区二区三区| 欧美极品色| 51久久夜色精品国产麻豆| 色噜噜综合在线| 亚洲情色 自拍| 男人a天堂手机在线版| 久久夜嗨| 欧美操人视频| 九九九九九九亚洲| 美女久久久| 五月丁香网站| 少妇的嫩逼图片| 人人操人人摸人| h色99999| 韩国一级AAA| 国产日韩人人| 国产av激情无码久久天堂| 成人AV素股で擦久久| 老女人综合| 激情六月婷婷| 超碰色97| 嗯啊不要在线| 97亚洲在线| 中文字幕五区| 精品999一区二区| 激情六月天| 欧美 亚洲| 水澄无码AV| 蜜桃久久一区二区| 欧美高清无码免费视频高清版| 国产传媒一区日韩| 亚洲欧洲偷拍一区| 超碰在线一区二区| 婷婷三区| 色色色日本| 亚洲熟妇乱女区二区三区| 无码天堂| 国产极品999| 激情婷婷综合久久| 啊啊啊好湿久久| A一区片| 乱老熟女一区二区三区| 欧美日韩国产三级黄色| 中文在线视频| 韩国黄色片精品久久久| 国产精品在线免费| 又黑又大又粗| 手机在线免费看的av| 国产精品久久久777| 国产一级不卡在线观看| 另类老少妇| 久色网| 91久久青青草原精品| 97久久超碰国产网站| 成人无码电影在线观看网| 中文一区在线日| 国模精品娜娜一二三区 | 一区二区三区国产在线播放| 九X超碰| 玖玖玖玖精品国产剧情| 99re6在线视频播放免费精品| 98一区二区精品| a片偷拍视频| 美女让帅哥通她小鸡鸡| 丁香六月啪啪| 欧美真人抽搐一进一出gif| 欧色性第一页| 综合久久婷婷| 人妻无一区二区三区| 加勒比东京热五月天天堂网| 色啪网| 老熟女乱伦一区| 丝袜天堂网| 91 手机在线播放 绯色| 十八禁av无码免费网站APP| 欧美亚洲韩国视频十五区| 日韩在线观看三级电影| 欲射影视| 亚洲综合另类| 又粗又长又爽在线观看| 91国产丝袜白虎| 特级大荫道BBwBBwBBW| 伊人五月天激情| 亚洲图片欧美色| 欧美少妇高潮久久91| 色优久久| 少妇无码av专区线| 九九九九九九九九九国产精品 | 大香蕉92| 中文字幕在线观看第二页| 日韩,欧美,中文在线| 97香蕉网| 四虎884| 亚洲 欧美 小说| 久久精品99| 精品久久久高清无码| 美女91在线| 国产乱青青草久久| 日韩欧美成人大香蕉| 最新日韩黄片| 草草影院最新网址| 久久超碰网| 亚洲成人在线资源| 天天天天做夜夜夜夜做| 天天综合AV| 欧美日韩第一页| 亚洲国产精品9999在线观看| 日韩射精| 日1区2区3区2020| 素人无码中文字幕| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 精品中文一区二区| 欧美亚洲20p| 精品久久視頻在线| 亚洲无码一区二区三区三州| 无码人妻精品一区二区中文| 国产精品久久久久久久久久久久| 久久精品一区二区三区不卡| 凸凹视频在线观看| 福利操逼| 操逼无码操逼| 亚洲不卡三级手机播放| 欧美丝袜中文字幕07在线| 欧美传媒一区| 97一区二压| 99re9这里只有精品| 乱人伦 国语对白:视频直接看| 秋霞影音一区二区三区| 日本色色视频网站| 国内精品嫩模A∨私拍小视频| 少妇淫妇久久久久久久| 7月婷婷综合| 午夜视频久久久久一区| 久久久久人| 久久99精品国产| 久久精9| 欧亚第一综合网| 亚洲……91| 很黄很色的视频在线观看| 91亚·色| 国模一区二区三区| 男人天堂久久精品| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 亚洲美女高潮喷水视频| 一级免费精品| 久肏视频字幕| 91日韩网站| 91丰满| 亚洲天天更新| 日韩无码极品| 秋霞一集毛片观看| 1769一区| 黄色电影在线播放综合网站 | 国产一级不卡在线观看| 密乳无码| 一本一道vs波多野结衣| 丁香六月东京热| 国产一级αv免费看片| 毛片电影一区二区三区| 99热在线播放| 伊色综合天堂色97| 欧洲中文字幕| 久久久久密臀一区二区| 亚洲综合射| 99精品热| oumeisetu综合| 69综合网| 日本好吊色视频| 国产青青综合伊人| 青娱乐妇女性生活| 国产午夜精品在线观看| 性饥渴少妇av无码毛片| 亚洲精品一二区| 一区二区三区精品久久| 激情开心五月天| 97操97色| 91路www| 上床啊啊啊| 熟妇综合一区二区三区| 精品国模无码| 色香91| 久久綜合很很很| 999熟女精品| 国产精品丝袜在线| 中文AV制服乱伦| 国产精品婬乱一级毛片彝族| 丁香五月天堂| 台湾佬中文娱乐自偷自拍| 麻豆国产成人精品| 日本 情色 1区| 亚洲一区日韩精品中文字幕 | 久久九操在线观看| 神马午夜久久| 性爱Av免费| 99超级碰免费视频| 91精品人妻一区二区-全集完整版免费正片国语-B02AV | 国产精品在线网站| 狠狠入| Av手机版天堂网| 久久精品性| 欧美精品系列| 黄页| 九九久久九九久久| 密臀AV在线| 操逼无毒无码免费视频| 一本大道久| 日韩有码专区| 国产高清无码一区三区二区| 97自拍视频在线| 欧美综合在线91| 夜夜欧美 | 午夜亚洲国产理论秋霞| 黑丝少妇麻豆| 色色99| 天天综合网国产| 国产一区二区三区中文字幕| 97AV在线免费观看| 亚洲综合首页| 97超碰无码网| 91nbbbbbb| 可以免费观看的日韩av毛片| www成人啪啪18秘 免费| 91啪9色| 五月天婷婷久久| 91亚州欧美| 精品午夜福利| 天天看,天天做| 久久伊人青青草| 久久久久九九九| 黄色av一区二区在线| 欲射影视| 亚洲本色精品一区二区久久| av一区二区三区 中文| 天操老女人| 绯色一区二区三区不卡少妇| 中文字幕在线观看视频www| AV99热18这里只有精品| 欧美性爱一区二区| 五月天社区| 97超碰中文字幕| 国产在线激情视频| 少妇诱惑视频| 91无遮挡| 91色情黑丝搞鸡在线观看一区二区三区三州| 激情视频一二三| 操操逼视频| 91人妻视频在线| AV中亚| 丰满人妻一区二区三区| 97国产中文| 日韩在线观看字幕精品| 久热久操| 草草影院最新网址| 大香蕉国产中文自拍| 99热在线观看| 野狼激情网| 亚洲在线a| 天天舔天天 | 国产熟码AV| 亚洲砖码砖专无区2023| 亚洲国内精品成人不卡| 中文字幕日韩电影人妻| 精品视频97| 久久久久久亚洲Av无码| 国产传媒一区日韩| 欧美区亚洲区偷拍区| 日韩一级二级在线| 成 人 A V免费视频在线观看| 国产精品天美传媒| 亚洲中文字幕在现观看| 后入 亚洲 美女 射| 少妇综合网| 久草综合京东| 韩国免费播放一级毛片| 嗯嗯啊啊用力视频免费| 强被迫伦姧在线观看无码网站| 成人久久无码www| 99亚洲精品| 亚洲情色在线| 综合操逼| 乱人伦 国语对白:视频直接看| 亚洲资源站| 啪啪91| 中文字幕第9页萱萱影音先锋| 色爱综合网欧美| 大香焦A片| 九九九九一级| 丁香婷婷啪啪| 色吧91| 人妻无码后入| 国产精品久久久久亚洲av| 五月天亚洲网| 操碰91| 精品人妻一区二区三区在| 嗯阿好爽好紧| 操迟操逼在巾线Fre看| 99热99re6国产在线播放| 九九色婷婷| 亚洲人天堂| 欧美十八禁导航成人| 色婷婷五月天| 99久久精品国产系列| 欧美综合制服在线| 亚洲少妇中文字幕网址| 欧美熟妇精品黑人巨大91| 色穴精品| 午夜一区二区三区国产| 极品出轨视频网站| 97久久久久久久精| 欧亚性爱在线视频| 极品出轨视频网站| 亚洲欧洲美腿丝袜| 无码精品久久久天天影视| 91男人综合| 欧美老熟另类| 熟女精品va中文字幕| 日本亚洲嫩草影院啪啪| 久久25| 中文字幕亚韩| 天天综合网网欲色| 国产视频小说| 日本福利社| 眼镜人妻101.com| 久久精品一区一起草| 精品无码久久久| 91c色| 精品午夜福利| 是还免费视频1727我| 大香交伊人网| 国产 日韩 欧美高清| 亚洲欧美在线丝袜| 日韩不卡码| 国产九月婷婷| 操逼1区| 欧美后入| 91亚洲狠狠色| 抽查国产福利主播| 国产又爽又黄| 亚洲成人性爱网站在线播放| 九九操久久国产免费视频| 激情文学欧美| 天天操夜夜操| 亚洲精品第一| 国产精品成久久久久午夜午夜| 综合网亚洲1| 日本97久久久精品| 99热这里是精品| 国产亚洲精品农村妇女| 免费AV中文网在线观看| 熟妇在线视频一区二区| 乱伦1色页| 亚洲影院成人| 噜噜噜噜久久久精品免费| 综合欧美日韩在线| 国产久久久9999| 亚欧性爱在线无码| 国产精品免费日韩| 欧美福利视频啊啊啊啊| 四虎影视精品| 公司1区2区3区精产精| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | avav青青草久久夜| 亚洲综合色图欧美| 金莲网址| 日本熟女不卡视频| 人妻天堂网| 在线电影亚洲色图| 91少妇香蕉久久精品| 亚洲情色婷婷五月天| 五月丁香婷婷色| 亚洲无码AV九九九| 特级特黄一级毛片免费| 粉嫩av在线| 亚洲在饯| 丰满人妻-区二区三区免费看 | 亚洲天堂一区二区久久| 老熟妇乱轮| 青青在线视频日韩欧美| 高精欧美色| 天天综合网合集91| 久久九精品| 综合天天网| 亚洲精品天天影视综合网 | 啊啊啊男女| 大香蕉伊然在亚洲91| 97碰碰日本乱偷人妻中文的| 欧美狠狠弄| 欧美久久婷| 中文字幕视频一区视频二区| 中文字幕大片三级狠狠干| 五月婷婷激情综合| 丁香六月婷婷久久综合| 综合色久| 午夜免费视频1000| 激情综合网激情五月天| 五月丁香成人网| 亚洲综合在线视频| 婷婷色网| 色欧美天天| 天天日老熟妇| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 久久精品人妻一区二区| 天天舔天天日天天射| 欧洲精品一二三在线| 俞拍自拍| 九九九久| 午夜啊啊| 97天天综合| 91免费看一区二区三区| 无遮挡男女激烈动态图| 26uuu成人影片| 天天躁日日躁成人字幕aⅴ| 成人乱人伦一区二区| 无码丰满熟妇一区二区浪潮AV| 久操网视频| 亚洲最大网站av| 久久婷色| 欧美精品另类人妖xxxx| 大香蕉十区| 超碰夫妻97| 呻吟 欧美 日本 中出| 91蜜桃传媒精品久久久一区二区| 久久亚洲一区二区色婷婷| 2017天天操| av网站免费线看| 777AV电影| 日韩AV熟女乱伦| 婷婷五月花| 日本天堂网| 综合视频91| 999国产精品999久久久久久| 亚洲成人贴图| 影音先锋日本乱伦| 天堂中文资源在线bt| 九九99精品视频在线观看| 国产精品一区人妻精品阁在线| 刺激性视频黄页| 亚洲天堂美臀在线| 男女啊啊啊啊啊| 久久久性| 人妻中文字幕日韩电影| 红杏大香蕉| 久久大线蕉一区| 久热网| 人人操,人人液| 秋霞蝌科网日本一区| 东京热亚洲一区二区| 三级网站超变态精品| 91综合天天看| 中文操逼字幕| 最新啪啪视频| 高凊专区人人操| 91黑丝操| 色综合一区二区三区| 91c色| 麻豆60秒| 国产精品九九| 欧美牲| 国产三区免费在线观看| 国内91熟女人妻丝袜天天精品视频在线| 97国产亚洲中文在线| 97在线播放 | 色爽爽文学| 男人的天堂久久狠| 欧美综合自拍| 欧美成人一区二区三区在线播放| 久久久工口| 精品白丝一区| 欧美18 在线观看| 婷婷99狠狠| 欧美影音在线| 性综合网| 亚洲啪啪性视频| 日韩不卡码| 久久久999| 中文字幕 国产 精品| 97视频7| 91丝袜在线播放| 日本欧美亚洲高清在线看| 日韩中文字幕熟妇人妻| 国产美女91| 久久黄色性爱视频| 99热97| 91色欧美| 多乙久久久久久| 日本女厕偷拍| 久久精品店| 激情专区综合| 亚洲的天堂网| 欧美亚洲国产91在线| 色九九九九久| 亚洲加勒比色图| 精品国产一区二区三区香蕉欧美| 熟女丰满人妻一区| 婷婷人妻激情| 极品美女福利在线观看| 欧美亚洲一区二区久久久婷精品大包诱| 91美女片在线| 国产在线视视频有精品| 人人搡人人肉久久精品| 国产毛片片精品天天看视频| 人妻久久久| 超碰97极品9| 屁屁影院一区二区三区国产| 午夜精品久久久久久久99热影院| 97精品久久| 欧美夜夜狠| 97超碰超| 丁香五月天堂| 丝袜美腿91| 性爱av在线免费观看| 91网站18+| 无码精品一区二区三区潘金莲| 亚洲色9| 中文字幕美女91| 麻豆AV一区二区| 国产美女高潮| 青青11操操操操操操操操|