作者:溫安適
來源:https://my.oschina.net/floor/blog/4964676
引言
一個超級疲憊的下午,離下班還有30分鍾,小航拿了一袋堅果,對我說:”溫哥,來來來,吃個堅果,開心下”
有了前幾次的,經驗,我意識到,這兄弟又要問題問題,委婉的回絕到:”謝謝好意,你吃吧,我不餓”。
小航,一看我有所防備,有拿出了安慕希,並且抓住了我的手臂,說道:“大神,我有困惑,請您幫幫我”
看他如此誠懇,我不好意思的說道:“大神不敢當,水平有限,恐無法為你解惑”。
小航一看有戲,有給了我一袋堅果,眼中有光的說道:“哥,您指點一二,無論對錯,我都願意聽”
我感動(dong xi hao chi)的說:“什么問題,我試試看”
小航立刻說道:“使用緩存都有什么問題”
我緩緩道來:“主要四個問題,擊穿,穿透,雪崩,污染”
問題描述
逐個解決
緩存擊穿
熱點key過期了,請求打到了數據庫
解決方式
不給熱點key設置過期時間
緩存穿透
緩存沒有,數據庫也沒有。
解決方式
- 緩存空值或緩存缺省值
- 對入參進行校驗,屏蔽無效參數請求
- 在redis前置布隆過濾器,快速判斷
緩存雪崩
大量key同時失效
給key的過期時間加上隨機數,避免同時過期
Redis掛了
- Redis,搭建主從集群(提高redis可靠性)
- 服務限流(限制訪問量,減少redis壓力)
- 服務熔斷(直接返回錯誤,不在繼續往下請求)
- 服務降級(redis替代方式,或者直接走庫)
緩存污染
有不常用的key占用redis內存。
解決方式:
- 如果知道是那個key,直接刪除
- Redis空間充足,可以考慮不解決
- 設置redis過期策略為allkey-lfu
注意是lfu,把訪問次數最低的數據淘汰出緩存
Lru,解決不了如下場景:大量數據進行一次全體讀取,因為這些被查詢的數據剛剛被訪問過,所以 lru 字段值都很大,無法淘汰不常用的key
總結
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2021最新版)
2.別在再滿屏的 if/ else 了,試試策略模式,真香!!
3.卧槽!Java 中的 xx ≠ null 是什么新語法?
4.Spring Boot 2.5 重磅發布,黑暗模式太炸了!
覺得不錯,別忘了隨手點贊+轉發哦!