乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      應(yīng)用中引入緩存層后,緩存和持久化層數(shù)據(jù)一致性的思考

       頭號(hào)碼甲 2022-04-22
       
      一個(gè)應(yīng)用中決定加緩存(Redis,memcached)之前,要考慮的第一個(gè)問題就是,引進(jìn)了緩存之后,會(huì)帶來哪些收益(利),付出哪些代價(jià),引起哪些額外的問題(弊)?
      任何新的中間件引進(jìn),收益和成本都是伴隨的,只有當(dāng)利大于弊的情況下,能夠容忍其弊端(徹底解決?沒有額外代價(jià)又沒有負(fù)面影響,是不可能的,那就是不用就行了),才值得引進(jìn)。
       
      以Redis作為緩存為例,引進(jìn)之后,其利和弊也是伴隨的。
      帶來的收益:加速讀寫,提高并發(fā)性,降低后端持久化層數(shù)據(jù)庫的負(fù)載
      付出的代價(jià):增加代碼復(fù)雜,緩存本身的運(yùn)維,潛在的數(shù)據(jù)不一致造成的影響。
       
      數(shù)據(jù)不一致的存在
      引進(jìn)Redis(或者其他緩存)之后,應(yīng)用程序和數(shù)據(jù)持久化層多了一個(gè)中間層,部分?jǐn)?shù)據(jù)存儲(chǔ)由原來的單一持久化層,變?yōu)榫彺鎸雍统志没瘜觾煞荨?/div>
      這兩部分?jǐn)?shù)據(jù)在相互同步的過程中,在某些時(shí)間點(diǎn)上的維度來看,可能會(huì)潛在不一致的情況。
      其中,潛在的數(shù)據(jù)不一致,是任何一個(gè)引進(jìn)緩存層之后最面臨的最大的一個(gè)問題(當(dāng)然兩者最終的數(shù)據(jù)是要保持一致的,這一點(diǎn)是底線)。
      首先需要衡量的就是,這種潛在的不一致,會(huì)引發(fā)什么樣的問題,帶來的問題是否可以接受范圍之內(nèi),或者是否會(huì)對(duì)應(yīng)用程序邏輯引起致命的問題。
      緩存和持久化層存儲(chǔ)可能會(huì)不一致,往往是緩存和持久化層未同步刷新引起的,
      具體舉例說明:
      第一種情況,比如點(diǎn)贊次數(shù),瀏覽次數(shù)等等(讀多寫少的場景,寫MySQL,讀Redis,寫入了數(shù)據(jù)庫但是尚未同步到緩存層這個(gè)間隙)。
      不會(huì)對(duì)業(yè)務(wù)產(chǎn)生嚴(yán)重的邏輯錯(cuò)誤,這種暫時(shí)性的數(shù)據(jù)不一致是可以忍受的,另外就是,通過刷新等手段,兩者數(shù)據(jù)最終會(huì)達(dá)成一致。
      第二種情況,比如銀行卡取款取超,導(dǎo)致余額為負(fù)數(shù),緩存和持久化層存儲(chǔ)的不一致造成嚴(yán)重的邏輯錯(cuò)誤,這種是無法忍受的。
      就需要考慮這種緩存層本身的設(shè)計(jì)是否合理?
       
      輕量級(jí)做法,代碼邏輯實(shí)現(xiàn)
      如果對(duì)于緩存的合理性沒有問題,且業(yè)務(wù)邏輯上要求緩存和持久化層強(qiáng)一致,那么久要實(shí)現(xiàn)數(shù)據(jù)庫的一致性操作。
      對(duì)于緩存和持久化層數(shù)據(jù)的一致性實(shí)現(xiàn),個(gè)人的話,思路有以下兩種,
      輕量級(jí)的做法如下:
      對(duì)于引起數(shù)據(jù)變化的邏輯,一般都是“寫操作”,比如對(duì)數(shù)據(jù)的update或者delete,
      1,首先去delete緩存中對(duì)應(yīng)的數(shù)據(jù)(而不是去對(duì)應(yīng)的update、delete,為什么?因?yàn)橹灰猟elete成功,緩存被清理之后,就消除了不一致的可能性,或者并發(fā)造成的數(shù)據(jù)覆蓋錯(cuò)誤(update),而非update就做不到),如果執(zhí)行成功,再去操作持久化層的數(shù)據(jù)庫。
      2,對(duì)于insert操作,保證寫持久化庫成功,異步寫緩存(而不用刻意關(guān)注是否寫成功)。

      重量級(jí)分布式鎖實(shí)現(xiàn),雙寫實(shí)現(xiàn)強(qiáng)一致
      雙寫的安全性一般要通過分布式鎖來實(shí)現(xiàn),分布式鎖可以通過zookeeper或者redis實(shí)現(xiàn)。
      一旦考慮使用分布式鎖,又要考慮分布式鎖的載體的安全性,也即不管是用zookeeper或者redis,要考慮zookeeper或者redis的安全性(集群)。
      這樣下去,問題會(huì)變得非常復(fù)雜,純粹變?yōu)榻鉀Q問題-->引入新的問題-->解決問題的死循環(huán)。
      如果要保持一致,當(dāng)然雙寫也是一種選擇,不過通過雙寫來確保數(shù)據(jù)的絕對(duì)一致,不但會(huì)對(duì)整體效率產(chǎn)生負(fù)面的影響,實(shí)現(xiàn)也是比較困難的,暫時(shí)不討論這種方案。

      如果是分布式鎖,任何寫入性操作,比如update,delete等,如下:
      1,直接鎖定相關(guān)key值
      2,依次操作緩存層和持久化層,同時(shí)做好每一層的回滾操作,一旦任何一步失敗,都要回滾
      3,最終不管成功或者失敗,都釋放Key
      分布式鎖這種方式的話,實(shí)現(xiàn)起來,原代碼中業(yè)務(wù)侵入性較多,比較復(fù)雜
       
      重量級(jí)隊(duì)列化請(qǐng)求
      如果是使用隊(duì)列,將可能導(dǎo)致不一致性的訪問,隊(duì)列化執(zhí)行,其實(shí)這種方式,也是比分布式鎖更加重量級(jí)的,基本上會(huì)顛覆原始的邏輯實(shí)現(xiàn),一般很少采用。
       

      但是不管怎么樣,緩存層和持久化層,最終的數(shù)據(jù)是要保持一致的,這一點(diǎn)是底線。
      整體來看,引不引入緩存層,是從整體性能、業(yè)務(wù)邏輯、實(shí)現(xiàn)代價(jià)、數(shù)據(jù)一致性的容忍程度等多個(gè)方面決定的。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多