上一篇說到快取的更新操作是非冪等操作,會出現并發更新的問題,那用快取洗掉操作實作快取更新行不行,您可能覺得奇怪,洗掉了快取如何更新,假設讀業務先讀取快取,如果發現沒有就回溯到讀資料庫找資料,然后再更新回快取,這種方式叫做懶加載,是在查詢到資料庫時,主動更新快取,就是說洗掉同樣能達到更新快取的目的,為什么要用洗掉,因為洗掉操作是沒狀態的,無論洗掉多少次,它的結果都是一樣的,所以是天然的冪等操作,現在問題轉移到,如何在資料更新或添加時保證快取清除干凈的問題, 洗掉是冪等操作,直接洗掉不就行了嗎,為什么還要保證快取清除干凈,因為懶加載的方式,也有快取更新操作,如果寫業務在更新資料庫前洗掉快取,還沒更新完資料,此時讀業務請求過來發現沒有快取,懶加載讀到舊資料更新快取,這樣快取里還是臟資料,既然不能在更新資料之前洗掉,那就在更新資料之后洗掉,但是在更新完資料庫后,洗掉快取失敗了,怎么辦,快取里仍然是舊資料,所以要在更新資料庫前后都洗掉快取,這個就是快取雙刪策略,
前一個洗掉為了減少后一個快取洗掉失敗的概率,后一個洗掉是防止讀業務懶加載讀到舊資料更新快取,但是如果后一個快取洗掉失敗怎樣處理,有兩種解決辦法,一是在更新快取時,給快取設定過期時間,失效了會重新懶加載,最壞情況是在超時間內資料不一致,但最侄訓是一致的,二是業務層重試,寫入訊息佇列,不斷重試洗掉操作,直到成功,
存在一種極端情況,在洗掉快取之后,更新資料庫之前,有一個讀業務獲取了資料庫舊資料,又在第二次快取洗掉之后更新了快取,這時快取也會出現臟資料,這種情況要延遲第二次快取洗掉,保障在臟資料寫入后洗掉,那怎樣延遲,延遲時間又不確定,如何做到萬無一失,答案是做不到的,但是可以通過訊息佇列異步洗掉,達到延遲洗掉的目的,降低臟資料寫入的概率,
用了快取雙刪策略,那資料庫前面沒了快取層,高并發訪問下頂不住,就必須處理快取穿透、擊穿、雪崩等問題,下篇文章將講講快取問題的相關處理方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/506131.html
標籤:其他
上一篇:快取與資料庫結合使用的痛點
