标签:
在刚刚过去的2016年春节,微信红包再次成为大众的焦点。微信官方公布的数据显示,除夕当天,微信红包收发总量达10.1亿次,是2015年的200倍。可能有人会好奇,微信红包究竟有什么魔力,让一个又一个的用户爱不释手,安心在大过年的做个“低头族”呢。
抢红包的趣味,都在未知结果上,无论是1角还是1分,都要比在街边捡到了1块钱要兴奋!!接下来我们就来说说关于微信红包的算法是怎么实现的。
先来代码:
由于红包运算时基于金额,要求极高的精确度,所以数据统一采用BigDecemal类型。
1、创建红包规则类(记录一个总金额和多少人来抢)
2、红包计算工具类
3、测试
然后做一个简单分析。
红包的整体设计是这样,2014年微信红包使用数据库硬抗整个流量,2015年则使用cache抗流量。
微信先从财付通拉取金额数据出来,生成个数/红包类型/金额放到redis集群里,app端将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回。根据红包的打开请求处理成功得到令牌请求,则由财付通进行一致性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致就强制回滚。
红包里的随机金额取值是这样,额度在0.01和(剩余平均值*2)之间。
例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。当前面4个红包总共被领了50块钱时,剩下50块钱,总共6个红包,那么这6个红包的额度在:0.01~(50/6*2)=16.66之间。(控制在两倍间,目的为避免出现发200元11个,第一人拿199.9元,然后剩余10人,每人拿1分的情况)
这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法。
这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。
标签:
原文地址:http://blog.csdn.net/villainy13579/article/details/51024630