網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
緩存為啥是刪除,而不是更新?
如果是更新,存在分布式事務(wù)問(wèn)題,可能出現(xiàn)修改了緩存,數(shù)據(jù)庫(kù)修改失敗的情況。只是刪除緩存的話,就算數(shù)據(jù)庫(kù)修改失敗,下次查詢會(huì)直接取數(shù)據(jù)庫(kù)的數(shù)據(jù),也不會(huì)出現(xiàn)臟數(shù)據(jù)。
延時(shí)雙刪是什么?
就是在增刪改某實(shí)體類的時(shí)候,要對(duì)該實(shí)體類的緩存進(jìn)行清空,清空的位置在數(shù)據(jù)庫(kù)操作方法的前后。
采用反證法
只先刪
????
只后刪
結(jié)論
從而得出 前刪和后刪都有問(wèn)題。所以采用延時(shí)雙刪的策略
思考2:為啥是延時(shí)
依然是反證法。下圖這情況是雙刪依然存在舊緩存的情況,延時(shí)是確保 修改數(shù)據(jù)庫(kù)-》清空緩存前,其他事務(wù)的更改緩存操作已經(jīng)執(zhí)行完。
補(bǔ)充:為什么要延遲雙刪,來(lái)保證緩存一致性
為什么要延遲雙刪,來(lái)保證緩存一致性
- 在修改數(shù)據(jù)庫(kù)數(shù)據(jù)前,需要先刪除一次redis:此時(shí)是為了保證在數(shù)據(jù)庫(kù)數(shù)據(jù)修改和redis數(shù)據(jù)被刪除的間隔時(shí)間內(nèi),如有命中,保證此數(shù)據(jù)也不存在redis中。如果沒(méi)有這一次刪除,當(dāng)數(shù)據(jù)庫(kù)數(shù)據(jù)已經(jīng)被修改了,但是還是可以從redis中讀出舊數(shù)據(jù),導(dǎo)致數(shù)據(jù)不一致。
- 第二次刪除則是在修改數(shù)據(jù)庫(kù)數(shù)據(jù)后,此時(shí)需要再次刪除redis中對(duì)應(yīng)數(shù)據(jù)一次,這一次是為了刪除 第一次redis刪除和數(shù)據(jù)庫(kù)數(shù)據(jù)修改之間,如果有請(qǐng)求,那么舊數(shù)據(jù)又會(huì)重新緩存到redis中,然而數(shù)據(jù)在數(shù)據(jù)庫(kù)中在接下來(lái)就會(huì)被修改,如果沒(méi)有這一次刪除,redis中則會(huì)存在數(shù)據(jù)庫(kù)中舊的數(shù)據(jù)。
- 那么第二次為什么需要在數(shù)據(jù)庫(kù)修改后延遲一定時(shí)間再刪除redis呢?
- 為了等待之前的一次讀取數(shù)據(jù)庫(kù),并等待其數(shù)據(jù)寫入到緩存,最后刪除這次臟數(shù)據(jù),所以是一次數(shù)據(jù)從數(shù)據(jù)庫(kù)中發(fā)到服務(wù)器+緩存寫入的時(shí)間
但是延遲雙刪,所延遲的時(shí)間非常的難以確定,所以并不推薦延遲雙刪
根據(jù)綜合考慮,即使先修改數(shù)據(jù)庫(kù),在刪除緩存,有一定的時(shí)間會(huì)導(dǎo)致讀取到舊數(shù)據(jù),這通常是可以被忍受的。
只要及時(shí)將緩存刪除,其他線程就可以讀取到最新的值。
同時(shí)為了保證緩存一定會(huì)被刪除,可以采用mq,來(lái)保證緩存會(huì)被刪除
如果在mq中消息沒(méi)有被重復(fù)消費(fèi),還會(huì)交由給其他消費(fèi)者消費(fèi)(將緩存刪除)
原文鏈接:https://blog.csdn.net/huizhi2533/article/details/107021249
相關(guān)推薦
- 2023-05-22 Pytorch中TensorDataset,DataLoader的聯(lián)合使用方式_python
- 2023-05-29 Python?input輸入超時(shí)選擇默認(rèn)值自動(dòng)跳過(guò)問(wèn)題_python
- 2023-03-29 Python之sklearn數(shù)據(jù)預(yù)處理中fit(),transform()與fit_transfor
- 2022-06-21 Flutter實(shí)現(xiàn)單選,復(fù)選和開(kāi)關(guān)組件的示例代碼_Android
- 2022-10-15 C語(yǔ)言庫(kù)函數(shù)qsort的使用及模擬實(shí)現(xiàn)_C 語(yǔ)言
- 2022-11-07 go?分布式鎖簡(jiǎn)單實(shí)現(xiàn)實(shí)例詳解_Golang
- 2022-11-07 Docker搭建MySQ主從復(fù)制原理_docker
- 2022-05-20 docker內(nèi)的容器如何與宿主機(jī)共享IP的方法_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支