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