大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 redis緩存怎么和數據庫同步到一致性呢

redis緩存怎么和數據庫同步到一致性呢

更新時間:2022-12-28 16:48:09 來源:動力節點 瀏覽1356次

首先我們先了解下緩存是什么?

緩存就是把低速存儲的結果,臨時保存在高速存儲的技術。

為什么使用redis進行緩存數據?

Redis嘛,就是一種運行速度很快,并發很強的跑在內存上的NoSql數據庫,支持鍵到五種數據類型的映射,(string、list、set、zset、hash),而memecache只能支持簡單的數據類型。另外redis可以完成一部份數據的持久化,而memecache完全將數據保存在內存中,不進行持久化,如果服務器出問題,數據將全部丟失,另外一個原因是redis底層實現優化比memecache好。另外采用了多路復用io阻塞機制,數據結構簡單,操作節省時間。

那常見的保證緩存與數據庫一致的方法有哪些呢?

想要保證緩存與數據庫的雙寫一致,一共有4種方式,即4種同步策略:

  • 先更新緩存,再更新數據庫;
  • 先更新數據庫,再更新緩存;
  • 先刪除緩存,再更新數據庫;
  • 先更新數據庫,再刪除緩存。

那么我們需要做的就是根據不同的場景來使用合理的方式來解決數據問題。

第一種:先刪除緩存,再更新數據庫

在出現失敗時可能出現的問題:

1:線程A刪除緩存成功,線程A更新數據庫失敗;

2 :線程B從緩存中讀取數據;由于緩存被刪,進程B無法從緩存中得到數據,進而從數據庫讀取數據;此時數據庫中的數據更新失敗,線程B從數據庫成功獲取舊的數據,然后將數據更新到了緩存。

最終,緩存和數據庫的數據是一致的,但仍然是舊的數據。

第二種:先更新數據庫,再刪除緩存

假設這會有兩個請求,一個請求A做查詢操作,一個請求B做更新操作,那么會有如下情形產生

(1)緩存剛好失效

(2)請求A查詢數據庫,得一個舊值

(3)請求B將新值寫入數據庫

(4)請求B刪除緩存

(5)請求A將查到的舊值寫入緩存

如果發生上述情況,確實是會發生臟數據。

然而,發生這種情況的概率又有多少呢?

發生上述情況有一個先天性條件,就是步驟(3)的寫數據庫操作比步驟(2)的讀數據庫操作耗時更短,才有可能使得步驟(4)先于步驟(5)。

數據庫的讀操作的速度遠快于寫操作的(不然做讀寫分離干嘛,做讀寫分離的意義就是因為讀操作比較快,耗資源少),因此步驟(3)耗時比步驟(2)更短,這一情形很難出現。

先更新數據庫,再刪緩存依然會有問題,不過,問題出現的可能性會因為上面說的原因,變得比較低。

第三種:給所有的緩存一個失效期

第三種方案可以說是一個大殺器,任何不一致,都可以靠失效期解決,失效期越短,數據一致性越高。但是失效期越短,查數據庫就會越頻繁。因此失效期應該根據業務來定。

1.并發不高的情況:

讀: 讀redis->沒有,讀mysql->把mysql數據寫回redis,有的話直接從redis中取;

寫: 寫mysql->成功,再寫redis;

2.并發高的情況:

讀: 讀redis->沒有,讀mysql->把mysql數據寫回redis,有的話直接從redis中取;

寫:異步話,先寫入redis的緩存,就直接返回;定期或特定動作將數據保存到mysql,可以做到多次更新,一次保存;

第四種:加鎖,使線程順序執行

如果一個服務部署到了多個機器,就變成了分布式鎖,或者是分布式隊列按順序去操作數據庫或者 Redis,帶來的副作用就是:數據庫本來是并發的,現在變成串行的了,加鎖或者排隊執行的方案降低了系統性能,所以這個方案看起來不太可行。

第五種:采用雙刪

先刪除緩存,再更新數據庫,當更新數據后休眠一段時間再刪除一次緩存。

方案推薦兩種:

1:項目整合quartz等定時任務框架,去實現延時3--5s再去執行最后一步任務 。(推薦使用)

2:創建線程池,線程池中拿一個線程,線程體中延時3-5s再去執行最后一步任務(不能忘了啟動線程)

第六種:異步更新緩存(基于訂閱binlog的同步機制)

MySQL binlog增量訂閱消費+消息隊列+增量數據更新到redis讀Redis

熱數據基本都在Redis寫MySQL:增刪改都是操作MySQL更新Redis數據:MySQ的數據操作binlog,來更新到Redis:

1)數據操作主要分為兩大塊:一個是全量(將全部數據一次寫入到redis)一個是增量(實時更新)。

這里說的是增量,指的是mysql的update、insert、delate變更數據。

2)讀取binlog后分析 ,利用消息隊列,推送更新各臺的redis緩存數據。

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

其實這種機制,很類似MySQL的主從備份機制,因為MySQL的主備也是通過binlog來實現的數據一致性。

這里可以結合使用canal(阿里的一款開源框架),通過該框架可以對MySQL的binlog進行訂閱,而canal正是模仿了mysql的slave數據庫的備份請求,使得Redis的數據更新達到了相同的效果。

當然,這里的消息推送工具你也可以采用別的第三方:kafka、rabbitMQ等來實現推送更新Redis。

以上就是動力節點小編介紹的"redis緩存怎么和數據庫同步到一致性呢",希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為您務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲欧美日韩成人一区在线 | 干美女网站 | 看真人视频一一级毛片 | 久久一区不卡中文字幕 | 狠狠色丁婷婷综合久久 | 91麻豆精品 | 精品伊人久久 | 高清国产一级毛片国语 | 亚洲精品国产成人 | 国产91久久精品 | 羞羞视频免费观看网站 | 高清色视频 | 国产亚洲欧美在线观看的 | 日韩男女视频 | 成人免费高清视频 | 久久精品国产亚洲黑森林 | 成年女人毛片 | 亚洲精品福利一区二区三区 | 精品中文字幕久久久久久 | 在线观看av片永久免费 | 亚洲人和日本人hd | 国内久久 | 久久999精品 | 国产精品伦理 | 337p欧美超大胆日本人术艺术 | 日韩做爰视频免费 | 亚洲国产最新 | 高清中文字幕视频在线播 | 在线日韩视频 | 欧美一级毛片在线一看 | 亚洲视频在线观看一区 | 久久澡| 一级毛片a免费播放王色 | 2020久久精品永久免费 | 国产成人99 | 国产高清视频在线免费观看 | 一级日本强免费 | 男人的天堂免费视频 | 97视频免费看 | 久久久久免费精品国产小说 | 久久国产一区二区 |