事務同時操作db和redis,在高併發等場景下,可能會遇到db和redis儲存資料不一致的問題,遇到這種問題應該怎麼解決?根據使用場景提供了幾種簡單處理方案:
在處理系統間資料的最終一致性,通常也是考慮使用mq非同步的處理方式,同時考慮異常重處理、告警等。詳細場景問題描述:乙個事務,同時操作db和redis,事務提交和redis操作不是同時的,不能保證資料庫資料和redis資料的強一致性,例如事務提交前,刪除了快取,然後有其他場景又查詢了redis快取,redis為空時,會從db載入,由於事務沒有提交,導致查詢出來的資料和事務提交後的資料不一致,導致快取和db不一致,在某些應用場景,會嚴重影響使用者體驗產生投訴,或者影響後續功能處理。
場景對應設計:會員資訊表、會員資訊快取(redis)
查詢會員資訊介面:使用者查詢會員資訊,會優先查詢會員資訊快取,如果查詢不到,呼叫db查詢會員資訊並且載入到redis中,如果查詢不到,預設給設定乙個空值標識到redis,防止高併發查詢透傳到資料庫,減輕資料庫壓力。更新會員資訊介面:更新會員資訊,刪除會員資訊redis快取。單系統redis延遲處理
時序圖:
**塊:
2、多活系統處理方案//延遲刪除快取的時間配置(毫秒),從zookeeper獲取
long delaymillis = 2000;
// 開始執行任務時間戳,計算單位:毫秒
long dotaskmillis = system.currenttimemillis();
// 還需要延遲的時間 = zookeeper配置的延遲時間 - 任務從建立到執行的時間差(原因:該任務可能在佇列中呆了一段時間, 這段時間也屬於延遲時間的範圍,需要減掉)
// createtaskmillis是任務建立時間
long delaymillis = delaymillis - (dotaskmillis - createtaskmillis);
try
// todo 刪除快取操作
} catch (interruptedexception e) catch (exception e)
事務中刪除當前機房快取後,把需要刪除的快取使用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清除快取出現異常了,這樣會導致出現這麼一種情況 資料庫中的資料...