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查詢到并使用了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查詢到了數(shù)據(jù)庫(kù)的舊數(shù)據(jù)并寫入了redis。
所以需要先刪除redis,再更新數(shù)據(jù)庫(kù),延遲N秒后再刪除一次redis。
延時(shí)雙刪可能會(huì)導(dǎo)致的問(wèn)題?
在低并發(fā)的情況下,可以通過(guò)加鎖的方式來(lái)達(dá)成雙寫一致性。
但是高并發(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)文章
Redis創(chuàng)建集群can‘t connect to node錯(cuò)誤的解決方案
在創(chuàng)建Redis集群時(shí)遇到問(wèn)題,嘗試了多種方法,最終通過(guò)取消bind配置、關(guān)閉保護(hù)模式、設(shè)置密碼并修改client.rb文件中的密碼參數(shù),成功創(chuàng)建了一個(gè)包含6個(gè)節(jié)點(diǎn)的Redis集群2025-11-11
高并發(fā)場(chǎng)景分析之redis+lua防重校驗(yàn)
這篇文章主要介紹了高并發(fā)場(chǎng)景分析之redis+lua防重校驗(yàn),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Redis中的動(dòng)態(tài)字符串學(xué)習(xí)教程
這篇文章主要介紹了Redis中的動(dòng)態(tài)字符串學(xué)習(xí)教程,以sds模塊的使用為主進(jìn)行講解,需要的朋友可以參考下2015-08-08
Redis KEYS查詢大批量數(shù)據(jù)替代方案
在使用 Redis 時(shí),KEYS 命令雖然簡(jiǎn)單直接,但其全表掃描的特性在處理大規(guī)模數(shù)據(jù)時(shí)會(huì)導(dǎo)致性能問(wèn)題,甚至可能阻塞 Redis 服務(wù),本文將介紹SCAN命令、有序集合、哈希表和RediSearch模塊四種替代 KEYS 的高效方案,需要的朋友可以參考下2024-12-12

