這篇文章給大家介紹如何保持MySQL和Redis中的數(shù)據(jù)一致,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
為羅平等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及羅平網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、羅平網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!在高并發(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ù)一致性的問題上由三種刷新策略
實(shí)時(shí)策略
異步策略
定時(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ì)出問題
MySQL持久化數(shù)據(jù),Redis只讀數(shù)據(jù)
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í)間
先刪緩存
再寫數(shù)據(jù)庫(kù)
休眠一段時(shí)間
再刪緩存
設(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ò),可以把它分享出去讓更多的人看到。
網(wǎng)頁(yè)標(biāo)題:如何保持MySQL和Redis中的數(shù)據(jù)一致-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://aaarwkj.com/article22/cogocc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、建站公司、移動(dòng)網(wǎng)站建設(shè)、軟件開發(fā)、網(wǎng)站設(shè)計(jì)公司、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)