Redis雪崩、穿透與一致性問題解決方案

1 redis雪崩的解決方案

什么是緩存雪崩?

(1)Redis掛掉了,請求全部走數(shù)據(jù)庫。
(2)對緩存數(shù)據(jù)設置相同的過期時間,導致某段時間內緩存失效,請求全部走數(shù)據(jù)庫。

1.1 針對redis數(shù)據(jù)過期失效的策略

在緩存過期的短時間內存在數(shù)據(jù)庫短暫壓力問題,為解決該問題,可采用以下兩種解決方案:

第一種:在緩存的時候給過期時間加上一個隨機值,這樣就會大幅度的減少緩存在同一時間過期。
第二種:我們以兩個鍵值對的緩存代替之前的一個,將緩存時間(key-time),和緩存數(shù)據(jù)(key-data)分離,這樣當緩存過期時,第一個線程發(fā)現(xiàn)key-time沒有,則先更新key-time,然后去查詢數(shù)據(jù)庫(或任何比較耗時的數(shù)據(jù)查詢方式),并更新key-data的值,當后續(xù)線程來獲取數(shù)據(jù)時,雖然第一個還沒有從數(shù)據(jù)庫查完并更新緩存,但發(fā)現(xiàn)key-time存在,會獲取舊的數(shù)據(jù)。

雖然按這種方式獲取的數(shù)據(jù)中c類型的數(shù)據(jù)為舊數(shù)據(jù),但可以做到:在緩存過期時不至于在短時間內對數(shù)據(jù)庫造成較高壓力,在數(shù)據(jù)庫不可用,同時緩存過期的時候,其調用服務皆不可用,造成連鎖反應,而已該解決方式,則可以返回過期數(shù)據(jù),為修復數(shù)據(jù)庫贏得寶貴時間(緩解雪崩效應)

1.2 針對“Redis掛掉了,請求全部走數(shù)據(jù)庫”這種情況

我們可以有以下的思路:

事發(fā)前:實現(xiàn)redis的高可用,盡量避免redis掛掉這種情況的發(fā)生。
事發(fā)中:萬一redis真的掛了,可以設置本地緩存+限流,盡量避免數(shù)據(jù)庫被干掉,確保服務正常工作。
事發(fā)后:redis持久化,重啟后能夠快速恢復緩存數(shù)據(jù)。

2 緩存穿透的解決方案

什么是緩存穿透?就是請求的數(shù)據(jù)在緩存大量不命中,導致請求走數(shù)據(jù)庫。而緩存穿透如果發(fā)生了,也可能把我們的數(shù)據(jù)庫搞垮,導致整個服務癱瘓!

解決緩存穿透也有兩種方案:

(1)提前進行攔截過濾:由于請求的參數(shù)是不合法的(每次都請求不存在的參數(shù)),于是我們可以使用布隆過濾器(BloomFilter)或者壓縮filter提前攔截,不合法就不讓這個請求到數(shù)據(jù)庫層!
(2)設置空對象:當我們從數(shù)據(jù)庫找不到的時候,我們也將這個空對象設置到緩存里邊去。下次再請求的時候,就可以從緩存里邊獲取了。這種情況我們一般會將空對象設置一個較短的過期時間。

3 緩存和數(shù)據(jù)庫雙寫一致性問題

主要就是兩種策略:第一種:先刪除緩存,再更新數(shù)據(jù)庫;第二種:先更新數(shù)據(jù)庫,再刪除緩存。

第一種策略在并發(fā)的情況,也會出現(xiàn)不一致的情況,彌補策略,采用延時雙刪策略。如果第二次刪又失敗的話,又考慮性能的話,可采用異步重試的方式進行。
同樣,針對第二種策略,在并發(fā)的情況下,也會出現(xiàn)數(shù)據(jù)不一致的情況,同樣可以采取延遲雙刪的策略。如果第二次刪又失敗的話,又考慮性能的話,可采用異步重試的方式進行。

針對二刪和重試操作,對業(yè)務代碼會造成比較多的侵入,針對這種情況,可以啟動一個訂閱程序去訂閱數(shù)據(jù)庫的binlog,獲得需要操作的數(shù)據(jù)。在應用程序中,另起一段程序,獲得這個訂閱程序傳來的信息,進行刪除緩存操作。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容