您好,登錄后才能下訂單哦!
怎么保證Redis和數據庫的一致性?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一般來說,只要你用到了緩存,不管是Redis還是memcache,就可能會涉及到數據庫緩存與數據的一致性問題,這里我們以Redis為例。
保證Redis與數據庫的一致性呢?
So easy:
更新的時候,先更新數據庫,然后再刪除緩存。
讀的時候,先讀緩存;如果沒有的話,就讀數據庫,同時將數據放入緩存,并返回響應。
乍一看,一致性問題貌似很好的得到了解決。但仔細一想,你會發現還是有問題:如果先更新了數據庫,刪除緩存的時候失敗了怎么辦?那么數據庫中是新數據,緩存中是老數據,數據出現不一致了。
改進方案:
先刪除緩存,后更新數據庫。因為即使后面更新數據庫失敗了,緩存是空的,讀的時候會從數據庫中重新拉,雖然都是舊數據,但數據是一致的。
所以方案就變成了:
更新的時候,先刪除緩存,然后再更新數據庫。
讀的時候,先讀緩存;如果沒有的話,就讀數據庫,同時將數據放入緩存,并返回響應。
到這里是不是問題就得到了徹底的解決了呢?
其實并沒有,在高并發的場景下,會出現這樣的情況:數據發生了變更,先刪除了緩存,然后去修改數據庫。此時還沒來得及修改,一個請求過來了,去讀緩存,發現緩存空了,去讀數據庫,讀到了準備修改前的舊數據,并且把舊數據放到了緩存。
隨后,數據變更程序完成了數據庫的修改。那么完了,這個時候發生數據不一致了......
解決方案:
針對這種情況,可以先把“修改DB”的操作放到一個JVM隊列,后面讀請求過來之后,“更新緩存”的操作也放進同一個JVM隊列,每個隊列,對于一個作業線程,按照隊列的順序,依次執行相關操作,這樣就可以保證“更新緩存”一定是在DB修改之后,以保證數據一致性,具體如下圖所示:
關于怎么保證Redis和數據庫的一致性問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。