android 增量更新數(shù)據(jù)

前言

前兩個(gè)項(xiàng)目忧便,客戶端與服務(wù)器端需要進(jìn)行大量的數(shù)據(jù)交互青灼,設(shè)計(jì)方案時(shí)并沒(méi)有考慮到數(shù)據(jù)量多大的情況,導(dǎo)致后期在實(shí)際生產(chǎn)環(huán)境中辽旋,經(jīng)常出現(xiàn)客戶端崩潰現(xiàn)象浩嫌,今天在一篇博客上看到了一種簡(jiǎn)單的解決方案檐迟,轉(zhuǎn)載過(guò)來(lái),便于后期查看码耐,原文地址:http://blog.cnbang.net/tech/2258/

在郵件/日歷/SNS等客戶端里追迟,客戶端數(shù)據(jù)要不斷與服務(wù)端進(jìn)行數(shù)據(jù)同步,在同步過(guò)程中伐坏,只拉取有修改的數(shù)據(jù)怔匣,稱為增量更新,增量更新方案一般有兩種桦沉,一是對(duì)比每瞒,二是日志。

對(duì)比

對(duì)比就是客戶端請(qǐng)求服務(wù)端所有關(guān)鍵數(shù)據(jù)纯露,跟本地已有的數(shù)據(jù)進(jìn)行對(duì)比剿骨,篩選出增刪改的數(shù)據(jù)進(jìn)行更新。

用對(duì)比方法的好處是服務(wù)端什么都不用做埠褪,壞處是客戶端邏輯復(fù)雜浓利,耗網(wǎng)絡(luò)流量。在這種方案里钞速,數(shù)據(jù)的新增和刪除很容易判斷贷掖,根據(jù)客戶端數(shù)據(jù)的id列表和服務(wù)端數(shù)據(jù)的id列表進(jìn)行對(duì)比就行,若要判斷哪個(gè)數(shù)據(jù)有修改則比較麻煩渴语,需要取回?cái)?shù)據(jù)進(jìn)行對(duì)比苹威,如果從服務(wù)端拉回所有對(duì)所有數(shù)據(jù)進(jìn)行對(duì)比會(huì)很耗網(wǎng)絡(luò)流量,有一個(gè)優(yōu)化方式驾凶,就是對(duì)每個(gè)數(shù)據(jù)的修改進(jìn)行標(biāo)記牙甫。

以日歷為例,一個(gè)日歷可修改的字段很多调违,例如時(shí)間段窟哺,內(nèi)容,邀請(qǐng)人等技肩,全部拉回來(lái)對(duì)比不現(xiàn)實(shí)且轨,對(duì)此可以在服務(wù)端給每個(gè)日歷事件新增一個(gè)字段tag,表示這個(gè)日歷事件的版本虚婿,服務(wù)端更新一個(gè)日歷事件時(shí)會(huì)同時(shí)更新這個(gè)tag殖告,客戶端只需要取回每個(gè)id對(duì)應(yīng)的tag,跟本地保存的tag對(duì)比雳锋,不一致表示這個(gè)日歷事件已經(jīng)更新,再去獲取日歷實(shí)體就完成更新了羡洁。

若服務(wù)端因?yàn)槟承┰驘o(wú)法給每個(gè)數(shù)據(jù)保存一個(gè)版本標(biāo)記玷过,可以實(shí)時(shí)計(jì)算,在客戶端和服務(wù)端約定一個(gè)算法,把所有可變參數(shù)拿出來(lái)辛蚊,通過(guò)特定算法hash出一個(gè)值粤蝎,對(duì)比這個(gè)hash值判斷是否需要更新。

郵件協(xié)議IMAP袋马,日歷協(xié)議CalDAV就是用這種方式做增量更新初澎,IMAP并沒(méi)有做上述的優(yōu)化,在判斷郵件有沒(méi)有更新時(shí)只能乖乖把所有數(shù)據(jù)請(qǐng)求回來(lái)對(duì)比虑凛,數(shù)據(jù)是XML碑宴,算是相當(dāng)?shù)托У膮f(xié)議。CalDAV給每個(gè)日歷事件加了上述的tag桑谍,直接對(duì)比即可知道是否需要更新延柠。

日志

日志指服務(wù)端記錄數(shù)據(jù)的每一次增刪改,用一個(gè)類似版本號(hào)的sync-key標(biāo)記這次修改锣披,客戶端通過(guò)一個(gè)舊的sync-key向服務(wù)端請(qǐng)求贞间,服務(wù)端返回這個(gè)sync-key與最新sync-key之間所有的修改給客戶端,完成增量更新雹仿。

這個(gè)sync-key在服務(wù)端的實(shí)現(xiàn)上可以是時(shí)間增热,也可以是一個(gè)自增的id,sync-key之間有順序關(guān)系就行胧辽。在一個(gè)數(shù)據(jù)集里峻仇,每次數(shù)據(jù)有更新,就新增一個(gè)sycn-key票顾,并記錄這次更新础浮。圖示這個(gè)過(guò)程:

