本文問題不分先後順序,具體問題請自己詳細定位。
1、redis緩存穿透
場景:查詢根本不存在的數據,使得請求直達存儲層,導致其負載過大,甚至宕機。
解決方案:
1、緩存空對象
存儲層未查到相應的數據後,仍然將空值存入到緩存層。再次訪問該數據時,緩存層會直接返回空值。
2、布隆過濾器
將所有存在的key提前存入到布隆過濾器,在訪問緩存層之前,先通過過濾器攔截,若請求的是不存在的key,則直接返回空值。
2、redis緩存擊穿
場景:一份熱點數據,它的訪問量非常大。在其緩存失效瞬間,大量請求直達存儲層,導致服務崩潰。
解決方案:
1、加互斥鎖
對數據的訪問加互斥鎖,當一個線程訪問數據時,其它線程只能等待。這個線程訪問過後,緩存中的數據將被重建,屆時其它線 程就可以直接從緩存取值。
2、永不過期
不設置過期時間,所以不會出現上述問題,這是“物理”上的不過期。
爲每個value設置邏輯過期時間,當發現該值邏輯過期時,使用單獨的線程重建緩存。
3、redis緩存雪崩
場景:由於某些原因,緩衝層不能提供服務,導致所有的請求直達存儲層,造成存儲層宕機。
解決方案:
1、避免同時過期
設置過期時間時,附加一個隨機數,避免大量的key同時過期。
2、構建高可用的redis緩存
部署多個redis實例,個別節點宕機,依然可以保持服務的整體可用。
3、構建多級緩存
增加本地緩存,在存儲層前面多加一級屏障,降低請求直達存儲層的機率。
4、啓用限流和降級措施
對存儲層增加限流措施,當請求超出限制時,對其提供降級服務。