這篇文章為大家帶來了關於Redis的相關知識,其中主要介紹了關於怎麼解決redis緩存雪崩、擊穿與穿透的相關問題,緩存雪崩是指大量的請求無法命中Redis中的快取數據,也就是在Redis找不到數據了;下面一起來看一下,希望對大家有幫助。
推薦學習:Redis影片教學
快取雪崩
是指大量的請求無法命中Redis
中的快取數據,也就是在Redis
找不到數據了,那業務系統只能到資料庫中查詢,進而導致所有的請求都傳送到了資料庫。如下圖所示:
資料庫不像Redis
能處理大量請求,由快取雪崩導致的請求激增必須會導致資料庫所在宕機,這樣勢必會影響業務系統,所以如果發生緩存雪崩,對於業務系統肯定是致命的。
什麼情況下出現快取雪崩呢?總結起來有以下兩個面向的原因:
大量Redis
快取資料同時過期,導致所有的發送到Redis
請求都無法命中數據,只能到資料庫中進行查詢。
Redis
伺服器宕機,所有請求都無法經Redis
來處理,只能轉向資料庫查詢資料。
針對導致快取雪崩的原因,有不同的解決方法:
針對大量快取隨機過期時間,解決方法就是在原始過期時間的基礎上,再加上一個隨機過期時間,例如1到5分鐘之間的隨機過期時間,這樣可以避免大量的快取資料在同一時間過期。
而針對Redis
解決當機的導致的快取雪崩,可以提前搭建好Redis
的主從伺服器進行資料同步,並配置哨兵機制,這樣在Redis
伺服器因為宕機而無法提供服務時,可以由哨兵將Redis
從伺服器設定為主伺服器,繼續提供服務。
快取擊穿與快取雪崩的情況相似,雪崩是因為大量的資料過期,而快取擊穿則是指熱點資料過期,所有針對熱點資料的請求都需要到資料庫中處理,如下圖所示:
##2 . 怎麼避免快取擊穿? 解決快取擊穿的三種方式:Redis快取資料過期時,如果有對該資料的請求,則重新到資料庫中查詢並再寫入緩存,讓後續的請求可以命中該快取而無須再去資料庫中查詢。
Redis,也就是在寫入
Redis之前,其他要求進來,也會去查詢資料庫。
Redis,而其他沒有獲得鎖定的請求只能等待資料就緒。
#
使用互斥鎖雖然可以非常簡單地解決快取擊穿問題,但沒有獲得鎖的請求雖然排隊等待,這樣影響了系統的效能,還有另一種解決快取擊穿的方法就是在業務資料冗餘一個過期時間,例如下面的資料中我們增加了expire_at
欄位用來表示資料過期時間。
{"name":"test","expire_at":"1599999999"}复制代码
這種方式的實作過程如下圖所示:
快取中的熱點資料中冗餘一個邏輯過期時間,但資料在Redis
不設定過期時間
當一個請求拿到Redis
中的資料時,判斷邏輯過期時間是否到期,如果沒有到期,直接傳回,如果到期則開啟另一個執行緒取得鎖定後去查詢資料庫並將查詢的最新資料寫回Redis
,而目前請求傳回已查詢的資料。
快取穿透是指要尋找的資料既不在快取當中,也不在資料庫中,因為不在快取中,所以請求一定會到達資料庫,Redis
快取形同虛設,如下圖所示:
Redis和資料庫裡的數據刪除了
Redis快取中查詢不到資料時,再從資料庫查詢,如果同樣沒有數據,就直接快取一個空間或缺省值,這樣可以避免下次再去查詢資料庫;不過為了防止之後已經資料庫已經對應資料庫,再回傳空值問題,應該為快取設定過期時間,或是在產生資料時直接清除對應的快取空值。
布隆過濾器。
Redis本身就支援布隆過濾器,所以我們可以直接使用
Redis布隆過濾器,而不用自己去實現,非常方便。
原因 | 解決方法 | |
---|---|---|
大量資料過期或 | Redis伺服器宕機 #1. 隨機過期時間 2. 主從哨兵的叢集 |
|
熱點資料過期 | 1. 不設定過期時間2. 加上互斥鎖定3.冗餘邏輯過期時間 | |
請求資料庫和 | Redis都沒有的資料 1. 快取空值或預設值2. 布隆過濾器 |
以上是如何解決Redis緩存雪崩、擊穿與穿透的詳細內容。更多資訊請關注PHP中文網其他相關文章!