關(guān)于Redis的讀寫(xiě)一致問(wèn)題
一、普通刪除
在數(shù)據(jù)更新過(guò)程中,大家無(wú)非使用兩種方法進(jìn)行緩存和數(shù)據(jù)庫(kù)的更新
- 先刪除緩存,再更新數(shù)據(jù)庫(kù)
- 先更新數(shù)據(jù)庫(kù),再更新緩存
那這兩種方法究竟有什么不同呢?
1. 先刪除緩存

問(wèn)題:此時(shí)緩存有了舊數(shù)據(jù),在下次修改此數(shù)據(jù)之前,所有請(qǐng)求獲取的都是舊數(shù)據(jù),導(dǎo)致讀寫(xiě)不一致
2. 后刪除緩存

問(wèn)題1:在小明修改數(shù)據(jù)庫(kù)到刪除緩存這段時(shí)間,所有請(qǐng)求都是舊數(shù)據(jù)
問(wèn)題2:如果緩存刪除失敗,后續(xù)所有請(qǐng)求都是舊數(shù)據(jù)(這個(gè)問(wèn)題開(kāi)啟事務(wù)的話,就可以解決)
二、雙刪策略
在普通刪除策略中,大家會(huì)發(fā)現(xiàn)后刪緩存策略是比較好的一種,但還是存在一點(diǎn)問(wèn)題,所以提出了雙刪策略
關(guān)于這個(gè)地方我是存在疑問(wèn)的,因?yàn)槲艺J(rèn)為雙刪并不會(huì)比后刪緩存策略更好,反而增加了一次數(shù)據(jù)庫(kù)查詢的操作。但有的博客卻提了這個(gè)策略,我就在這里提一下,大家可以在評(píng)論進(jìn)行交流
1. 普通雙刪

問(wèn)題:因?yàn)榫€程調(diào)度一些問(wèn)題導(dǎo)致查詢后寫(xiě)入緩存停止,會(huì)導(dǎo)致舊緩存依舊存在
2. 延遲雙刪

這樣的話看似把普通雙刪的問(wèn)題給解決了,但并沒(méi)有完全解決,反而引發(fā)新的問(wèn)題。
問(wèn)題:延時(shí)時(shí)長(zhǎng)問(wèn)題,時(shí)間太長(zhǎng)導(dǎo)致性能下降,時(shí)間太短又會(huì)跟普通雙刪一樣
三、讀寫(xiě)鎖
讀寫(xiě)鎖根據(jù)字面意思就知道是加鎖,因此效率肯定比不加鎖效率低,但是可以完全避免舊數(shù)據(jù)讀取的發(fā)生。
- 讀寫(xiě)鎖是讀讀共享,讀寫(xiě)和寫(xiě)寫(xiě)互斥的

四、異步通知
1. 消息中間件異步通知

