redis緩存延時雙刪的原因分析

緩存為啥是刪除,而不是更新?

如果是更新,存在分佈式事務問題,可能出現修改瞭緩存,數據庫修改失敗的情況。隻是刪除緩存的話,就算數據庫修改失敗,下次查詢會直接取數據庫的數據,也不會出現臟數據。

延時雙刪是什麼?

就是在增刪改某實體類的時候,要對該實體類的緩存進行清空,清空的位置在數據庫操作方法的前後。

采用反證法

隻先刪



在這裡插入圖片描述

隻後刪

在這裡插入圖片描述

結論

從而得出 前刪和後刪都有問題。所以采用延時雙刪的策略

思考2:為啥是延時

依然是反證法。下圖這情況是雙刪依然存在舊緩存的情況,延時是確保 修改數據庫-》清空緩存前,其他事務的更改緩存操作已經執行完。

在這裡插入圖片描述

補充:為什麼要延遲雙刪,來保證緩存一致性

為什麼要延遲雙刪,來保證緩存一致性

  • 在修改數據庫數據前,需要先刪除一次redis:此時是為瞭保證在數據庫數據修改和redis數據被刪除的間隔時間內,如有命中,保證此數據也不存在redis中。如果沒有這一次刪除,當數據庫數據已經被修改瞭,但是還是可以從redis中讀出舊數據,導致數據不一致。
  • 第二次刪除則是在修改數據庫數據後,此時需要再次刪除redis中對應數據一次,這一次是為瞭刪除 第一次redis刪除和數據庫數據修改之間,如果有請求,那麼舊數據又會重新緩存到redis中,然而數據在數據庫中在接下來就會被修改,如果沒有這一次刪除,redis中則會存在數據庫中舊的數據。
  • 那麼第二次為什麼需要在數據庫修改後延遲一定時間再刪除redis呢?
  • 為瞭等待之前的一次讀取數據庫,並等待其數據寫入到緩存,最後刪除這次臟數據,所以是一次數據從數據庫中發到服務器+緩存寫入的時間

延遲雙刪為什麼要延遲

但是延遲雙刪,所延遲的時間非常的難以確定,所以並不推薦延遲雙刪

根據綜合考慮,即使先修改數據庫,在刪除緩存,有一定的時間會導致讀取到舊數據,這通常是可以被忍受的。
隻要及時將緩存刪除,其他線程就可以讀取到最新的值。

同時為瞭保證緩存一定會被刪除,可以采用mq,來保證緩存會被刪除

如果在mq中消息沒有被重復消費,還會交由給其他消費者消費(將緩存刪除)

到此這篇關於redis緩存延時雙刪的原因分析的文章就介紹到這瞭,更多相關redis緩存延時雙刪內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: