一、緩存
Redis做緩存是最常見的應用場景。客戶端請求在緩存層命中就直接返回,如果miss就去讀取存儲層,存儲層讀取到就寫入緩存層,然后再返回到客戶端。
優點:
加速讀寫
降低后端負載
缺點:
數據的不一致性
代碼維護成本
運維成本
二、緩存穿透優化
然而緩存可能會遇到這種問題:請求cache拿不到數據,就會去存儲層拿,都拿不到時,返回空值(可能會返回大量空值)。或者代碼有問題,拿不到數據。就會一直請求數據。導致后端打崩。
優化方法:
1、緩存層緩存空值。
–緩存太多空值,占用更多空間。(優化:給個空值過期時間)
–存儲層更新代碼了,緩存層還是空值。(優化:后台設置時主動刪除空值,並緩存把值進去)
三、緩存雪崩優化
redis掛了,客戶端直接請求到數據庫里面。數據庫負載非常高。甚至數據庫拖掛了。
優化方法:
1、保持緩存層服務器的高可用。
–監控、集群、哨兵。當一個集群里面有一台服務器有問題,讓哨兵踢出去。
2、依賴隔離組件為后端限流並降級。
比如推薦服務中,如果個性化推薦服務不可用,可以降級為熱點數據。
3、提前演練。
演練 緩存層crash后,應用以及后端的負載情況以及可能出現的問題。
對此做一些預案設定。
四、熱點key 重建優化:
A、B、C、D同時請求一個資源,不存在時都要去請求存儲層,有可能會拖掛。
優化方法:
1、互斥鎖:
只允許一個請求重建緩存。
其他請求等待緩存重建執行完,重新從緩存獲取數據即可。
2、用戶過期
–“物理”不過期
–邏輯設置過期時間(根據上一次更新時間,構建一個隊列,主動去更新)