主要內(nèi)容如下:
- 緩存的收益和成本分析
- 緩存更新策略的選擇和使用場景
- 緩存粒度控制方法
- 穿透問題優(yōu)化
- 無底洞問題優(yōu)化
- 雪崩問題優(yōu)化
- 熱點(diǎn)key重建優(yōu)化
1. 緩存的收益和成本
收益如下:
- 加速讀寫
- 降低后端負(fù)載
成本如下:
- 數(shù)據(jù)不一致性
- 代碼維護(hù)成本
- 運(yùn)維成本
緩存的使用場景:
- 開銷大的復(fù)雜計算
- 加速請求響應(yīng)
2. 緩存更新策略
- LRU,LFU, FIFO算法剔除:用于超過緩存容量
- 超時剔除:設(shè)置數(shù)據(jù)過期時間
- 主動更新:真實(shí)數(shù)據(jù)更新后,立即更新緩存數(shù)據(jù)
3. 緩存粒度控制
緩存層使用Redis,存儲層使用MySQL
緩存全部屬性?部分重要屬性?
- 通用性:實(shí)際經(jīng)驗(yàn)看,很長時間內(nèi)應(yīng)用只需要幾個很重要的屬性,緩存的局部性原理
- 空間占用:緩存全部會造成內(nèi)存浪費(fèi)
- 代碼維護(hù):全部數(shù)據(jù)更容易維護(hù)
4. 穿透優(yōu)化
緩存穿透是指查詢一個根本不存在的數(shù)據(jù),緩存層和存儲層都不會命中,導(dǎo)致不存在的數(shù)據(jù)每次請求到要到存儲層查詢,失去了緩存保護(hù)后端存儲的意義。導(dǎo)致后端存儲負(fù)載加大
- 緩存空對象:存儲層不命中后,仍然將空對象保留到緩存層中
- 布隆過濾器攔截:做第一層攔截,如果不存在,就不訪問存儲層
5. 無底洞優(yōu)化
添加大量緩存節(jié)點(diǎn),性能反而下降
- 客戶端一次批量操作會設(shè)計多次網(wǎng)絡(luò)操作,批量操作隨節(jié)點(diǎn)增多耗時加大
- 網(wǎng)絡(luò)連接數(shù)多,節(jié)點(diǎn)性能受影響
- 串行命令
- 串行I/O:根據(jù)節(jié)點(diǎn)劃分一下,網(wǎng)絡(luò)次數(shù)是node個數(shù)
- 并行I/O:將最后一步改為多線程執(zhí)行
- hash_tag實(shí)現(xiàn):將多個key強(qiáng)制分配到一個節(jié)點(diǎn)上
6. 雪崩優(yōu)化
緩存層宕機(jī)后,流量會崩向后端存儲
- 保證緩存層服務(wù)高可用
- 依賴隔離組建為后端限流并降級
- 提前演練
7. 熱點(diǎn)key重建優(yōu)化

熱點(diǎn)key失效后大量線程重建緩存.jpg
- 互斥鎖:只允許一個線程重建緩存
- 永遠(yuǎn)不過期:沒有過期時間或到期后,用單獨(dú)線程去重建