2017-09-06 57 views
1

我有人存儲庫的基本操作:添加,獲取,更新。我使用Redis cacheMongoDB Persist更新操作緩存並堅持不同步

當有更新的人要求:1。 我更新緩存(如果沒有鑰匙存在,它將被添加) 2.我更新蒙戈。

但是,如果密鑰存在於redis中但是更新redis會失敗呢? (數據將不在syc中)

我很高興知道這種情況的最佳做法是什麼?

感謝

回答

0

當您更新數據,最好的做法是,僅僅刪除Redis的鑰匙,然後更新MongoDB中的關鍵。它比redis和mongo之間的同步數據更新更高效,更安全,更簡單。同步更新應該使它們處於事務中,並且可能需要分配鎖,其具有很多成本並且使代碼難以編寫。如果您下次查詢同一個密鑰,它會從mongo獲取數據並將其存儲到redis中。所以你可以考慮這是一個緩存的緩存更新。

and 因爲在很多緩存方案中,數據查詢次數應該遠遠多於數據更新次數,所以懶惰更新會有很好的性能。而您使用緩存的目的只是爲了加快查詢速度,不應該更多地關注更新。另外,因爲您已經將更新更新到持久數據庫中,所以您不需要同時更新易失性緩存。只要刪除它。

更新您的評論:

,如果我們先刪除在Redis的鍵,然後更新mongdb數據,那麼你說的問題就可以避免。

(1)->delete from redis->(2)->update in mongo->(3) 

只要您的應用在點(1),(2)或(3)失敗,數據一致性就不會中斷。如果app(1)失敗,那麼數據也不會在mongo中更新。 如果第(2)點的app失敗,數據將不會在mongo中更新,因爲我們只是從redis中刪除密鑰,所以重新啓動時沒有數據衝突。 (3)也是。

您也可能想知道如果操作delete from redis失敗,該如何處理?如果是這樣,那麼你的redis服務器關閉了,你會遇到一個比數據同步更大的問題:去開始你的redis服務。

這將是另一個問題,當你重新使用redis服務時,是否應該將緩存數據恢復到redis?我的回答是否定的。如果你的redis打開持久化,它會爲你恢復它,如果你非常關心數據一致性問題,你應該刷新緩存數據庫。它將表明一個查詢鍵將被丟失的過程,我們可以稱其爲「冷啓動」,但冷啓動後,所有內容都會與之前一樣。

+0

在你的解決方案中,如果我沒有成功從redis刪除密鑰,我仍然在redis和mongo之間的數據不同步的情況下。 – maz

+0

很好的問題,當你收到更新請求時,你應該先刪除緩存中的密鑰,然後用mongodb更新數據。在這種情況下,如果你的應用程序在任何地方失敗了,它將保持它們之間的數據一致。對不起,不要指出這一點。 – GuangshengZuo

相關問題