這篇文章給大家介紹如何保持和中的數據一致,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
在高并發(fā)的業(yè)務(wù)場(chǎng)景下,MySQL和Redis的數據一致性就顯得很重要了,多次訪(fǎng)問(wèn)MySQL就會(huì )導致奔潰或者延緩速度,而緩存Redis過(guò)多也會(huì )出問(wèn)題,那就是丟數據,存著(zhù)存著(zhù),數據就丟了
Redis 在互聯(lián)網(wǎng)行業(yè)中使用最為廣泛。在很多時(shí)候也被稱(chēng)為“內存數據庫”,它集合了緩存和數據庫的優(yōu)勢,但并非開(kāi)啟持久化和主備同步機制就可以高枕無(wú)憂(yōu)。
寫(xiě)入數據庫成功,即讓緩存失效,下一次讀取時(shí)再緩存。這是緩存的實(shí)時(shí)策略。
從架構設計的角度思考:緩存就是緩存,緩存數據會(huì )隨時(shí)丟失,緩存存在的目的是攔截到數據庫的請求,相比數據的可靠性、一致性,還是吞吐量、穩定性?xún)?yōu)先。
在考慮數據一致性的問(wèn)題上由三種刷新策略
實(shí)時(shí)策略
異步策略
定時(shí)策略
實(shí)時(shí)策略是最常用的策略,能夠讓用戶(hù)有最好的體驗,但是一旦數據量過(guò)大就會(huì )出現,數據苦往往會(huì )受不了
異步策略適用于,數據量大,但是數據并不重要,因為可能會(huì )導致臟數據或者數據丟失
定時(shí)策略適用于,數據量大,數據也很重要的情況下,這也是最穩定的方案
讀取的過(guò)程,應用程序先從 cache 取數據,沒(méi)有得到,則從數據庫中取數據,成功后,放到緩存中。如果命中,應用程序從 cache 中取數據,取到后返回。
寫(xiě)入的過(guò)程,把數據存到數據庫中,成功后,再刪除緩存,刪除后下次讀取的時(shí)候,會(huì )被寫(xiě)入緩存。
從用戶(hù)體驗的角度,應該數據庫有了寫(xiě)入,就馬上廢棄緩存,觸發(fā)一次數據庫的讀取,從而更新緩存。
然而,這和高并發(fā)就矛盾了——如果所有的都實(shí)時(shí)從數據庫里面讀取,高并發(fā)場(chǎng)景下,數據庫往往受不了。
在讀取寫(xiě)入數據時(shí),適用定時(shí)策略一般不會(huì )出問(wèn)題
MySQL持久化數據,Redis只讀數據
MySQL和Redis處理不同的數據類(lèi)型
MySQL處理實(shí)時(shí)性數據,Redis處理對實(shí)時(shí)性要求并不是很高的數據。在并發(fā)不高的情況下,讀取操作優(yōu)先讀取redis,不存在的話(huà)再去訪(fǎng)問(wèn)MySQL,并把讀取到的數據寫(xiě)回Redis中;寫(xiě)入操作直接寫(xiě)MySQL,然后后再寫(xiě)入Redis。在并發(fā)高的情況下,讀取操作和上面一樣,寫(xiě)入操作則使用異步寫(xiě)入,先寫(xiě)入Redis后直接返回,然后定時(shí)定期的寫(xiě)入MySQL
而一旦涉及到更新數據,就容易出現緩存和數據庫之間的數據一致性的問(wèn)題,不管是先寫(xiě)入數據庫再刪除緩存,還是先刪除緩存再寫(xiě)入數據庫,都有可能出現數據不一致的情況,例如:
先寫(xiě)入數據庫,再刪除緩存前,線(xiàn)程宕機了,沒(méi)有刪除掉緩存,就會(huì )出現數據不一致的情況
先刪除Redis,還沒(méi)來(lái)得及寫(xiě)入數據庫,另外一個(gè)線(xiàn)程就來(lái)讀取,發(fā)現緩存為空,這個(gè)時(shí)候就會(huì )跑去數據庫讀取數據寫(xiě)入緩存,這個(gè)時(shí)候緩存中的數據就是臟數據
因為寫(xiě)入和讀取是并發(fā)的,沒(méi)有辦法保證順序,就會(huì )出現緩存和數據庫的數據是不一致的問(wèn)題,這時(shí)候就可以使用
延時(shí)雙刪策略
在寫(xiě)庫前后都進(jìn)行Redis.del(key)操作,并且設定合理地超時(shí)時(shí)間
先刪緩存
再寫(xiě)數據庫
休眠一段時(shí)間
再刪緩存
設置緩存的過(guò)期時(shí)間
理論上來(lái)講,設置緩存過(guò)期時(shí)間,是保證最終一致性的解決方案。所有的寫(xiě)入操作以數據庫為準,只要到達緩存過(guò)期時(shí)間,則后面的讀請求自然會(huì )從數據庫中讀取新值然后回填緩存
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站