<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前言:
在資料讀多寫少的情況下作為快取來使用,恐怕是Redis使用最普遍的場景了。當使用Redis作為快取的時候,一般流程是這樣的。
Redis
中存在,即快取命中,則直接返回資料通常情況下,我們會為某個快取設定一個key值,並針對key值設定一個過期時間,如果被查詢的資料對應的key過期了,則直接查詢資料庫,並將查詢得到的資料存入Redis,然後重置過期時間,最後將資料返回,虛擬碼如下:
/** * 根據使用者名稱獲取使用者詳細資訊 * @author 公眾號【蟬沐風】 */ public User getUserInfo(String userName) { User user = redisCache.getName("user:" + userName); if (user != null) { return user; } // 從資料庫中直接搜尋 user = selectUserByUserName(userName); // 將資料寫入Redis,並設定過期時間 redisCache.set("user:" + userName, user, 30000); // 返回資料 return user; }
但是,在Redis的key值未過期的情況下,使用者修改了個人資訊,我們此時既要運算元據庫資料,也要操作Redis資料。現在我們面臨了兩種選擇:
Redis
的資料,再運算元據庫的資料Redis
的資料如論選擇哪種方法,最理想的情況下,兩個操作要麼同時成功,要麼同時失敗,否則就會出現Redis和資料庫資料不一致的情況。
遺憾的是,目前沒有什麼框架能夠保證Redis的資料和資料庫的資料的完全一致性。我們只能根據場景和所需要付出的程式碼來採取一定的措施降低資料不一致出現的概率,在一致性和效能之間取得一個折中。
下面我們來討論一下關於Redis和資料庫質檢資料一致性的一些方案。
當資料庫資料發生變化的時候,Redis的資料也需要進行相應的操作,那麼這個「操作」到底是用「更新」還是用「刪除」呢?
「更新」的話呼叫Redis
的set方法,新值替換舊值;「刪除」直接刪除原來的快取,下次查詢的時候重新讀取資料庫,然後再更新Redis。
結論:推薦直接使用「刪除」操作。
因為使用「更新」操作的話,你會面臨兩種選擇
第1種不用考慮了,下面討論一下「先更新資料庫,再更新快取」這種方案。
如果執行緒1和執行緒2同時進行更新操作,但是每個執行緒的執行順序如上圖所示,此時就會導致資料不一致,因此從這個角度上我們推薦直接使用刪除快取的方式。
此外,推薦使用「刪除快取」還有兩點原因。
明確這個問題之後,擺在我們面前的就只有兩個選擇了:
這種方式可能存在以下兩種異常情況
第2種情況應該怎麼辦呢?我們有兩種方式:失敗重試和非同步更新。
如果刪除快取失敗,我們可以捕獲這個異常,把需要刪除的 key 傳送到訊息佇列。自己建立一個消費者消費,嘗試再次刪除這個 key,直到刪除成功為止。
這種方式有個缺點,首先會對業務程式碼造成入侵,其次引入了訊息佇列,增加了系統的不確定性。
因為更新資料庫時會往 binlog
中寫入紀錄檔,所以我們可以啟動一個監聽 binlog變化的服務(比如使用阿里的 canal開源元件),然後在使用者端完成刪除 key 的操作。如果刪除失敗的話,再傳送到訊息佇列。
總結
總之,對於刪除快取失敗的情況,我們的做法是不斷地重試刪除操作,直到成功。無論是重試還是非同步刪除,都是最終一致性的思想。
這種方式可能存在以下兩種異常情況:
這時,Redis
中儲存的舊資料,資料庫的值是新資料,導致資料不一致。這時我們可以採用延時雙刪的策略,即更新資料庫資料之後,再刪除一次快取。
用虛擬碼錶示就是:
/** * 延時雙刪 * @author 公眾號【蟬沐風】 */ public void update(String key, Object data) { // 首先刪除快取 redisCache.delKey(key); // 更新資料庫 db.updateData(data); // 休眠一段時間,時間依據資料的讀取耗費的時間而定 Thread.sleep(500); // 再次刪除快取 redisCache.delKey(key); }
到此這篇關於MySQL和Redis的資料一致性問題的文章就介紹到這了,更多相關MySQL和Redis內容請搜尋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