緩存使用總結


以下只是個人工作中的一點總結,如有問題歡迎指正。
1.delete操作時,先刪數據庫還是先刪緩存?

一般情況下應該先刪除數據庫。原因: 如果先刪緩存,在刪完緩存之後刪數據庫之前,另一個讀請求可能將數據庫裏的數據讀出並寫到緩存,造成緩存和數據庫不一致(數據庫裏的被刪除了,緩存裏還有一份)。如果沒有超時設置,數據庫中被刪除的數據在緩存中一直存在。

A先刪除數據,緊接着B獲取該條數據,可能發生的執行順序


A刪除緩存;

A刪除數據庫;

B讀數據庫(返回null);

B寫緩存(寫的也是空數據,防止緩存穿透);

如果按照以上的順序,是不會有問題的。但是如果是下面這種順序,就會出問題

A刪除緩存;

B讀數據庫;

B寫緩存;

A刪除數據庫;

當然,以上討論的是刪緩存和刪數據庫這兩步操作都能成功的前提下。下面簡單考慮刪除操作可能失敗的情況:

如果先刪數據庫成功後,刪緩存失敗了,會造成數據庫和緩存數據不一致(如果緩存設置有超時時間,會達到最終一致)。

如果是採用先刪緩存的方案,緩存刪除成功,但是數據庫刪除失敗,讀請求會將數據庫的數據重新寫緩存,不會有數據不一致的情況。

2.update操作時,應該刪除緩存還是更新緩存?應該先操作數據庫還是先操作緩存?

先給結論: 應該先操作數據庫,然後刪除緩存。

歸納一下,一共有四種可能的方案:

(1)、先刪除緩存,然後更新數據庫

緩存刪除後,更新數據庫前,數據庫的舊數據可能會被其他請求寫到緩存。

(2)、先更新數據庫,然後更新緩存

假如A進行更新操作,B緊接着對同一數據進行更新,最終結果應該以後一次操作爲準。然而可能發生的操作順序是

A更新數據庫;
B更新數據庫;
B更新緩存;
A更新緩存;

這時數據庫和緩存出現不一致,緩存的是A更新的數據(髒數據),數據庫中是B更新的數據。

(3)、先更新緩存,然後更新數據庫

如果緩存更新成功,數據庫更新失敗,會造成數據不一致。可能想到的解決方法之一就是在數據庫更新失敗時,刪掉更新的緩存,然而依然無法避免數據庫還未更新,更新的緩存就被其他請求讀取的問題,因此不考慮該方案。

(4)、先更新數據庫,然後刪除緩存

相對來說比較合適的方案。

綜合以上,刪除和更新時,應該首先操作數據庫,然後操作緩存。當然如果併發請求不大的情況下,操作順序的不同一般是不會出現問題的(併發量低還用緩存幹啥呢=。=

3. create操作時,應該操作緩存嗎

爲了防止緩存穿透,在讀數據庫裏不存在的數據時,也需要寫緩存。比如讀取id爲10的用戶信息,但是目前沒有該用戶,那麼緩存裏存一份key爲10,value爲空的數據。但是create操作後,id爲10的數據可能就有了,爲了保證數據一致性,在create操作成功後,刪除(或更新)對應key的緩存。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章