天天看點

【redis】緩存雪崩、緩存穿透、緩存擊穿

1、緩存雪崩

緩存雪崩是指緩存同一時間大面積失效,導緻,後面的請求都落到資料庫上,造成資料庫短時間承受大量請求而崩掉。
解決方案:
  • 緩存資料的過期時間設定随機,防止同一時間大量資料過期現在發生;
  • 給每個緩存資料增加相應的緩存标記,記錄緩存是否失效,如果緩存标記失效,則更新資料緩存。
  • 緩存預熱
  • 互斥鎖

2、緩存穿透

緩存擊穿是指緩存和資料庫中都沒有的資料,導緻所有的請求都落到資料庫上,造成資料庫短時間内承受大量請求而崩掉。
  • 在接口層增加校驗,如:使用者鑒權校驗,id做基礎校驗,id<=0的直接攔截。
  • 把無效的Key存進Redis中。如果Redis查不到資料,資料庫也查不到,我們把這個Key值儲存進Redis,設定value="null",當下次再通過這個Key查詢時就不需要再查詢資料庫。這種處理方式肯定是有問題的,假如傳進來的這個不存在的Key值每次都是随機的,那存進Redis也沒有意。
  • 采用布隆過濾器,将所有可能存在的資料哈希到一個足夠大的bitmap中,一個一定不存在的資料會被這個bitmap攔截掉。進而避免了對底層存儲系統的查詢壓力。

3、緩存擊穿

其實跟緩存雪崩有點類似,緩存雪崩是大規模的key失效,而緩存擊穿是一個熱點的Key,有大并發集中對其進行通路,突然間這個Key失效了,導緻大并發全部打在資料庫上,導緻資料庫壓力劇增。這種現象就叫做緩存擊穿
  • 設定熱點資料永不過期;
  • 使用互斥鎖。如果緩存失效的情況,隻有拿到鎖才可以查詢資料庫,降低了在同一時刻打在資料庫上的請求,防止資料庫打死。當然這樣會導緻系統的性能變差

好學若饑,謙卑若愚

繼續閱讀