Redis中的延遲雙刪
什么是延遲雙刪?
做法:先刪除redis,再更新數(shù)據(jù)庫(kù),延遲N秒后再刪除一次redis。
延遲雙刪策略是分布式系統(tǒng)中數(shù)據(jù)庫(kù)存儲(chǔ)和緩存數(shù)據(jù)保持最終一致性的常用策略,但它不是強(qiáng)一致。
其實(shí)不管哪種方案,都避免不了Redis存在臟數(shù)據(jù)的問(wèn)題,只能減輕這個(gè)問(wèn)題,要想徹底解決,得要用到同步鎖和對(duì)應(yīng)的業(yè)務(wù)邏輯層面解決。
在更新數(shù)據(jù)庫(kù)數(shù)據(jù)時(shí),需要同步redis中緩存的數(shù)據(jù),存在兩種方法:
第一種方案
先更新數(shù)據(jù)庫(kù),再刪除redis。
存在的問(wèn)題:當(dāng)請(qǐng)求1執(zhí)行完更新數(shù)據(jù)庫(kù)操作后,還未來(lái)得及刪除redis,此時(shí)請(qǐng)求2查詢(xún)到并使用了redis中的舊數(shù)據(jù)。
第二種方案
先刪除redis,再更新數(shù)據(jù)庫(kù)。
存在的問(wèn)題:當(dāng)請(qǐng)求1執(zhí)行完刪除redis后,還未進(jìn)行更新數(shù)據(jù)庫(kù)操作,此時(shí)請(qǐng)求2查詢(xún)到了數(shù)據(jù)庫(kù)的舊數(shù)據(jù)并寫(xiě)入了redis。
所以需要先刪除redis,再更新數(shù)據(jù)庫(kù),延遲N秒后再刪除一次redis。
延時(shí)雙刪可能會(huì)導(dǎo)致的問(wèn)題?
在低并發(fā)的情況下,可以通過(guò)加鎖的方式來(lái)達(dá)成雙寫(xiě)一致性。
但是高并發(fā)的情況下,刪除緩存必然會(huì)造成緩存擊穿的問(wèn)題,其實(shí)緩存擊穿影響不大,因?yàn)槟芙鉀Q, 主要是延遲雙刪的第一次刪除可能沒(méi)什么意義。
因?yàn)樵诰彺娴谝淮蝿h除舊數(shù)據(jù)后,數(shù)據(jù)庫(kù)還沒(méi)有完成更新時(shí),請(qǐng)求到來(lái)時(shí)直接請(qǐng)求數(shù)據(jù)庫(kù),返回的還是舊數(shù)據(jù)并添加到了緩存中,相當(dāng)于又回到了緩存第一次刪除之前的狀態(tài),都是緩存的舊數(shù)據(jù)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于在Redis中使用Pipelining加速查詢(xún)的問(wèn)題
這篇文章主要介紹了在Redis中使用Pipelining加速查詢(xún),Redis是一個(gè)client-server模式的TCP服務(wù),也被稱(chēng)為Request/Response協(xié)議的實(shí)現(xiàn),本文通過(guò)一個(gè)例子給大家詳細(xì)介紹,感興趣的朋友一起看看吧2022-05-05
Redis過(guò)期事件監(jiān)聽(tīng)器的完整實(shí)現(xiàn)步驟
要使用 Redis 過(guò)期事件監(jiān)聽(tīng)器來(lái)更新數(shù)據(jù)庫(kù)狀態(tài),我們需要確保 Redis 的事件通知已啟用,并實(shí)現(xiàn)監(jiān)聽(tīng)器來(lái)捕獲過(guò)期的鍵,并根據(jù)需要更新數(shù)據(jù)庫(kù),本文給大家介紹了Redis過(guò)期事件監(jiān)聽(tīng)器的完整實(shí)現(xiàn)步驟,需要的朋友可以參考下2024-10-10
Redis的Python客戶(hù)端redis-py安裝使用說(shuō)明文檔
這篇文章主要介紹了Redis的Python客戶(hù)端redis-py安裝使用說(shuō)明文檔,本文講解了安裝方法、入門(mén)使用實(shí)例、API參考和詳細(xì)說(shuō)明,需要的朋友可以參考下2015-06-06
Redis的哈希Hash類(lèi)型常用命令的使用小結(jié)
Redis哈希類(lèi)型類(lèi)似于一個(gè)鍵值對(duì)集合,通常用于存儲(chǔ)對(duì)象,每個(gè)哈希包含多個(gè)字段,每個(gè)字段都有一個(gè)值,哈希類(lèi)型支持一系列常用命令,下面就來(lái)詳細(xì)的介紹一下這些命令的使用,感興趣的可以了解一下2025-08-08

