redis緩存延時雙刪的原因分析
緩存為啥是刪除,而不是更新?
如果是更新,存在分布式事務問題,可能出現(xiàn)修改了緩存,數(shù)據(jù)庫修改失敗的情況。只是刪除緩存的話,就算數(shù)據(jù)庫修改失敗,下次查詢會直接取數(shù)據(jù)庫的數(shù)據(jù),也不會出現(xiàn)臟數(shù)據(jù)。
延時雙刪是什么?
就是在增刪改某實體類的時候,要對該實體類的緩存進行清空,清空的位置在數(shù)據(jù)庫操作方法的前后。
采用反證法
只先刪
????
只后刪
結論
從而得出 前刪和后刪都有問題。所以采用延時雙刪的策略
思考2:為啥是延時
依然是反證法。下圖這情況是雙刪依然存在舊緩存的情況,延時是確保 修改數(shù)據(jù)庫-》清空緩存前,其他事務的更改緩存操作已經執(zhí)行完。
補充:為什么要延遲雙刪,來保證緩存一致性
為什么要延遲雙刪,來保證緩存一致性
- 在修改數(shù)據(jù)庫數(shù)據(jù)前,需要先刪除一次redis:此時是為了保證在數(shù)據(jù)庫數(shù)據(jù)修改和redis數(shù)據(jù)被刪除的間隔時間內,如有命中,保證此數(shù)據(jù)也不存在redis中。如果沒有這一次刪除,當數(shù)據(jù)庫數(shù)據(jù)已經被修改了,但是還是可以從redis中讀出舊數(shù)據(jù),導致數(shù)據(jù)不一致。
- 第二次刪除則是在修改數(shù)據(jù)庫數(shù)據(jù)后,此時需要再次刪除redis中對應數(shù)據(jù)一次,這一次是為了刪除 第一次redis刪除和數(shù)據(jù)庫數(shù)據(jù)修改之間,如果有請求,那么舊數(shù)據(jù)又會重新緩存到redis中,然而數(shù)據(jù)在數(shù)據(jù)庫中在接下來就會被修改,如果沒有這一次刪除,redis中則會存在數(shù)據(jù)庫中舊的數(shù)據(jù)。
- 那么第二次為什么需要在數(shù)據(jù)庫修改后延遲一定時間再刪除redis呢?
- 為了等待之前的一次讀取數(shù)據(jù)庫,并等待其數(shù)據(jù)寫入到緩存,最后刪除這次臟數(shù)據(jù),所以是一次數(shù)據(jù)從數(shù)據(jù)庫中發(fā)到服務器+緩存寫入的時間
但是延遲雙刪,所延遲的時間非常的難以確定,所以并不推薦延遲雙刪
根據(jù)綜合考慮,即使先修改數(shù)據(jù)庫,在刪除緩存,有一定的時間會導致讀取到舊數(shù)據(jù),這通常是可以被忍受的。
只要及時將緩存刪除,其他線程就可以讀取到最新的值。
同時為了保證緩存一定會被刪除,可以采用mq,來保證緩存會被刪除
如果在mq中消息沒有被重復消費,還會交由給其他消費者消費(將緩存刪除)
到此這篇關于redis緩存延時雙刪的原因分析的文章就介紹到這了,更多相關redis緩存延時雙刪內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
redis-cli登錄遠程redis服務并批量導入數(shù)據(jù)
本文主要介紹了redis-cli登錄遠程redis服務并批量導入數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-10-10redis發(fā)布和訂閱_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了redis發(fā)布和訂閱的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08使用Spring?Boot實現(xiàn)Redis鍵過期回調功能示例詳解
這篇文章主要介紹了使用Spring?Boot實現(xiàn)Redis鍵過期回調功能,就是一個實現(xiàn)Redis鍵過期回調功能的Spring?Boot應用的示例,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題及解決
這篇文章主要介紹了redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07