亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

分布式的環境下, MySQL和Redis如何保持數據的一致性?

分布式的環境下, MySQL和Redis如何保持數據的一致性?

linux零基礎學習視頻 2018-03-05 09:27:25
一臺MySQL,一臺Redis,兩臺應用服務器,用戶的數據存儲持久化在MySQL中,緩存在Redis,有請求的時候從Redis中獲取緩存的用戶數據,有修改則同時修改MySQL和Redis中的數據?,F在問題是:1. 先保存到MySQL和先保存到Redis都面臨著一個保存成功而另外一個保存失敗的情況,這樣,如何保證MySQL與Redis中的數據同步?2. 兩臺應用服務器的并發訪問,如何保證數據的安全性?
查看完整描述

5 回答

?
mark_fork

TA貢獻11條經驗 獲得超10個贊

最初級的緩存不一致問題及解決方案:

樓主描述的方案,“先保存到MySQL和先保存到Redis都面臨著一個保存成功而另外一個保存失敗的情況”會導致 數據庫中數據 與 redis中數據不一致的問題。

解決辦法

采用 cache aside pattern 并發更新操作的時候可以先刪除緩存,然后更新數據庫。

此方案下的更新操作情況:

  1. 刪除緩存失敗,那么不會去執行update操作。

  2. 刪除緩存成功,update失敗,讀請求還是會將舊值寫回到redis中。

  3. 刪除緩存成功,update成功,讀請求會將新值寫回到redis中。

復雜情況的解決辦法:

一個update操作,在刪除緩存成功,但update操作未提交的情況下,讀請求會讀取數據庫中舊的值,至此緩存中是舊值,update后的數據庫是新值,這種情況就應該采用異步讀寫請求隊列去解決,簡單言之,update請求入隊列,讀請求入隊列,update操作未執行完之前,讀操作被阻塞,但是讀操作需要while循環 一段時間,因為一旦當前操作的讀請求之前還有一個讀請求在隊列中,很可能前一個讀請求已經將update后的新值已經讀取到redis當中了。

查看完整回答
2 反對 回復 2018-03-15
?
安卓入門學習視頻

TA貢獻3條經驗 獲得超3個贊

緩存只做失效 ?不做更新

查看完整回答
2 反對 回復 2018-03-05
?
慕斯卡4083827

TA貢獻1條經驗 獲得超1個贊

緩存只做失效,不做更新,支持

查看完整回答
1 反對 回復 2018-03-06
?
ajax入門學習視頻

TA貢獻5條經驗 獲得超0個贊

Redis只用作cache,寫請求只交給MySQL處理。否則你就要自己去解決一個分布式事務的問題,這個目前還沒有性價比高的解決方案。如果應用是write heavy的,請使用HBase和Cassandra

查看完整回答
反對 回復 2018-03-05
?
喵喵一只汪

TA貢獻7條經驗 獲得超1個贊

如果要“保證”數據的安全性,那么會帶來開銷的進一步提升,以至于使用redis帶來的性能優勢都會喪失。正確的做法是區分不同的業務,使得并不需要“保證”數據一致性的場合,可以使用redis優化。而敏感的場合依然使用mysql

查看完整回答
反對 回復 2018-03-05
  • 5 回答
  • 4 關注
  • 13838 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號