<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
專案中有遇到這個問題,跟MySQL中的資料不一致,研究一番發現這裡面細節並不簡單,特此記錄一下。
嚴格意義上任何非原子操作都不可能保證一致性,除非用阻塞讀寫實現強一致性,所以快取架構我們追求的目標是最終一致性。
快取就是通過犧牲強一致性來提高效能的。
這是由CAP理論決定的。快取系統適用的場景就是非強一致性的場景,它屬於CAP中的AP。
以下3 種快取讀寫策略各有優劣,不存在最佳。
Cache-Aside Pattern,即旁路快取模式,它的提出是為了儘可能地解決快取與資料庫的資料不一致問題。
讀 :從快取讀取資料,讀到直接返回。如果讀取不到的話,從資料庫載入,寫入快取後,再返回響應。
寫:更新的時候,先更新資料庫,然後再刪除快取。
Read/Write Through Pattern 中伺服器端把 cache 視為主要資料儲存,從中讀取資料並將資料寫入其中。cache 服務負責將此資料讀取和寫入 DB,從而減輕了應用程式的職責。
因為我們經常使用的分散式快取 Redis 並沒有提供 cache 將資料寫入DB的功能,所以使用並不多。
寫:先查 cache,cache 中不存在,直接更新 DB。cache 中存在,則先更新 cache,然後 cache 服務自己更新 DB(同步更新 cache和DB)。
讀:從 cache 中讀取資料,讀取到就直接返回 。讀取不到的話,先從 DB 載入,寫入到 cache 後返回響應。
Write Behind Pattern 和 Read/Write Through Pattern 很相似,兩者都是由 cache 服務來負責 cache 和 DB 的讀寫。
但是,兩個又有很大的不同:Read/Write Through 是同步更新 cache 和 DB,而 Write Behind Caching 則是隻更新快取,不直接更新 DB,而是改為非同步批次的方式來更新 DB。
很明顯,這種方式對資料一致性帶來了更大的挑戰,比如cache資料可能還沒非同步更新DB的話,cache服務可能就掛掉了,反而會帶來更大的災難。
這種策略在我們平時開發過程中也非常非常少見,但是不代表它的應用場景少,比如訊息佇列中訊息的非同步寫入磁碟、MySQL 的 InnoDB Buffer Pool 機制都用到了這種策略。
Write Behind Pattern 下 DB 的寫效能非常高,非常適合一些資料經常變化又對資料一致性要求沒那麼高的場景,比如瀏覽量、點贊量。
旁路快取模式是我們平時中使用最多的。下面根據上面介紹的旁路快取模式,我們可以有以下幾個疑問。
為什麼寫操作是刪除快取,而不是更新快取
答:執行緒A先發起一個寫操作,第一步先更新資料庫。執行緒B再發起一個寫操作,第二步更新了資料庫,由於網路等原因,執行緒B先更新了快取,執行緒A更新快取。
這時候,快取儲存的是A的資料(老資料),資料庫儲存的是B的資料(新資料),資料不一致了,髒資料出現啦。如果是刪除快取取代更新快取則不會出現這個髒資料問題。
實際上要寫操作的時候更新快取也是可以的,不過我們需要加一個鎖/分散式鎖來保證更新cache的時候不存線上程安全問題。
在寫資料的過程中,為什麼要先更新DB在刪除快取
答:比如說請求1 是寫操作,要是先刪除快取A,請求2是讀操作,先讀快取A,發現快取被刪除了(被請求1刪除了),然後去讀資料庫,但是此時請求1還沒來得及把資料及時更新,那麼請求2讀的就是舊資料,並且請求2還會把讀到的舊資料放到快取中,造成了資料的不一致。
其實要先刪快取,再更新資料庫也是可以,如採用延時雙刪策略
休眠1秒,再次淘汰快取 這麼做,可以將1秒內所造成的快取髒資料,再次刪除。不一定是1秒,看你業務決定的,不過不推薦這種做法,因為在這1秒內可能發生因素很多,它的不確定性太大。
在寫資料的過程中,先更新DB,後刪除cache就沒有問題了麼?
答: 理論上來說還是可能會出現資料不一致性的問題,不過概率非常小。
假設這會有兩個請求,一個請求A做查詢操作,一個請求B做更新操作,那麼會有如下情形產生
(1)快取剛好失效
(2)請求A查詢資料庫,得一箇舊值
(3)請求B將新值寫入資料庫
(4)請求B刪除快取
(5)請求A將查到的舊值寫入快取 ok,如果發生上述情況,確實是會發生髒資料。
然而,發生這種情況的概率並不高
發生上述情況有一個先天性條件,就是步驟(3)的寫資料庫操作比步驟(2)的讀資料庫操作耗時更短,才有可能使得步驟(4)先於步驟(5)。
可是,仔細想想,資料庫的讀操作的速度遠快於寫操作的(不然做讀寫分離幹嘛,做讀寫分離的意義就是因為讀操作比較快,耗資源少),因此步驟(3)耗時比步驟(2)更短,這一情形很難出現。
還有其他造成不一致的原因麼?
答: 如果刪除快取過程中失敗了就會造成不一致問題
如何解決?
使用Canal去訂閱資料庫的binlog,獲得需要操作的資料。另起一個程式,獲得這個訂閱程式傳來的資訊,進行刪除快取操作。
缺陷1:首次請求資料一定不在 cache 的問題
解決辦法:可以將熱點資料提前放入cache 中。
缺陷2:寫操作比較頻繁的話導致cache中的資料會被頻繁被刪除,這樣會影響快取命中率 。
資料庫和快取資料強一致場景 :更新DB的時候同樣更新cache,不過我們需要加一個鎖/分散式鎖來保證更新cache的時候不存線上程安全問題。可以短暫地允許資料庫和快取資料不一致的場景 :更新DB的時候同樣更新cache,但是給快取加一個比較短的過期時間,這樣的話就可以保證即使資料不一致的話影響也比較小。
到此這篇關於淺談Redis跟MySQL的雙寫問題解決方案的文章就介紹到這了,更多相關Redis MySQL雙寫內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45