<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【另類見解】那些要保證緩存和數(shù)據(jù)庫數(shù)據(jù)一致性的最后怎么了?

          共 2159字,需瀏覽 5分鐘

           ·

          2021-10-21 03:09

          ????關(guān)注后回復(fù) “進(jìn)群” ,拉你進(jìn)程序員交流群????


          作者丨老T

          來源丨技術(shù)之上


          現(xiàn)在如果說不出幾句如何保證數(shù)據(jù)一致性方案的話,覺得出去面試都丟人,尤其是緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性

          全程無圖,請謹(jǐn)慎閱讀

          緩存對于程序性能而言,無疑是個(gè)殺手锏,但不是完美的解決方案。關(guān)鍵在于緩存的物理位置和數(shù)據(jù)真實(shí)保存的位置是分離的,當(dāng)然這里指的是分布式緩存方案。位于不同物理位置的兩份數(shù)據(jù)要想保證強(qiáng)一致性,理論上來說是不可能的

          但是,程序員總是愛創(chuàng)造奇跡。

          單說數(shù)據(jù)庫,程序員們創(chuàng)造了事務(wù)特性,就是平時(shí)面試經(jīng)常問的ACID特性的一個(gè)愛稱。至于ACID的概念是什么,簡單的抄襲一下:

          ACID,是指數(shù)據(jù)庫管理系統(tǒng)(DBMS)在寫入或更新資料的過程中,為保證事務(wù)(transaction)是正確可靠的,所必須具備的四個(gè)特性:原子性(atomicity,或稱不可分割性)、一致性(consistency)、隔離性(isolation,又稱獨(dú)立性)、持久性(durability)。

          • Atomicity(原子性):一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤,會被恢復(fù)(Rollback)到事務(wù)開始前的狀態(tài),就像這個(gè)事務(wù)從來沒有執(zhí)行過一樣。
          • Consistency(一致性):在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預(yù)定的工作。
          • Isolation(隔離性):數(shù)據(jù)庫允許多個(gè)并發(fā)事務(wù)同時(shí)對其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。
          • Durability(持久性):事務(wù)處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會丟失。

          回歸正題,存放緩存數(shù)據(jù)的設(shè)備能否也提供事務(wù)特性呢?如果可以,是否也能夠提供完整的ACID特性呢?

          如果你看過幾篇緩存和DB一致性的文章就會發(fā)現(xiàn),無論你先更新DB后更新緩存,還是先更新緩存后更新DB,或是先更新DB后刪除緩存.....無論怎么折騰,都不能保證數(shù)據(jù)的強(qiáng)一致性

          悲哀嗎?看了這么多文章居然不能解決這個(gè)問題。

          多個(gè)不同的外部設(shè)備數(shù)據(jù)要想保證強(qiáng)一致性,除非都能提供事務(wù)的接口,還需要引入事務(wù)協(xié)調(diào)器

          拿緩存和數(shù)據(jù)庫的一致性保證來說,沒有協(xié)調(diào)器根本不可能保證強(qiáng)一致性。所以業(yè)務(wù)讓步了:保證最終一致性即可

          最終一致性容易保證嗎?其實(shí)也不容易

          看有些人已經(jīng)給你出解決方案了:引入MQ。因?yàn)镸Q一是能保證消息的可靠性到達(dá)和可靠性消費(fèi),二是MQ是解耦利器。很多數(shù)據(jù)一致性的方案都會借助MQ的特性來做最終一致性。

          分布式的鐵律CAP原則,大家都應(yīng)該知道,但是我覺得最應(yīng)該熟記的是BASE理論。

          利用MQ來做數(shù)據(jù)庫和緩存一致性,本質(zhì)上也屬于BASE理論的實(shí)踐。在業(yè)務(wù)上做出讓步,遺漏短暫的中間狀態(tài)來達(dá)到最終目的。

          分布式鎖可行嗎

          客戶端可以讀到錯(cuò)誤數(shù)據(jù)的原因源自數(shù)據(jù)的中間狀態(tài),如果在數(shù)據(jù)變動的整個(gè)過程不允許其他請求讀取也可以達(dá)到數(shù)據(jù)上的強(qiáng)一致性。

          什么意思呢?在一個(gè)數(shù)據(jù)的變動過程中,不允許其他請求進(jìn)來,等到緩存和數(shù)據(jù)庫全部修改完成再允許其他請求進(jìn)來,這就是業(yè)務(wù)上的分布式鎖控制一致性方案。

          無奈,一般的分布式鎖性能都比較低,這個(gè)低是對比無鎖的情況下來對比的,相對于肉眼時(shí)間,還是很快的。最主要的是,如果引入分布式鎖的技術(shù),那又將面臨分布式鎖的一系列問題。

          最后強(qiáng)調(diào)一點(diǎn):緩存一定要設(shè)置過期時(shí)間,這是保證最終一致性的兜底方案


          -End-

          最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

          點(diǎn)擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取

          在看點(diǎn)這里好文分享給更多人↓↓

          瀏覽 18
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产亚洲AV无码成人片 | 91又大又粗又爽 | 蜜桃亚洲无码电影 | 骚逼婷婷| 黑人大屌轮奸视频播放免费成人 |