<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>

          無(wú)狀態(tài)節(jié)點(diǎn)服務(wù)的緩存數(shù)據(jù)同步實(shí)現(xiàn)

          共 1302字,需瀏覽 3分鐘

           ·

          2021-06-28 02:40

          在目前需求背景下要設(shè)計(jì)一套底層服務(wù)系統(tǒng),提供一系列基本數(shù)據(jù)請(qǐng)求接口,這里把該系統(tǒng)服務(wù)稱為P,為保證高可用高可靠性,P系統(tǒng)最少依賴外部中間件,例如數(shù)據(jù)庫(kù)消息隊(duì)列等組件,服務(wù)所涉及的數(shù)據(jù)全部緩存到本地緩存中,然后由其他服務(wù)來(lái)請(qǐng)求接口或數(shù)據(jù)庫(kù)收集數(shù)據(jù),將收集的數(shù)據(jù)存入Redis中,再去通知P系統(tǒng)更新本地緩存的數(shù)據(jù),收集數(shù)據(jù)的服務(wù)稱為D。以下為P,D,Redis關(guān)系圖。

          需要注意的是,P并不會(huì)強(qiáng)依賴與Redis與D系統(tǒng),因其本地緩存有一份全量的數(shù)據(jù),只是對(duì)數(shù)據(jù)的實(shí)時(shí)性不能保證,要靠D系統(tǒng)來(lái)定時(shí)發(fā)送更新通知,本文是對(duì)P,D系統(tǒng)在Redis中數(shù)據(jù)的同步進(jìn)行討論,不關(guān)注其他細(xì)節(jié)實(shí)現(xiàn)。

          數(shù)據(jù)同步一般分為全量和增量

          在系統(tǒng)初始化階段最好是全量加載,待本地有了完整數(shù)據(jù)后,之后的更新最好是增量進(jìn)行,一是可以提高網(wǎng)絡(luò)傳輸性能,加快更新進(jìn)度,二是可以避免在數(shù)據(jù)量過(guò)大時(shí)全量覆蓋速度太慢影響正常業(yè)務(wù)請(qǐng)求,還可能導(dǎo)致本次更新未完成便收到下次更新通知,使得系統(tǒng)陷入更新困境,造成惡循環(huán)拖垮性能。下面描述對(duì)兩種同步方式的實(shí)現(xiàn)思路

          全量覆蓋的實(shí)現(xiàn):

          D系統(tǒng)拉取到全部數(shù)據(jù)后,直接刪除redis上舊的數(shù)據(jù)結(jié)構(gòu),例如一個(gè)Hash,再將新的數(shù)據(jù)全部傳到新的Hash結(jié)構(gòu)里,P系統(tǒng)收到更新后,全量拉取該Hash的數(shù)據(jù)覆蓋本地緩存。

          增量覆蓋的實(shí)現(xiàn):

          增量存在三種數(shù)據(jù)不一致情況,新增數(shù)據(jù),刪除數(shù)據(jù),修改數(shù)據(jù),比較容易想到的方式是,每次D系統(tǒng)拉取到新的全部數(shù)據(jù)后,用該數(shù)據(jù)集和Redis中的數(shù)據(jù)集對(duì)比,假設(shè)新數(shù)據(jù)集為n,舊數(shù)據(jù)集為m,用n與m數(shù)據(jù)做差集,其實(shí)就是n中的數(shù)據(jù)查找m中是否存在,存在的話進(jìn)行對(duì)比,不一致則更新,如果不存在就插入該數(shù)據(jù),時(shí)間復(fù)雜度在n*m,這樣只能統(tǒng)計(jì)出新增和修改的數(shù)據(jù),如果要統(tǒng)計(jì)刪除的數(shù)據(jù)還需要再進(jìn)行雙向遍歷來(lái)查找。

          優(yōu)化增量同步:

          基于此方案的缺陷,提出來(lái)另一種優(yōu)化思路,增加版本號(hào)來(lái)控制數(shù)據(jù)的更新,使用Zset或者Hash來(lái)存儲(chǔ)數(shù)據(jù),Score作為版本號(hào),即在D系統(tǒng)拿到全量數(shù)據(jù)后,不需要把Redis的舊數(shù)據(jù)掛下來(lái),直接用新的數(shù)據(jù)集去查找對(duì)比,根據(jù)三種數(shù)據(jù)狀態(tài)來(lái)描述,查找數(shù)據(jù)時(shí)如果能找到說(shuō)明數(shù)據(jù)沒(méi)有更新,將該記錄的score值遞增,找不到可能是已經(jīng)更新的數(shù)據(jù),則直接新插入該數(shù)據(jù),并將score設(shè)置為相同的值,當(dāng)整個(gè)過(guò)程執(zhí)行完成后,Redis上的數(shù)據(jù)就被更新了一遍,以score來(lái)區(qū)分,沒(méi)有更新score值的可能是已經(jīng)更新了或者刪除了,更新了score值的可能是新插入或者能查找到的。P系統(tǒng)在接收到更新通知后,根據(jù)本次的版本號(hào)score值,拉取對(duì)應(yīng)score值的數(shù)據(jù)集來(lái)覆蓋本地的緩存。


          作者:AlgoRain
          鏈接:https://juejin.cn/post/6972131556269752334
          來(lái)源:掘金
          著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。



          瀏覽 58
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  国产激情久久 | 国产一区二区三区 | 欧美日韩中文在线视频 | 欧美日韩视频在线 | 天天射一射 |