【Redis實戰】雙寫一致性問題和解決方案


 

一、讀寫過程

1、讀:
(1)先讀cache,如果數據命中則返回
(2)如果數據未命中則讀db
(3)將db中讀取出來的數據入緩存
在這里插入圖片描述
2、寫:
(1)先淘汰cache
(2)再寫db

二、數據不一致原因

  先操作緩存,在寫數據庫成功之前,如果有讀請求發生,可能導致舊數據入緩存,引發數據不一致。
  在分布式環境下,數據的讀寫都是並發的,上游有多個應用,通過一個服務的多個部署(為了保證可用性,一定是部署多份的),對同一個數據進行讀寫,在數據庫層面並發的讀寫並不能保證完成順序,也就是說后發出的讀請求很可能先完成(讀出臟數據)。
在這里插入圖片描述
上圖解析: 寫操作先執行1,刪除緩存,再執行2,更新db;而讀操作先執行3,讀取cache數據,未找到數據時執行4,查詢db。
問題所在: 寫操作2沒執行完時,讀操作4執行了,則讀到了臟數據到cache中,造成了cache和db的數據不一致問題。

三、解決方案

方案1:Redis設置key的過期時間。
方案2:采用延時雙刪策略。
(1)先淘汰緩存
(2)再寫數據庫(這兩步和原來一樣)
(3)休眠1秒,再次淘汰緩存
這么做,可以將1秒內所造成的緩存臟數據,再次刪除。(為何是1秒?需要評估自己的項目的讀數據業務邏輯的耗時。這么做的目的,就是確保讀請求結束,寫請求可以刪除讀請求造成的緩存臟數據。當然這種策略還要考慮redis和數據庫主從同步的耗時。)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM