以下只是個人工作中的一點總結,如有問題歡迎指正。
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的緩存。