這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)redis和MySQL怎么保持數(shù)據(jù)統(tǒng)一,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)服務(wù)項目包括峨眉山網(wǎng)站建設(shè)、峨眉山網(wǎng)站制作、峨眉山網(wǎng)頁制作以及峨眉山網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,峨眉山網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到峨眉山省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1.第一種方案:采用延時雙刪策略
在寫庫前后都進行redis.del(key)操作,并且設(shè)定合理的超時時間。
偽代碼如下:
public void write(String key,Object data){ redis.delKey(key); db.updateData(data); Thread.sleep(500); redis.delKey(key); }
2.具體的步驟就是:
1)先刪除緩存
2)再寫數(shù)據(jù)庫
3)休眠500毫秒
4)再次刪除緩存
那么,這個500毫秒怎么確定的,具體該休眠多久呢?
需要評估自己的項目的讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時。這么做的目的,就是確保讀請求結(jié)束,寫請求可以刪除讀請求造成的緩存臟數(shù)據(jù)。
當然這種策略還要考慮redis和數(shù)據(jù)庫主從同步的耗時。最后的的寫數(shù)據(jù)的休眠時間:則在讀數(shù)據(jù)業(yè)務(wù)邏輯的耗時基礎(chǔ)上,加幾百ms即可。比如:休眠1秒。
3.設(shè)置緩存過期時間
從理論上來說,給緩存設(shè)置過期時間,是保證最終一致性的解決方案。所有的寫操作以數(shù)據(jù)庫為準,只要到達緩存過期時間,則后面的讀請求自然會從數(shù)據(jù)庫中讀取新值然后回填緩存。
4.該方案的弊端
結(jié)合雙刪策略+緩存超時設(shè)置,這樣最差的情況就是在超時時間內(nèi)數(shù)據(jù)存在不一致,而且又增加了寫請求的耗時。
2、第二種方案:異步更新緩存(基于訂閱binlog的同步機制)
1.技術(shù)整體思路:
MySQL binlog增量訂閱消費+消息隊列+增量數(shù)據(jù)更新到redis
1)讀Redis:熱數(shù)據(jù)基本都在Redis
2)寫MySQL:增刪改都是操作MySQL
3)更新Redis數(shù)據(jù):MySQ的數(shù)據(jù)操作binlog,來更新到Redis
2.Redis更新
1)數(shù)據(jù)操作主要分為兩大塊:
一個是全量(將全部數(shù)據(jù)一次寫入到redis)
一個是增量(實時更新)
這里說的是增量,指的是mysql的update、insert、delate變更數(shù)據(jù)。
2)讀取binlog后分析 ,利用消息隊列,推送更新各臺的redis緩存數(shù)據(jù)。
這樣一旦MySQL中產(chǎn)生了新的寫入、更新、刪除等操作,就可以把binlog相關(guān)的消息推送至Redis,Redis再根據(jù)binlog中的記錄,對Redis進行更新。
其實這種機制,很類似MySQL的主從備份機制,因為MySQL的主備也是通過binlog來實現(xiàn)的數(shù)據(jù)一致性。
這里可以結(jié)合使用canal(阿里的一款開源框架),通過該框架可以對MySQL的binlog進行訂閱,而canal正是模仿了mysql的slave數(shù)據(jù)庫的備份請求,使得Redis的數(shù)據(jù)更新達到了相同的效果。
上述就是小編為大家分享的Redis和MySQL怎么保持數(shù)據(jù)統(tǒng)一了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。