資料庫事務和redis最終一致性的解決方法

2021-09-23 20:47:57 字數 1550 閱讀 8420

事務同時操作db和redis,在高併發等場景下,可能會遇到db和redis儲存資料不一致的問題,遇到這種問題應該怎麼解決?根據使用場景提供了幾種簡單處理方案:

在處理系統間資料的最終一致性,通常也是考慮使用mq非同步的處理方式,同時考慮異常重處理、告警等。

詳細場景問題描述:乙個事務,同時操作db和redis,事務提交和redis操作不是同時的,不能保證資料庫資料和redis資料的強一致性,例如事務提交前,刪除了快取,然後有其他場景又查詢了redis快取,redis為空時,會從db載入,由於事務沒有提交,導致查詢出來的資料和事務提交後的資料不一致,導致快取和db不一致,在某些應用場景,會嚴重影響使用者體驗產生投訴,或者影響後續功能處理。

場景對應設計:會員資訊表、會員資訊快取(redis)

查詢會員資訊介面:使用者查詢會員資訊,會優先查詢會員資訊快取,如果查詢不到,呼叫db查詢會員資訊並且載入到redis中,如果查詢不到,預設給設定乙個空值標識到redis,防止高併發查詢透傳到資料庫,減輕資料庫壓力。

更新會員資訊介面:更新會員資訊,刪除會員資訊redis快取。

單系統redis延遲處理

時序圖:

**塊:

//延遲刪除快取的時間配置(毫秒),從zookeeper獲取

long delaymillis = 2000;

// 開始執行任務時間戳,計算單位:毫秒

long dotaskmillis = system.currenttimemillis();

// 還需要延遲的時間 = zookeeper配置的延遲時間 - 任務從建立到執行的時間差(原因:該任務可能在佇列中呆了一段時間, 這段時間也屬於延遲時間的範圍,需要減掉)

// createtaskmillis是任務建立時間

long delaymillis = delaymillis - (dotaskmillis - createtaskmillis);

try

// todo 刪除快取操作

} catch (interruptedexception e) catch (exception e)

2、多活系統處理方案

事務中刪除當前機房快取後,把需要刪除的快取使用json的格式插入到待推送表,非同步job推送需要刪除的快取資訊到mq,各機房再監聽mq訊息,再刪除快取,保證資料庫和快取最終一致性

redis快取與資料庫一致性

實時同步 對強制性要求比較高的,應採用實時同步方案,先查詢快取若查詢不到再去db中查詢,然後儲存到快取 更新快取時,先更新資料庫,再將快取的設定過期 建議不要去更新快取內容,直接設定快取過期 1.cacheable 查詢時使用,注意long型別需要轉化為string型別,否則會拋棄異常 2.cach...

校驗redis存入資料和資料庫是否一致

需求 redis裡面存入了會員的身份資訊,其中key是根據會員id相關生成的,值是會員資訊。每次登陸會觸發key的值資訊更新,有的會員未重新登入,導致redis資訊和資料庫不一致 也不知道為什麼,當初更改資料庫資訊的時候,沒有更新redis 現需要查詢出哪些會員的redis資訊未及時更新。初步了解 ...

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

雙庫資料一致性問題產生的原因 redis與mysql雙庫的資料一致性問題為何會出現呢?其實我們可以考慮這麼乙個業務場景 我們需要更新部分資料,我們首先更新資料庫資料,然後清除redis快取中的資料。但是資料庫更新操作成功了,然而redis清除快取出現異常了,這樣會導致出現這麼一種情況 資料庫中的資料...