1. 程式人生 > 資料庫 >Redis快取穿透、快取擊穿和雪崩

Redis快取穿透、快取擊穿和雪崩

一、快取穿透

在這裡插入圖片描述

總結:需要查詢的資料就不存在,所以我們是無法查詢到的,因此也沒有往快取中放置,或者在快取中放的是空值,我們取出來的時候發現是空值還會去資料庫中查詢,那樣就會造成很多執行緒都去資料庫中查詢資料,造成資料庫壓力過大崩潰

解決:即使從資料庫取出來的資料是null,也要在快取中放置一個值,不過這個時間可以調節小一點,畢竟還要等待資料庫中有資料的時候取出資料放在快取中

二、快取穿透

在這裡插入圖片描述

總結:很多很多個快取失效的時間重疊,導致多個快取同時失效,所以都去資料庫中查詢,將會造成資料庫壓力過大,導致崩潰

解決:將每個快取的失效時間設定的不一樣,比如根據專案要求設定的隨機時間

三、快取擊穿

在這裡插入圖片描述

總結:大量請求同時訪問一個剛剛失效的key,那麼這些請求將會去資料庫中查詢,因此將會導致資料庫崩潰

解決:雙重檢測+同步程式碼塊

拓展:

  1. 使用快取的場景:為了系統性能的提升,我們一般都會將部分資料放入快取中,加速訪問,而資料庫只承擔資料持久化功能,雖然快取好處多多,但也不是所有的資料都適合放入快取的,可以放入快取的條件如下:即時性、資料一致性要求不高的資料,訪問量大並且更新頻率不高的資料,也就是讀多寫少的資料;,一般首頁資料適合放入快取,還有那些商品分類、商品列表等等適合放入快取
  2. 本地快取的缺點:佔用空間多;當某臺伺服器快取中無資料的時候,肯定會有一個人需要長時間等待,如果部署的機器有多臺,那麼肯定會有多個人都需要等待;資料修改之後無法保證資料及時統一,畢竟每臺機器都有快取,而快取更新時間也是不同的,即難以保證資料一致性,所以最好使用特定的中介軟體產品,例如redis來專門做快取,那麼無論多少臺機器都只是從同一個redis叢集中取出資料,這樣可以完美解決上面提到的問題