這篇文章為大家帶來了關於Redis的相關知識,延時雙刪就是在增刪改某實體類別的時候,要對該實體類別的快取進行清空,清空的位置在資料庫操作方法的前後,以下主要介紹了redis快取為什麼要延時雙刪,希望對大家有幫助。
推薦學習:Redis影片教學
#快取為啥是刪除,而不是更新?
如果是更新,有分散式事務問題,可能出現修改了緩存,資料庫修改失敗的情況。只是刪除快取的話,就算資料庫修改失敗,下次查詢會直接取資料庫的數據,也不會出現髒數據。
延時雙刪是什麼?
就是在增刪改某實體類別的時候,要對該實體類別的快取進行清空,清空的位置在資料庫操作方法的前後。
採用反證法
只先刪除

只後刪除
結論
因此得出前刪和後刪都有問題。所以採用延時雙刪的策略
思考2:為啥是延時
依然是反證法。下圖這情況是雙刪依然存在舊快取的情況,延時是確保 修改資料庫-》清空快取前,其他交易的變更快取作業已經執行完。
補充:為什麼要延遲雙刪,來保證快取一致性
##為什麼要延遲雙刪,來確保快取一致性
在修改資料庫資料前,需要先刪除一次redis:此時是為了確保在資料庫資料修改和redis資料被刪除的間隔時間內,如有命中,保證此數據也不存在redis中。如果沒有這次刪除,當資料庫資料已經被修改了,但還是可以從redis中讀出舊數據,導致數據不一致。 - 第二次刪除則是在修改資料庫資料後,此時需要再次刪除redis中對應資料一次,這次是為了刪除第一次redis刪除和資料庫資料修改之間,如果有請求,那麼舊資料又會重新快取到redis中,然而資料在資料庫中接下來就會被修改,如果沒有這次刪除,redis中則會存在資料庫中舊的資料。
- 那麼第二次為什麼需要在資料庫修改後延遲一定時間再刪除redis呢?
- 為了等待之前的一次讀取資料庫,並等待其資料寫入到緩存,最後刪除這次髒數據,所以是一次資料從資料庫中發送到伺服器快取寫入的時間
-
但是延遲雙刪,所延遲的時間非常的難以確定,所以並不推薦延遲雙刪
根據綜合考慮,即使先修改資料庫,在刪除緩存,有一定的時間會導致讀取到舊數據,這通常是可以被忍受的。
只要及時將快取刪除,其他執行緒就可以讀取到最新的值。
同時為了確保快取一定會被刪除,可以採用mq,來確保快取會被刪除
#如果在mq中訊息沒有重複消費,還會交由給其他消費者消費(將快取刪除)
推薦學習:
Redis影片教學
以上是原因分析之redis快取延時雙刪的詳細內容。更多資訊請關注PHP中文網其他相關文章!