Redis緩存穿透,緩存擊穿,緩存雪崩概念及解決方案

緩存穿透:

  • 概念:是指查詢一個緩存庫和數據庫都不存在的數據,以穿透redis緩存庫。正常的使用緩存流程大致是,數據查詢先進行緩存查詢,如果key不存在或者key已經過期,再對數據庫進行查詢,並把查詢到的對象,放進緩存。如果數據庫查詢對象爲空,則不放進緩存。比如用一個不存在的用戶id獲取用戶信息,不論緩存還是數據庫都沒有,若黑客利用此漏洞進行攻擊可能壓垮數據庫。

  • 解決方案:

  1. 最好對於每一個緩存key都有一定的規範約束,這樣在程序中對不符合parttern的key 的請求可以拒絕;

  2. 將可能出現的緩存key的組合方式的所有數值以hash形式存儲在一個很大的bitmap中<布隆過濾器>(需要考慮如何將這個可能出現的數據的hash值之後同步到bitmap中, eg. 後端每次新增一個可能的組合就同步一次,或者 窮舉),一個一定不存在的數據會被這個bitmap攔截掉,從而避免了對底層存儲系統的查詢壓力;
  3. 常用: 如果對應在數據庫中的數據都不存在,我們將此key對應的value設置爲一個默認的值,比如“NULL”,並設置一個緩存的失效時間。當然這個key的時效比正常的時效要小的多

緩存雪崩:

  • 概念:指的是大量緩存集中在一段時間內失效,發生大量的緩存穿透,所有的查詢都落在數據庫上,造成了緩存雪崩。
  • 解決方案:
  1. 這個沒有完美解決辦法,但可以分析用戶行爲,儘量讓失效時間點均勻分佈,設置不同的過期時間。
  2. 物理上的緩存是不設置超時時間的(或者超時時間比較長), 但是在緩存的對象上增加一個屬性來標識超時時間(此時間相對小)。 當獲取到數據後,校驗數據內部的標記時間,判定是否快超時了,如果是,異步發起一個線程(控制好併發)去主動更新該緩存

緩存擊穿:

  • 概念:是指熱點key(例如,電商"爆款")在某個特殊的場景時間內恰好失效了,恰好有大量併發請求過來了,大併發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破緩存,直接請求數據庫,就像在一個屏障上鑿開了一個洞,造成對數據庫的巨大壓力。
  • 解決方案:

    解決緩存擊穿的方法與解決緩存雪崩的方法類似。

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