Redis和Mysql資料庫資料一致性問題

2021-10-05 21:14:00 字數 1641 閱讀 5224

雙庫資料一致性問題產生的原因

redis與mysql雙庫的資料一致性問題為何會出現呢?

其實我們可以考慮這麼乙個業務場景:我們需要更新部分資料,我們首先更新資料庫資料,然後清除redis快取中的資料。但是資料庫更新操作成功了,然而redis清除快取出現異常了,這樣會導致出現這麼一種情況:資料庫中的資料已經更新為最新資料,但是redis快取中的資料依舊還是老資料,這時候就會出現redis與mysql雙庫的資料一致性問題

那如果先清掉快取中的舊資料,然後再寫入新資料到資料庫,最後更新快取不就可以了麼?這種方式可能出現一種問題:我們清除redis快取成功了,但是寫入還未將新資料寫入到資料庫之前有讀請求的發生,就會導致資料庫中的舊資料再次存入redis中,然後等到新資料寫入到資料庫後,一樣產生了。redis與mysql雙庫的資料一致性問題

解決方案

第一種:延時雙刪策略(先刪快取)

雙刪並不是同時刪除redis和資料庫,而是刪除兩次redis快取

所謂延時雙刪,就是先刪除快取,然後在資料庫寫請求後,延遲一段執行緒時間,再刪除一次快取,保證兩次刪除快取後的雙庫資料是一致性的,但是再第二次刪除快取之前,也就是延遲的這段時間,還是會有可能產生雙庫資料不一致的問題

偽**如下:

public void write(string key,object data)
設定快取過期時間

從理論上來說,給快取設定過期時間,是保證最終一致性的解決方案。所有的寫操作以資料庫為準,只要到達快取過期時間,則後面的讀請求自然會從資料庫中讀取新值然後回填快取

該方案的弊端

結合雙刪策略+快取超時設定,這樣最差的情況就是在超時時間內資料存在不一致,而且兩次刪除快取後,再去資料庫讀資料,寫入到redis快取也是增加了耗時

第二種方案:非同步更新快取(先寫資料庫)(基於訂閱binlog的同步機制)

技術整體思路:

mysql binlog增量訂閱消費+訊息佇列+增量資料更新到redis

1)讀redis:熱資料基本都在redis

2)寫mysql:增刪改都是操作mysql

3)更新redis資料:mysq的資料操作binlog,來更新到redis

redis更新

資料操作主要分為兩大塊:乙個是全量(將全部資料一次寫入到redis),乙個是增量(實時更新),這裡說的是增量,指的是mysql的update、insert、delate變更資料

讀取binlog後分析 ,利用訊息佇列,推送更新各台的redis快取資料

這樣一旦mysql中產生了新的寫入、更新、刪除等操作,就可以把binlog相關的訊息推送至redis,redis再根據binlog中的記錄,對redis進行更新

其實這種機制,很類似mysql的主從備份機制,因為mysql的主備也是通過binlog來實現的資料一致性

主要流程如下:

1.應用程式更新資料庫

2.通過canal(阿里的一款開源框架)訂閱資料庫的binlog

3.資料更新服務解析binlog

4.根據解析的binlog更新快取

5.對於更新失敗的,將失敗的key傳送到訊息佇列

6.快取服務訂閱訊息佇列,重試

Redis資料庫和MySQL資料庫的區別

redis是乙個記憶體資料庫,每次刪除或者其他操作,都需要進行flush操作 mysql資料庫在linux系統中,也是需要進行flush操作的。在hive中,需要將mysql的jar包匯入,然後要用高版本的jar包去替換低版本的jline包的。hive客戶端 主要配置以下檔案 1 將hive檔案包上...

redis快取和mysql資料庫同步

穿透 頻繁查詢乙個不存在的資料,由於快取不命中,每次都要查詢持久層。從而失去快取的意義。解決辦法 持久層查詢不到就快取空結果,查詢時先判斷快取中是否exists key 如果有直接返回空,沒有則查詢後返回,注意insert時需清除查詢的key,否則即便db中有值也查詢不到 當然也可以設定空快取的過期...

資料庫 如何保持Redis和MySQL資料一致

原文 redis在啟動之後,從資料庫載入資料。讀請求 不要求強一致性的讀請求,走redis,要求強一致性的直接從mysql讀取 寫請求 資料首先都寫到資料庫,之後更新redis 先寫redis再寫mysql,如果寫入失敗事務回滾會造成redis中存在髒資料 mysql處理實時性資料,例如金融資料 交...