hello,大家好,今天10號了,很多人今天發工資了吧?不知道你們稅是不是少交了幾千塊呢?反正我那少交100塊零5毛的稅還得等到15號 @-@。工資雖然少的可伶,但是班依然加不完啊,這不我剛下班,地鐵一個小時,吃飯半個小時,休息半個小時,就這個點(23點)了。。。
這個點能幹嘛呢?想找今日頭條今天的文章量還沒完成呢,要不然收入又要少了幾分錢,不行不能浪費,可是我又不想隨便寫沒行業質量的文章,思來想去許久(加班太累)沒想到idea,剛好打開自己的支付寶-餘額寶,看著那兩三位數的餘額:馬雲雲我這每天0.07的收益你發著不閒累嗎?於是我就開始胡思亂想了:要是我負責餘額寶收益發放我會怎麼做呢?
往自己賬號裡打個幾千萬。。。 。。。
轉回正題:要是我負責餘額寶收益發放我會怎麼做呢? Java mysql mongodb, 啤酒 飲料 瓜子,nai子 妹子 鈔票 崔永元... 哎有了redis,給餘額寶的用戶收益發放量我h不住,給我的粉絲每天發一次收益的量應該沒問題。
用redis怎麼做好呢,我們來盤點下問題的難點:
- 收益派發失敗瞭如何解決
- 用戶量太大
- 用戶量太大
- 用戶量太大
收益派發失敗瞭如何解決
那我們先來解決第一個,高級的不會,簡單版的idea還是有的:redis list(列表)實現循環隊列+嗅探線程+消費線程 全自動化解決方案。
PS:普通消費線程(EarningDispatchTask)為定時任務,每天凌晨6點開始執行,簡單實現代碼如下:
/**
* 收益派發線程任務類
*/
public class EarningDispatchTask {
//假裝注入
RedisService redisService;
public void dispatch(){
try {
dispatchService.doDispatch();
} catch (Exception e) { redisService.lpush("listKey", "failData"); }
}
}
嗅探線程為定時任務,每半小時執行一次,簡單實現代碼如下:
/**
* 嗅探線程(增量收益派發任務類)
*/
public class EarningIncrementSchedule {
//假裝注入
RedisService redisService;
@PostConstruct
public void init(){
taskExecutor.execute(() -> {
Lock lock = EarningHelper.reDispatchLock;
Condition condition = EarningHelper.reDispatchCondition;
lock.lock();
try {
long len = redisService.Llen("listKey");
if(len > 0L){ condition.signal(); }
} finally { lock.unlock(); }
});
}
}
增量消費線程為定時任務,簡單實現代碼如下:
/**
* 增量收益派發任務類
*/
public class EarningIncrementDispatchTask {
//假裝注入
RedisService redisService;
@PostConstruct
public void init(){
taskExecutor.execute(() -> {
Lock lock = EarningHelper.reDispatchLock;
Condition condition = EarningHelper.reDispatchCondition;
while(true){
lock.lock();
try {
while (0 == redisService.llen("listKey") { condition.await(); }
String redisData = redisService.lPop("listKey");
dispatchService.doDispatch();
} finally { lock.unlock(); }
}
});
}
EarningHelper為輔助類,以ReentrantLock實現,:
接下來解決第二、三、四個問題:
數據量太大
呃,不是我說,就餘額寶那每天的收益派發量,十個我也搞不定 @-@
這不文章還沒寫完,過了12點了,還寫個毛啊。(此處省略好多字)。
文章最後皮一下:要是我負責餘額寶收益發放我會怎麼做呢? 答:不敢想,如果是你,你會怎麼做呢?
謝謝大家的觀看,good night
閱讀更多 Java高級開發 的文章