更新資料時,可能會遇到分散式交易問題,導致快取更新成功但資料庫修改失敗。即使在資料庫修改失敗的情況下,僅刪除緩存,下次查詢仍會直接從資料庫取得數據,不會產生髒數據。
就是在增刪改某實體類別的時候,要對該實體類別的快取進行清空,清空的位置在資料庫操作方法的前後。
只先刪除
#只後刪除
確保 修改資料庫-》清空快取前,其他交易的變更快取作業已經執行完。
為什麼要延遲雙刪,來確保快取一致性
#########在修改資料庫資料前,需要先刪除一次redis:此時是為了確保在資料庫資料修改和redis資料被刪除的間隔時間內,如有命中,保證此資料也不存在redis中。如果沒有進行刪除操作,當資料庫資料已修改後,仍然可以從redis中讀取舊數據,這將導致資料不一致。 ############第二次刪除則是在修改資料庫資料後,此時需要再次刪除redis中對應資料一次,這次是為了刪除第一次redis刪除和資料庫資料修改之間,如果有請求,那麼舊資料又會重新快取到redis中,然而資料在資料庫中在接下來就會被修改,如果沒有這次刪除,redis中則會存在資料庫中舊的資料。 ############那麼第二次為什麼需要在資料庫修改後延遲一定時間再刪除redis呢? ############為了等待之前的一次讀取資料庫,並等待其資料寫入到緩存,最後刪除這次髒數據,所以是一次資料從資料庫中發送到伺服器快取寫入的時間#####################但是延遲雙刪,所延遲的時間非常的難以確定,所以不建議延遲雙刪#######根據綜合考慮,即使先修改資料庫,在刪除緩存,有一定的時間會導致讀取到舊數據,這通常是可以被忍受的。 ###只要及時將快取刪除,其他執行緒就可以讀取到最新的值。 ######同時為了確保快取一定會被刪除,可以採用mq,來保證快取會被刪除#######如果在mq中訊息沒有重複消費,還會交由給其他消費者消費(將快取刪除)###以上是redis快取延時雙刪指的是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!