redis相關問題彙總

本文問題不分先後順序,具體問題請自己詳細定位。


1、redis緩存穿透
場景:查詢根本不存在的數據,使得請求直達存儲層,導致其負載過大,甚至宕機。


解決方案:
    1、緩存空對象
    存儲層未查到相應的數據後,仍然將空值存入到緩存層。再次訪問該數據時,緩存層會直接返回空值。

    2、布隆過濾器
    將所有存在的key提前存入到布隆過濾器,在訪問緩存層之前,先通過過濾器攔截,若請求的是不存在的key,則直接返回空值。

 

2、redis緩存擊穿
場景:一份熱點數據,它的訪問量非常大。在其緩存失效瞬間,大量請求直達存儲層,導致服務崩潰。

 

解決方案:
    1、加互斥鎖
    對數據的訪問加互斥鎖,當一個線程訪問數據時,其它線程只能等待。這個線程訪問過後,緩存中的數據將被重建,屆時其它線      程就可以直接從緩存取值。
    2、永不過期
    不設置過期時間,所以不會出現上述問題,這是“物理”上的不過期。
    爲每個value設置邏輯過期時間,當發現該值邏輯過期時,使用單獨的線程重建緩存。

 

3、redis緩存雪崩
場景:由於某些原因,緩衝層不能提供服務,導致所有的請求直達存儲層,造成存儲層宕機。


解決方案:
    1、避免同時過期
    設置過期時間時,附加一個隨機數,避免大量的key同時過期。
    2、構建高可用的redis緩存
    部署多個redis實例,個別節點宕機,依然可以保持服務的整體可用。
    3、構建多級緩存
    增加本地緩存,在存儲層前面多加一級屏障,降低請求直達存儲層的機率。
    4、啓用限流和降級措施
    對存儲層增加限流措施,當請求超出限制時,對其提供降級服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章