JAVA之大道至簡
阿新 • • 發佈:2019-01-04
... 方案 idt tool 100萬 media 只有一個 分析 沒有
java是一門面向對象的語言,雖然我比較有優勢,早出生了幾年。第一門語言是C語言,學得完全沒什麽感覺。更別談什麽學以致用了,飯碗還是靠java語言,所以至今對面向對象也沒什麽深刻的理解。啰嗦了幾句,其實主要想表達的是,在程序猿的路上,更重要的是思考。而不是什麽面向對象,什麽框架,這些都只是工具。哈哈還想啰嗦一下知行合一的,想想還是算了。這麽高深的道理,用文字表達不得出書。
今天簡單分析一個需求。有100萬條數據存儲在數據庫表A,大致結構如下:
表A | ||
客戶ID | 推送內容 | 推送狀態 |
需要推送到到某服務器,1秒推送的效率是50條,而客戶希望1小時推送完成。1秒50,那一個小時也就只能推送18萬筆。如果達到1小時推送完的話,那肯定得要用多線程吧。嗯不錯,確實要用多線程,100/18,最起碼得用6個線程。程序啟動6個線程去查詢數據庫,怎麽控制每個線程不讀到重復的數據呢(重復這個問題可嚴重了,如果是提醒重復就是騷擾,如果是轉賬那重復就要錢了)
解決方案A,在讀取數據庫的方法加一把同步鎖,確保只有一個線程讀取就可以了。那實現方法大致如下:
1、給方法加鎖確保一個線程進入
2、給某取18萬筆數據(怎麽取呢)
3、 批量更新這18萬筆數據為(正在處理狀態,以防其他線程重復取)
看著是不是挺復雜,那有沒有簡單的辦法呢?嘿嘿當然有
解決方案B,給表A加個序號字段,要求在按順序寫入表,結構大致如下:
表A | |||
序號 | 客戶ID | 推送內容 | 推送狀態 |
1 | |||
2 | |||
3 | |||
.... | |||
1000000 |
思路是不是立即就有了,線程 A 取 1~180000,線程B就取 180001~360000,就行啦,也節省鎖以及更新推送中間狀態的效率。再深入點,還在可以從分區上設計考慮。
也許你會問,別人寫入的時候不願意加序號怎麽辦,怎麽辦,涼拌!擺事實講道理,你不提出來,別怎麽知道你需要。
JAVA之大道至簡