首頁  >  文章  >  資料庫  >  原因分析之redis快取延時雙刪

原因分析之redis快取延時雙刪

WBOY
WBOY轉載
2022-08-24 17:34:203106瀏覽

推薦學習:Redis影片教學

#快取為啥是刪除,而不是更新?

如果是更新,有分散式事務問題,可能出現修改了緩存,資料庫修改失敗的情況。只是刪除快取的話,就算資料庫修改失敗,下次查詢會直接取資料庫的數據,也不會出現髒數據。

延時雙刪是什麼?

就是在增刪改某實體類別的時候,要對該實體類別的快取進行清空,清空的位置在資料庫操作方法的前後。

採用反證法

只先刪除



原因分析之redis快取延時雙刪

只後刪除

原因分析之redis快取延時雙刪

結論

因此得出前刪和後刪都有問題。所以採用延時雙刪的策略

思考2:為啥是延時

依然是反證法。下圖這情況是雙刪依然存在舊快取的情況,延時是確保 修改資料庫-》清空快取前,其他交易的變更快取作業已經執行完。

原因分析之redis快取延時雙刪

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

##為什麼要延遲雙刪,來確保快取一致性

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

原因分析之redis快取延時雙刪

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

根據綜合考慮,即使先修改資料庫,在刪除緩存,有一定的時間會導致讀取到舊數據,這通常是可以被忍受的。

只要及時將快取刪除,其他執行緒就可以讀取到最新的值。

同時為了確保快取一定會被刪除,可以採用mq,來確保快取會被刪除

#如果在mq中訊息沒有重複消費,還會交由給其他消費者消費(將快取刪除)

推薦學習:

Redis影片教學

以上是原因分析之redis快取延時雙刪的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除