記一次緩存一致性中延遲雙刪的使用場景
1、背景:
前邊寫了個這樣的業務需求:從算法服務那邊會不斷的發送過來一些預警的數據和預警恢復的數據,當有新預警數據過來時,會進行數據庫記錄和redis緩存,當有該預警的恢復過來時會將數據庫狀態修改并清除緩存,我的做法是使用了緩存雙刪的策略,即先刪緩存,再更新數據庫,再刪緩存。
但是此時還是出現了問題,就是頁面上某個使用我緩存的地方出現了顯示的不正確,經過查詢,發現數據庫里這條數據已經是恢復狀態,但是緩存里還是有預警,這就是數據庫和緩存不一致導致的問題,比較老生常談了。
2、方案:
經過排查,發現是我在進行第二次刪除緩存的時候,并沒有進行延遲,這就可能會出現問題,主要出問題的邏輯如下:
A線程在收到預警恢復的數據后,先刪除了緩存,此時B線程過來查詢,發現緩存中沒有數據,則查數據庫,但是還沒更新緩存,此時B線程的時間片用完,輪到A線程進行更新數據庫操作,A順利的更新了數據庫,然后A線程執行了第二次刪除緩存操作,但是緩存中其實還沒有數據,所以A其實刪除了個空,此時B線程繼續執行,B線程將數據庫中查到的舊值更新到了緩存中,這就導致緩存和數據庫不一致。
所以我再第二次刪除緩存處加了個線程sleep100ms,但是其實還是有問題,我應該讓線程sleep多長時間才合適呢?這個問題我并沒有深究,等有空了再詳細研究一下吧。

浙公網安備 33010602011771號