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高級開發 的文章