溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何保持MySQL和Redis中的數(shù)據(jù)一致

發(fā)布時(shí)間:2021-09-13 18:09:56 來(lái)源:億速云 閱讀:172 作者:柒染 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章給大家介紹如何保持MySQLRedis中的數(shù)據(jù)一致,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

在高并發(fā)的業(yè)務(wù)場(chǎng)景下,MySQL和Redis的數(shù)據(jù)一致性就顯得很重要了,多次訪問MySQL就會(huì)導(dǎo)致奔潰或者延緩速度,而緩存Redis過多也會(huì)出問題,那就是丟數(shù)據(jù),存著存著,數(shù)據(jù)就丟了

Redis 在互聯(lián)網(wǎng)行業(yè)中使用最為廣泛。在很多時(shí)候也被稱為“內(nèi)存數(shù)據(jù)庫(kù)”,它集合了緩存和數(shù)據(jù)庫(kù)的優(yōu)勢(shì),但并非開啟持久化和主備同步機(jī)制就可以高枕無(wú)憂。

寫入數(shù)據(jù)庫(kù)成功,即讓緩存失效,下一次讀取時(shí)再緩存。這是緩存的實(shí)時(shí)策略。

從架構(gòu)設(shè)計(jì)的角度思考:緩存就是緩存,緩存數(shù)據(jù)會(huì)隨時(shí)丟失,緩存存在的目的是攔截到數(shù)據(jù)庫(kù)的請(qǐng)求,相比數(shù)據(jù)的可靠性、一致性,還是吞吐量、穩(wěn)定性優(yōu)先。

在考慮數(shù)據(jù)一致性的問題上由三種刷新策略

  1. 實(shí)時(shí)策略

  2. 異步策略

  3. 定時(shí)策略

實(shí)時(shí)策略是最常用的策略,能夠讓用戶有最好的體驗(yàn),但是一旦數(shù)據(jù)量過大就會(huì)出現(xiàn),數(shù)據(jù)苦往往會(huì)受不了

異步策略適用于,數(shù)據(jù)量大,但是數(shù)據(jù)并不重要,因?yàn)榭赡軙?huì)導(dǎo)致臟數(shù)據(jù)或者數(shù)據(jù)丟失

定時(shí)策略適用于,數(shù)據(jù)量大,數(shù)據(jù)也很重要的情況下,這也是最穩(wěn)定的方案

讀取的過程,應(yīng)用程序先從 cache 取數(shù)據(jù),沒有得到,則從數(shù)據(jù)庫(kù)中取數(shù)據(jù),成功后,放到緩存中。如果命中,應(yīng)用程序從 cache 中取數(shù)據(jù),取到后返回。

寫入的過程,把數(shù)據(jù)存到數(shù)據(jù)庫(kù)中,成功后,再刪除緩存,刪除后下次讀取的時(shí)候,會(huì)被寫入緩存。

從用戶體驗(yàn)的角度,應(yīng)該數(shù)據(jù)庫(kù)有了寫入,就馬上廢棄緩存,觸發(fā)一次數(shù)據(jù)庫(kù)的讀取,從而更新緩存。

然而,這和高并發(fā)就矛盾了——如果所有的都實(shí)時(shí)從數(shù)據(jù)庫(kù)里面讀取,高并發(fā)場(chǎng)景下,數(shù)據(jù)庫(kù)往往受不了。

在讀取寫入數(shù)據(jù)時(shí),適用定時(shí)策略一般不會(huì)出問題

  1. MySQL持久化數(shù)據(jù),Redis只讀數(shù)據(jù)

  2. MySQL和Redis處理不同的數(shù)據(jù)類型
    MySQL處理實(shí)時(shí)性數(shù)據(jù),Redis處理對(duì)實(shí)時(shí)性要求并不是很高的數(shù)據(jù)。在并發(fā)不高的情況下,讀取操作優(yōu)先讀取redis,不存在的話再去訪問MySQL,并把讀取到的數(shù)據(jù)寫回Redis中;寫入操作直接寫MySQL,然后后再寫入Redis。在并發(fā)高的情況下,讀取操作和上面一樣,寫入操作則使用異步寫入,先寫入Redis后直接返回,然后定時(shí)定期的寫入MySQL

而一旦涉及到更新數(shù)據(jù),就容易出現(xiàn)緩存和數(shù)據(jù)庫(kù)之間的數(shù)據(jù)一致性的問題,不管是先寫入數(shù)據(jù)庫(kù)再刪除緩存,還是先刪除緩存再寫入數(shù)據(jù)庫(kù),都有可能出現(xiàn)數(shù)據(jù)不一致的情況,例如:

  • 先寫入數(shù)據(jù)庫(kù),再刪除緩存前,線程宕機(jī)了,沒有刪除掉緩存,就會(huì)出現(xiàn)數(shù)據(jù)不一致的情況

  • 先刪除Redis,還沒來(lái)得及寫入數(shù)據(jù)庫(kù),另外一個(gè)線程就來(lái)讀取,發(fā)現(xiàn)緩存為空,這個(gè)時(shí)候就會(huì)跑去數(shù)據(jù)庫(kù)讀取數(shù)據(jù)寫入緩存,這個(gè)時(shí)候緩存中的數(shù)據(jù)就是臟數(shù)據(jù)

因?yàn)閷懭牒妥x取是并發(fā)的,沒有辦法保證順序,就會(huì)出現(xiàn)緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)是不一致的問題,這時(shí)候就可以使用

延時(shí)雙刪策略

在寫庫(kù)前后都進(jìn)行Redis.del(key)操作,并且設(shè)定合理地超時(shí)時(shí)間

  1. 先刪緩存

  2. 再寫數(shù)據(jù)庫(kù)

  3. 休眠一段時(shí)間

  4. 再刪緩存

設(shè)置緩存的過期時(shí)間

理論上來(lái)講,設(shè)置緩存過期時(shí)間,是保證最終一致性的解決方案。所有的寫入操作以數(shù)據(jù)庫(kù)為準(zhǔn),只要到達(dá)緩存過期時(shí)間,則后面的讀請(qǐng)求自然會(huì)從數(shù)據(jù)庫(kù)中讀取新值然后回填緩存

關(guān)于如何保持MySQL和Redis中的數(shù)據(jù)一致就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI