码迷,mamicode.com
首页 > 微信 > 详细

微信红包算法

时间:2016-03-31 14:46:50      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:

在刚刚过去的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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!