java批量處理數(shù)據(jù)肌稻、function鏈?zhǔn)讲僮?/h1>
前言

最近遇到個(gè)需求,需要定時(shí)任務(wù)處理大批量數(shù)據(jù)的導(dǎo)入匕荸、更新和刪除爹谭,數(shù)據(jù)量每次在十萬(wàn)級(jí)左右,極少情況有百萬(wàn)每聪、千萬(wàn)級(jí)旦棉,所以肯定不能直接一次性處理,內(nèi)存和數(shù)據(jù)庫(kù)都頂不住药薯。因此我用lambda表達(dá)式寫(xiě)了一個(gè)鏈?zhǔn)教幚淼姆椒ㄈ缦隆?/p>

private void batchHandle(int total, Function<Integer, List<?>> queryFunction, Function<List<?>, Void> handleFunction) {
    for (int i = 0; i < total; i++) {
        queryFunction.andThen(handleFunction).apply(i);
    }
}
簡(jiǎn)介

方法一共有三個(gè)參數(shù)绑洛,第一個(gè)參數(shù)total是本次任務(wù)需要處理的數(shù)據(jù)總量,我會(huì)先用count的sql查出來(lái)童本,然后傳遞給第一個(gè)function作為入?yún)⒄嫱停鼤?huì)返回一個(gè)List<?>,結(jié)合方法里的for穷娱,這里就能拿到分批后的單批量數(shù)據(jù)绑蔫,然后將list傳給第二個(gè)function运沦,對(duì)單批數(shù)據(jù)做統(tǒng)一的處理邏輯(增刪改查)。

踩坑
  1. 最初我的設(shè)想是每批2000條數(shù)據(jù)配深,直接拿到數(shù)據(jù)然后操作入庫(kù)携添,寫(xiě)出來(lái)的第一版代碼在我小批量的測(cè)試數(shù)據(jù)下也沒(méi)出現(xiàn)問(wèn)題,但是一旦數(shù)據(jù)量上升篓叶,這里的單次耗時(shí)就會(huì)成倍累加烈掠,尤其是數(shù)據(jù)量到了千萬(wàn)級(jí)別,哪怕處理邏輯非常簡(jiǎn)單缸托,單次耗時(shí)1秒總計(jì)也有83分鐘左敌,而且這段時(shí)間一直占用著資源還是非常夸張的俐镐。
  2. 況且第一個(gè)function批量處理肯定需要對(duì)全部數(shù)據(jù)進(jìn)行分頁(yè)矫限,那么隨著limit數(shù)字越來(lái)越大,分頁(yè)查詢的耗時(shí)會(huì)越來(lái)越多佩抹,并且業(yè)務(wù)表里主鍵是uuid且沒(méi)有合適的排序字段叼风。
  3. 再其次,兩個(gè)function里和數(shù)據(jù)庫(kù)交互的部分需要做緩存棍苹,否則每一批都需要重新查詢咬扇,對(duì)數(shù)據(jù)庫(kù)會(huì)造成非常多重復(fù)不必要的訪問(wèn)。
  4. 也因?yàn)檫@幾個(gè)問(wèn)題沒(méi)考慮周全廊勃,導(dǎo)致第一版寫(xiě)出的定時(shí)任務(wù)在測(cè)試時(shí)非常的慢懈贺,最開(kāi)始單批執(zhí)行耗時(shí)3秒,到后來(lái)單批耗時(shí)就要1分鐘(分頁(yè)越來(lái)越多)坡垫,我就直接停止測(cè)試開(kāi)始優(yōu)化了梭灿。
優(yōu)化
  1. 針對(duì)分頁(yè)的優(yōu)化。如上所述冰悠,如果主鍵是自增或者表里存在某個(gè)字段比如時(shí)間堡妒,那么我們可以通過(guò)分批后添加條件截取數(shù)據(jù)的辦法優(yōu)化,但是我的情況并不允許溉卓。除此自外還有一個(gè)經(jīng)典的優(yōu)化方案皮迟,分頁(yè)時(shí)只查詢主鍵id,再在第二個(gè)function里重新查表得到對(duì)象list桑寨。這樣看起來(lái)是多繞了一點(diǎn)路伏尼,但實(shí)際上mysql主鍵查詢是非常快的尉尾,“覆蓋索引”就是這么個(gè)意思爆阶,查詢條件與結(jié)果都在一個(gè)“索引表”中,所以速度快。優(yōu)化后的分頁(yè)耗時(shí)都在1秒內(nèi)辨图。

  2. 針對(duì)緩存的優(yōu)化班套。我在本地做了HashMap緩存(這里遇到了上篇文章的坑,和concurrentHashMap的坑)故河,把能復(fù)用的數(shù)據(jù)都存放在本地吱韭,用空間換時(shí)間,減少重復(fù)的mysql交互鱼的,這部分主要是業(yè)務(wù)相關(guān)的優(yōu)化杉女。

結(jié)果

最終任務(wù)的運(yùn)行時(shí)時(shí)間獲得了巨大優(yōu)化,百萬(wàn)級(jí)數(shù)據(jù)的處理花了4分鐘鸳吸,日常十萬(wàn)級(jí)數(shù)據(jù)只要1分鐘不到,已經(jīng)在可接受范圍內(nèi)了速勇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末晌砾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烦磁,更是在濱河造成了極大的恐慌养匈,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件都伪,死亡現(xiàn)場(chǎng)離奇詭異呕乎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)陨晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)猬仁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人先誉,你說(shuō)我怎么就攤上這事湿刽。” “怎么了褐耳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵诈闺,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我铃芦,道長(zhǎng)雅镊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任刃滓,我火速辦了婚禮仁烹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咧虎。我一直安慰自己晃危,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著僚饭,像睡著了一般震叮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳍鸵,一...
    開(kāi)封第一講書(shū)人閱讀 50,021評(píng)論 1 291
  • 那天苇瓣,我揣著相機(jī)與錄音,去河邊找鬼偿乖。 笑死击罪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贪薪。 我是一名探鬼主播媳禁,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼画切!你這毒婦竟也來(lái)了竣稽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤霍弹,失蹤者是張志新(化名)和其女友劉穎毫别,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體典格,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岛宦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耍缴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾肺。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖防嗡,靈堂內(nèi)的尸體忽然破棺而出债沮,到底是詐尸還是另有隱情,我是刑警寧澤本鸣,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布疫衩,位于F島的核電站,受9級(jí)特大地震影響荣德,放射性物質(zhì)發(fā)生泄漏闷煤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一涮瞻、第九天 我趴在偏房一處隱蔽的房頂上張望鲤拿。 院中可真熱鬧,春花似錦署咽、人聲如沸近顷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窒升。三九已至缀遍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饱须,已是汗流浹背域醇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蓉媳,地道東北人譬挚。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像酪呻,于是被迫代替她去往敵國(guó)和親减宣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

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