第11章 緩存設(shè)計

主要內(nèi)容如下:

  • 緩存的收益和成本分析
  • 緩存更新策略的選擇和使用場景
  • 緩存粒度控制方法
  • 穿透問題優(yōu)化
  • 無底洞問題優(yōu)化
  • 雪崩問題優(yōu)化
  • 熱點(diǎn)key重建優(yōu)化

1. 緩存的收益和成本

收益如下:

  1. 加速讀寫
  2. 降低后端負(fù)載

成本如下:

  1. 數(shù)據(jù)不一致性
  2. 代碼維護(hù)成本
  3. 運(yùn)維成本

緩存的使用場景:

  1. 開銷大的復(fù)雜計算
  2. 加速請求響應(yīng)

2. 緩存更新策略

  1. LRU,LFU, FIFO算法剔除:用于超過緩存容量
  2. 超時剔除:設(shè)置數(shù)據(jù)過期時間
  3. 主動更新:真實(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ù)載加大

  1. 緩存空對象:存儲層不命中后,仍然將空對象保留到緩存層中
  2. 布隆過濾器攔截:做第一層攔截,如果不存在,就不訪問存儲層

5. 無底洞優(yōu)化

添加大量緩存節(jié)點(diǎn),性能反而下降

  • 客戶端一次批量操作會設(shè)計多次網(wǎng)絡(luò)操作,批量操作隨節(jié)點(diǎn)增多耗時加大
  • 網(wǎng)絡(luò)連接數(shù)多,節(jié)點(diǎn)性能受影響
  1. 串行命令
  2. 串行I/O:根據(jù)節(jié)點(diǎn)劃分一下,網(wǎng)絡(luò)次數(shù)是node個數(shù)
  3. 并行I/O:將最后一步改為多線程執(zhí)行
  4. hash_tag實(shí)現(xiàn):將多個key強(qiáng)制分配到一個節(jié)點(diǎn)上

6. 雪崩優(yōu)化

緩存層宕機(jī)后,流量會崩向后端存儲

  1. 保證緩存層服務(wù)高可用
  2. 依賴隔離組建為后端限流并降級
  3. 提前演練

7. 熱點(diǎn)key重建優(yōu)化

熱點(diǎn)key失效后大量線程重建緩存.jpg
  1. 互斥鎖:只允許一個線程重建緩存
  2. 永遠(yuǎn)不過期:沒有過期時間或到期后,用單獨(dú)線程去重建
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容