卧槽!緩存的問題太多了(雪崩、擊穿、穿透…)一個個解決!


作者:溫安適

來源:https://my.oschina.net/floor/blog/4964676

引言

一個超級疲憊的下午,離下班還有30分鍾,小航拿了一袋堅果,對我說:”溫哥,來來來,吃個堅果,開心下”

有了前幾次的,經驗,我意識到,這兄弟又要問題問題,委婉的回絕到:”謝謝好意,你吃吧,我不餓”。

小航,一看我有所防備,有拿出了安慕希,並且抓住了我的手臂,說道:“大神,我有困惑,請您幫幫我”

看他如此誠懇,我不好意思的說道:“大神不敢當,水平有限,恐無法為你解惑”。

小航一看有戲,有給了我一袋堅果,眼中有光的說道:“哥,您指點一二,無論對錯,我都願意聽”

我感動(dong xi hao chi)的說:“什么問題,我試試看”

小航立刻說道:“使用緩存都有什么問題”

我緩緩道來:“主要四個問題,擊穿,穿透,雪崩,污染”

問題描述

逐個解決

緩存擊穿

熱點key過期了,請求打到了數據庫

解決方式

不給熱點key設置過期時間

緩存穿透

緩存沒有,數據庫也沒有。

解決方式

  1. 緩存空值或緩存缺省值
  2. 對入參進行校驗,屏蔽無效參數請求
  3. 在redis前置布隆過濾器,快速判斷

緩存雪崩

大量key同時失效

給key的過期時間加上隨機數,避免同時過期

Redis掛了

  1. Redis,搭建主從集群(提高redis可靠性)
  2. 服務限流(限制訪問量,減少redis壓力)
  3. 服務熔斷(直接返回錯誤,不在繼續往下請求)
  4. 服務降級(redis替代方式,或者直接走庫)

緩存污染

有不常用的key占用redis內存。

解決方式:

  1. 如果知道是那個key,直接刪除
  2. Redis空間充足,可以考慮不解決
  3. 設置redis過期策略為allkey-lfu

注意是lfu,把訪問次數最低的數據淘汰出緩存

Lru,解決不了如下場景:大量數據進行一次全體讀取,因為這些被查詢的數據剛剛被訪問過,所以 lru 字段值都很大,無法淘汰不常用的key

總結

img

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2021最新版)

2.別在再滿屏的 if/ else 了,試試策略模式,真香!!

3.卧槽!Java 中的 xx ≠ null 是什么新語法?

4.Spring Boot 2.5 重磅發布,黑暗模式太炸了!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM