網站首頁 編程語言 正文
緩存為啥是刪除,而不是更新?
如果是更新,存在分布式事務問題,可能出現修改了緩存,數據庫修改失敗的情況。只是刪除緩存的話,就算數據庫修改失敗,下次查詢會直接取數據庫的數據,也不會出現臟數據。
延時雙刪是什么?
就是在增刪改某實體類的時候,要對該實體類的緩存進行清空,清空的位置在數據庫操作方法的前后。
采用反證法
只先刪
????
只后刪
結論
從而得出 前刪和后刪都有問題。所以采用延時雙刪的策略
思考2:為啥是延時
依然是反證法。下圖這情況是雙刪依然存在舊緩存的情況,延時是確保 修改數據庫-》清空緩存前,其他事務的更改緩存操作已經執行完。
補充:為什么要延遲雙刪,來保證緩存一致性
為什么要延遲雙刪,來保證緩存一致性
- 在修改數據庫數據前,需要先刪除一次redis:此時是為了保證在數據庫數據修改和redis數據被刪除的間隔時間內,如有命中,保證此數據也不存在redis中。如果沒有這一次刪除,當數據庫數據已經被修改了,但是還是可以從redis中讀出舊數據,導致數據不一致。
- 第二次刪除則是在修改數據庫數據后,此時需要再次刪除redis中對應數據一次,這一次是為了刪除 第一次redis刪除和數據庫數據修改之間,如果有請求,那么舊數據又會重新緩存到redis中,然而數據在數據庫中在接下來就會被修改,如果沒有這一次刪除,redis中則會存在數據庫中舊的數據。
- 那么第二次為什么需要在數據庫修改后延遲一定時間再刪除redis呢?
- 為了等待之前的一次讀取數據庫,并等待其數據寫入到緩存,最后刪除這次臟數據,所以是一次數據從數據庫中發到服務器+緩存寫入的時間
但是延遲雙刪,所延遲的時間非常的難以確定,所以并不推薦延遲雙刪
根據綜合考慮,即使先修改數據庫,在刪除緩存,有一定的時間會導致讀取到舊數據,這通常是可以被忍受的。
只要及時將緩存刪除,其他線程就可以讀取到最新的值。
同時為了保證緩存一定會被刪除,可以采用mq,來保證緩存會被刪除
如果在mq中消息沒有被重復消費,還會交由給其他消費者消費(將緩存刪除)
原文鏈接:https://blog.csdn.net/huizhi2533/article/details/107021249
相關推薦
- 2023-03-01 React?Ref?Callback使用場景最佳實踐詳解_React
- 2022-09-10 Python入門之模塊和包用法詳解_python
- 2022-05-31 Python中的列表及其操作方法_python
- 2022-05-27 C++左值與右值,右值引用,移動語義與完美轉發詳解_C 語言
- 2022-05-25 C#多線程實現異步接口_C#教程
- 2022-07-25 Oracle表分區詳解_oracle
- 2022-05-14 shell腳本如何讀取properties文件中的值_linux shell
- 2022-12-04 Jetpack之CameraX的使用_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支