全球共有10多個(gè)國家和地區1000多個(gè)平臺,20萬(wàn)+商戶(hù)使用
Redis數據一致性
作者: 郭朝兵 發(fā)布時(shí)間: 2024-06-07 253 分類(lèi)專(zhuān)欄: 后端開(kāi)發(fā)
1、一致性
一致性是指系統中各節點(diǎn)數據保持一致。分布式系統中,可以理解為多個(gè)節點(diǎn)中的數據是一致的。
一致性根據嚴苛程度分類(lèi):
強一致性:寫(xiě)進(jìn)去的數據是什么,讀出來(lái)的數據就是什么,對性能影響最大;
弱一致性:數據寫(xiě)入成功后,系統不保證能立刻讀出最新的數據,也不承諾多久之后數據可以達到一致,但保證到某個(gè)時(shí)間級別后,數據能達到一致;
最終一致性:最終一致性是弱一致性的一個(gè)特例,最終一致性同樣只保證數據寫(xiě)入成功后,在某個(gè)時(shí)間點(diǎn)后數據會(huì )達到一致。這個(gè)系統無(wú)法保證強一致性的時(shí)間片段被稱(chēng)為不一致窗口。不一致時(shí)間窗口的時(shí)間長(cháng)短取決于很多因素,比如副本個(gè)數、網(wǎng)絡(luò )延遲、系統負載等。
最終一致性是弱一致性中非常受大眾推崇的一種一致性模型,也是目前業(yè)界在大型分布式系統的數據一致性上比較推崇的模型。
2、緩存使用場(chǎng)景
對于大部分系統而言,高并發(fā)常見(jiàn)于讀數據的場(chǎng)景,對于此場(chǎng)景我們可以使用緩存提升數據查詢(xún)速度。當我們使用Redis作緩存的時(shí)候,常見(jiàn)場(chǎng)景如下所示:
緩存存在
如果數據在緩存中存在,則直接從緩存返回數據至應用,無(wú)需查詢(xún)數據庫
緩存不存在
如果數據在緩存中不存在,則需查詢(xún)數據庫獲取數據并更新緩存。
對于大部分系統而言最終數據都會(huì )存儲在數據庫中,也就是系統需已數據庫中數據為準,那么對于上圖緩存存在的場(chǎng)景下,當數據庫中的數據發(fā)生變化時(shí),就可能會(huì )出現數據不一致的問(wèn)題。
實(shí)際情況下考慮網(wǎng)絡(luò )、操作、異常等種種因素,根本無(wú)法保證可以同時(shí)更新所有副本數據使得數據保持一致。因此,如何在最大程度上保證各副本數據一致的同時(shí)也不影響系統性能,成了各系統需要均衡的問(wèn)題。
3、數據同步策略
為保證緩存數據與數據庫數據一致,主要考慮如下兩種策略實(shí)現:
1、先刪除緩存,再更新數據庫;
2、先更新數據庫,再刪除緩存;
當然除了這兩種策略之外,還有其他策略如將刪除緩存改為更新緩存,但考慮高頻繁更新及熱冷數據場(chǎng)景下緩存使用效率問(wèn)題,個(gè)人不推薦更新緩存方式,所以此處不做展開(kāi)。
3.1 先刪除緩存,在更新數據庫
操作流程如圖
如上圖,若先刪除緩存,再更新數據庫,則可能存在如下問(wèn)題:
若步驟5、6、7順序發(fā)生在步驟3、4之前或步驟3更新失敗,則步驟8中線(xiàn)程B查詢(xún)出的數據為舊數據,導致重新寫(xiě)入緩存的也為舊數據。
失敗重試 + 延時(shí)雙刪
如圖中紅色部分所述,線(xiàn)程A在步驟4數據更新成功后,延遲一段時(shí)間,再次刪除緩存,這樣即可解決并發(fā)場(chǎng)景下線(xiàn)程B并發(fā)操作導致緩存與數據庫數據不一致問(wèn)題。延遲時(shí)間視實(shí)際業(yè)務(wù)場(chǎng)景對時(shí)間敏感度而定。
操作流程如圖
如上圖,若先更新數據庫,再刪除緩存,則可能存在如下問(wèn)題:
步驟5、6發(fā)生在步驟3之前或步驟3刪除緩存失敗,則線(xiàn)程B通過(guò)步驟5會(huì )拿到緩存數據,但此時(shí)獲取到的緩存數據仍為舊數據。
3.2.1 解決思路
訂閱binlog
數據庫的每一步操作均會(huì )寫(xiě)入binlog日志,可以通過(guò)監聽(tīng)binlog,實(shí)時(shí)感知數據變化情況,根據數據變化情況刪除redis并添加重試機制,直至redis刪除成功。
引入消息隊列
上圖步驟3中若Redis刪除失敗,則將Redis key放入消息隊列,消費端監聽(tīng)消息隊列并刪除Redis直至刪除成功;
4 總結
需要注意的是3.1.1 和 3.2.1中描述的解決方案也只能保證最終數據一致性,無(wú)法保證強一致性,如上述各場(chǎng)景中若線(xiàn)程A操作異常,在通過(guò)3.1.1 和 3.2.1的方式解決問(wèn)題之前,其他線(xiàn)程仍有可能獲取到臟數據。
原文鏈接:https://blog.csdn.net/sxg0205/article/details/127531279
郭朝兵
小當家ISV,重慶APP開(kāi)發(fā),小程序開(kāi)發(fā),軟件系統開(kāi)發(fā) 地址:重慶市南岸區南坪萬(wàn)達廣場(chǎng)寫(xiě)字樓2棟19-6 聯(lián)系電話(huà):023-81361879
ICP備案號:渝ICP備15003473-1 增值電信業(yè)務(wù)許可證: 渝B2-15003473 渝公網(wǎng)安備 50010802005103號
友情鏈接: APP定制開(kāi)發(fā) 小程序定制開(kāi)發(fā) MagicShop商城系統 酒類(lèi)行業(yè)解決方案
重慶小當家互聯(lián)網(wǎng)信息技術(shù)有限公司