這個(gè)方案客戶端邏輯很簡(jiǎn)單,但服務(wù)端負(fù)擔(dān)較大奠骄,每次數(shù)據(jù)更新都要記錄豆同,客戶端請(qǐng)求時(shí)需要查詢給出相應(yīng)的數(shù)據(jù)。這個(gè)方案在實(shí)際操作中還有兩個(gè)問(wèn)題:

一是時(shí)間長(zhǎng)了服務(wù)端保存數(shù)據(jù)量過(guò)大含鳞∮靶猓可以通過(guò)限制記錄的條數(shù)解決,超過(guò)限制就刪除最舊的記錄蝉绷。這樣做會(huì)出現(xiàn)一個(gè)問(wèn)題鸭廷,若客戶端帶著在服務(wù)端已被刪除的sync-key上來(lái)請(qǐng)求,該如何處理熔吗?一般做法是返回一個(gè)錯(cuò)誤給客戶端辆床,讓客戶端重新拉取所有數(shù)據(jù)。

二是若客戶端sync-key過(guò)舊桅狠,增量數(shù)據(jù)可能過(guò)大讼载〗窝恚客戶端數(shù)據(jù)太老,有太多數(shù)據(jù)需要更新咨堤,若一次性返回所有增量數(shù)據(jù)菇篡,這個(gè)請(qǐng)求可能會(huì)很大,請(qǐng)求時(shí)間太長(zhǎng)一喘,成功率也會(huì)很低驱还。解決方式是分多次請(qǐng)求,客戶端和服務(wù)端可以約定一個(gè)字段作為閥值凸克,服務(wù)端每次返回的增量數(shù)據(jù)量不超過(guò)這個(gè)閥值议蟆,若總數(shù)據(jù)超過(guò)這個(gè)閥值,則分多次請(qǐng)求触徐,通過(guò)每次請(qǐng)求返回的sync-key定位下次請(qǐng)求該返回哪些數(shù)據(jù)咪鲜。例如客戶端sync-key是100,服務(wù)端最新sync-key是1000撞鹉,閥值是50疟丙,客戶端第一次帶sync-key=100請(qǐng)求,服務(wù)端第一次返回sycn-key 100-150這一段增量數(shù)據(jù)鸟雏,并返回sync-key=150享郊,并有一個(gè)值告訴客戶端這個(gè)sync-key還不是最新,客戶端再帶上sync-key=150請(qǐng)求孝鹊,以此類推炊琉,直到sync-key=1000。

微軟的Exchange/ActiveSync就是用這種方式實(shí)現(xiàn)增量更新又活,ActiveSync還用WBXML壓縮了數(shù)據(jù)苔咪,更適用于移動(dòng)端。此外日歷協(xié)議CalDAV的也有一個(gè)擴(kuò)展協(xié)議RFC6578使用這種方式柳骄。ActiveSync和CalDAV擴(kuò)展協(xié)議都有分多次請(qǐng)求增量數(shù)據(jù)的策略团赏。

小結(jié)

對(duì)于Timeline式的數(shù)據(jù),增量更新方式多是以上兩種耐薯,或者這兩種的變體舔清,可以根據(jù)業(yè)務(wù)特性修改或簡(jiǎn)化其中的邏輯,例如對(duì)于微博Timeline曲初,它可以不考慮微博的修改体谒,不考慮同步評(píng)論轉(zhuǎn)發(fā)數(shù)的變化,不考慮同步刪除的微博臼婆,并且每一條微博都有一個(gè)遞增的id抒痒,那它的增量更新邏輯就很簡(jiǎn)單,只需要把客戶端最新一條微博的id作為since_id傳到服務(wù)端颁褂,返回比這個(gè)id更新的微博就行了评汰,這里微博id相當(dāng)于日志方式的sync-key纷捞,算是對(duì)日志方式的一種簡(jiǎn)化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末被去,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奖唯,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凯旭,死亡現(xiàn)場(chǎng)離奇詭異属提,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)病往,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)捣染,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人停巷,你說(shuō)我怎么就攤上這事耍攘。” “怎么了畔勤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蕾各,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我庆揪,道長(zhǎng)式曲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任缸榛,我火速辦了婚禮吝羞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘内颗。我一直安慰自己钧排,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布起暮。 她就那樣靜靜地躺著卖氨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪负懦。 梳的紋絲不亂的頭發(fā)上筒捺,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音纸厉,去河邊找鬼系吭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛颗品,可吹牛的內(nèi)容都是我干的肯尺。 我是一名探鬼主播沃缘,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼则吟!你這毒婦竟也來(lái)了槐臀?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氓仲,失蹤者是張志新(化名)和其女友劉穎水慨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體敬扛,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晰洒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啥箭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍珊。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖急侥,靈堂內(nèi)的尸體忽然破棺而出砌滞,到底是詐尸還是另有隱情,我是刑警寧澤缆巧,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布布持,位于F島的核電站,受9級(jí)特大地震影響陕悬,放射性物質(zhì)發(fā)生泄漏题暖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一捉超、第九天 我趴在偏房一處隱蔽的房頂上張望胧卤。 院中可真熱鬧,春花似錦拼岳、人聲如沸枝誊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)叶撒。三九已至,卻和暖如春耐版,著一層夾襖步出監(jiān)牢的瞬間祠够,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工粪牲, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留古瓤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像落君,于是被迫代替她去往敵國(guó)和親穿香。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容