- 對(duì)于這個(gè)博主認(rèn)為是把延遲雙刪的延遲給優(yōu)化了,不再占用本線程的時(shí)間,只不過(guò)部分請(qǐng)求會(huì)導(dǎo)致舊數(shù)據(jù)。
2.Canal
Canal是一個(gè)開(kāi)源的數(shù)據(jù)庫(kù)數(shù)據(jù)增量訂閱和消費(fèi)組件,用于實(shí)時(shí)捕獲數(shù)據(jù)庫(kù)的變更并將其傳遞給其他系統(tǒng)。具體而言,Canal主要用于解決數(shù)據(jù)庫(kù)之間的數(shù)據(jù)同步和實(shí)時(shí)數(shù)據(jù)分析需求。 Canal支持對(duì)MySQL、Oracle等主流數(shù)據(jù)庫(kù)進(jìn)行增量數(shù)據(jù)訂閱和消費(fèi)。它通過(guò)解析數(shù)據(jù)庫(kù)的日志(如MySQL的binlog或Oracle的redo log),實(shí)時(shí)捕獲數(shù)據(jù)庫(kù)的變更操作,然后將變更數(shù)據(jù)以事件的形式發(fā)送給訂閱者??梢詫⑦@些變更數(shù)據(jù)用于數(shù)據(jù)同步、實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù)、搜索引擎索引更新、緩存更新等應(yīng)用場(chǎng)景。 Canal的主要特性包括:
- .數(shù)據(jù)庫(kù)無(wú)侵入:Canal通過(guò)解析數(shù)據(jù)庫(kù)日志來(lái)捕獲數(shù)據(jù)變更,不需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行任何修改,不會(huì)對(duì)數(shù)據(jù)庫(kù)的性能產(chǎn)生影響。
- 實(shí)時(shí)的增量數(shù)據(jù):Canal能夠幾乎實(shí)時(shí)地捕獲到數(shù)據(jù)庫(kù)的變更操作,并以事件的形式進(jìn)行傳遞,保證了數(shù)據(jù)的實(shí)時(shí)性。
- 靈活的訂閱和過(guò)濾:Canal支持基于數(shù)據(jù)庫(kù)、表、列級(jí)別的訂閱和過(guò)濾,可以按需選擇需要同步的數(shù)據(jù),減少數(shù)據(jù)傳輸和處理的壓力。
- 多種協(xié)議支持:Canal支持多種數(shù)據(jù)傳輸協(xié)議,如基于TCP的簡(jiǎn)單文本協(xié)議、Kafka、RocketMQ等,可以根據(jù)具體需求選擇適合的協(xié)議進(jìn)行數(shù)據(jù)傳輸。
- 高可用和容錯(cuò):Canal支持多節(jié)點(diǎn)部署,通過(guò)主備模式或者集群模式來(lái)保證高可用性和容錯(cuò)性。
五. 總結(jié)
總體來(lái)說(shuō)這幾種方式各有優(yōu)缺點(diǎn),不過(guò)現(xiàn)在主要用的就是普通刪除中的后刪緩存的方法,如果一致性要求比較高的話,可以用讀寫(xiě)鎖的方式,如果沒(méi)有那么強(qiáng)的一致性要求,可以使用后刪緩存或者異步通知的方式。
結(jié)語(yǔ)
每個(gè)人都有自己獨(dú)特的才華和潛能,在這個(gè)廣袤的世界上,你的存在是有意義的。無(wú)論你是誰(shuí),你的背景如何,你所處的環(huán)境怎樣,只要你敢于跨出舒適區(qū),付出努力,追求卓越,你就能夠開(kāi)創(chuàng)屬于自己的輝煌。
以上就是關(guān)于Redis的讀寫(xiě)一致問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于Redis讀寫(xiě)一致的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Redis服務(wù)器的啟動(dòng)過(guò)程分析
這篇文章主要介紹了Redis服務(wù)器的啟動(dòng)過(guò)程分析,本文講解了初始化Redis服務(wù)器全局配置、加載配置文件、初始化服務(wù)器、加載數(shù)據(jù)、開(kāi)始網(wǎng)絡(luò)監(jiān)聽(tīng)等內(nèi)容,需要的朋友可以參考下2015-04-04
Redis?中使用?list,streams,pub/sub?幾種方式實(shí)現(xiàn)消息隊(duì)列的問(wèn)題
這篇文章主要介紹了Redis?中使用?list,streams,pub/sub?幾種方式實(shí)現(xiàn)消息隊(duì)列,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
redis分布式設(shè)計(jì)的實(shí)現(xiàn)示例
Redis 的分布式設(shè)計(jì)主要通過(guò)三種模式實(shí)現(xiàn),每種模式解決不同的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-05-05
詳解如何利用Redis實(shí)現(xiàn)生成唯一ID
隨著下單流量逐漸上升,為了降低數(shù)據(jù)庫(kù)的訪問(wèn)壓力,需要通過(guò)請(qǐng)求唯一ID+redis分布式鎖來(lái)防止接口重復(fù)提交。今天我們就一起來(lái)看探討一下,如何通過(guò)服務(wù)端來(lái)完成請(qǐng)求唯一?ID?的生成2022-11-11
通過(guò)Redisson監(jiān)聽(tīng)Redis集群的Key過(guò)期事件的實(shí)現(xiàn)指南
在分布式系統(tǒng)中,監(jiān)聽(tīng) Redis 鍵過(guò)期事件是實(shí)現(xiàn)緩存失效、訂單超時(shí)取消等功能的常用方案,本文將詳細(xì)介紹如何通過(guò) Redisson 高效監(jiān)聽(tīng) Redis 集群的 Key 過(guò)期事件,需要的朋友可以參考下2025-11-11
Redis中key過(guò)期策略的實(shí)現(xiàn)
Key的過(guò)期機(jī)制是Redis保持高可用性的重要策略,過(guò)期策略分為惰性過(guò)期和定期過(guò)期,惰性過(guò)期在每次訪問(wèn)key時(shí)檢查是否過(guò)期,定期過(guò)期則由serverCron方法定時(shí)清理過(guò)期key,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-09-09
利用Redis實(shí)現(xiàn)點(diǎn)贊功能的示例代碼
點(diǎn)贊對(duì)我們來(lái)說(shuō)并不陌生,我們經(jīng)常會(huì)在手機(jī)軟件或者網(wǎng)頁(yè)中看到它。今天就讓我們來(lái)了解一下如何用Redis實(shí)現(xiàn)這一功能吧,感興趣的可以嘗試一下2022-06-06

