前言

◆ ◆ ◆ ◆

还记得2017年,微信红包收发总量达到460亿个,2019年,除夕到初五,8.23亿人收发微信红包。一觉醒来,微信群里各种红包,顿时觉得错过了几个亿,破解了红包的规律,是不是就可以发财了呢?

红包算法主要思想

◆ ◆ ◆ ◆

我们抢红包关心的一般都是“手气最佳”,对于手气最佳,清华的毕啸天小哥哥做过一个统计,发了几亿次红包,得到如下图分析:

关于微信红包算法的重要发现是:

每个人当前抢到的微信红包金额大小服从均匀分布

[0.01,2*当前剩余红包均值两倍)

举个栗子:

在你打开红包的那一瞬间,

红包剩余m元

红包剩余个数为n个

那么你能抢到的金额为在

0.01和2*m/n之间

这个结论也在知乎大神陈鹏也提到过。

所以,如果以上结论是对的,那么结果就是!

  1. 先抢后抢,期望大致相等

  2. 对于第一个人来说,抽取红包大小服从均匀分布;对于之后的人来说,不服从均匀分布。

  3. 越到后面,越有可能抽到一个很小的红包,也越有可能抽到一个很大的红包

  4. 理论上来说,如果前面的运气都很差,最后一个人可以拿到接近总额的红包

结论就是:

  1. 风险规避的人,应该尽可能往前抽取

  2. 风险偏爱的人,应该尽可能往后抽取,而且越往后,增速标准差越大,极有可能抽到一个很大的红包;同理,小红包的概率也越大。

这个也是小明同学这几个月的痛……

小明有个微信群,老板每逢8,18,28发红包,手气最佳可得免单券,每次都提前预设闹钟,却一次都没有抢到,每次都是最后几个拿到最佳,如下图

经过抢的这几个月,以上结论也是可以验证的,最大的往往出现在后面,而且会比其他的大很多。

算法实现

◆ ◆ ◆ ◆

基于以上的结论,我们很容易就可以实现抢红包算法了,如下图:

以上代码仅仅供参考,实际过程不会那么简单,商用计算需要用BigDecimal。

如果想要代码或者进一步讨论的同学也可以加小明同学的微信:

miraclesComing

架构设计

◆ ◆ ◆ ◆

一个抢红包的功能当然不会那么简单,会涉及并发、缓存等等、这个也是面试的考题,下面补充几点关注点:

  1. 微信的金额什么时候算?

    金额是拆的时候实时算的,不是预先分配,采用纯内存计算,不需要计算空间存储。

    采用实时计算的原因:预算需要占内存且效率低,实时效率高

  2. 红包的设计:

    微信从财付通拉取金额数据,生成个数/红包类型/金额放到redis集群里,app端红包id的请求放入请求队列中,如果发现超过红包个数,直接返回。根据红包的处理成功得到令牌请求,由财付通进行一次性调用,通过像比特币一样,两边保存交易记录,交易后交给第三方服务审计,如果交易过程中出现不一致则强制回归。

  3. 并发处理:红包如何计算被抢完?

    Cache会抵抗无效请求,将无效的请求过滤,实际进入后台的量不大。Cache记录红包个数,原子操作进行个数递减,到0表示被抢光。财付通按照20万笔每秒入账准备,但实际还不到8万每秒

  4. 财付通如何保持8万每秒写入?

    多主sharding,水平拓展机器

  5. 数据容量多少?

    一个红包占一条记录,有效期只有几天,因此不需要太多空间

  6. 查询红包分配,压力大不大?

    抢到红包的人数和红包都在一条cache记录上,没有太大的查询压力

  7. 一个红包一个队列?

    没有队列,一个红包一条记录,数据上有一个计数器字段

  8. 会不会出现两个最佳?

    会出现金额一样的,但是最佳只有一个,先抢到的最佳。

  9. 每领一个红包就更新数据吗?

    每抢到一个红包,cache更新剩余金额和红包个数

  10. 红包如何入库入账?

    数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作。

  11. 入账错了怎么办,比如红包个数没了,红包还有?

    最后会有一个take all操作,另外还有一个对账来保障。

以上架构内容参考知乎:

https://www.zhihu.com/question/22625187

查看往期精选:

月薪5万的java程序猿必备

抛砖引玉NIO

Java改善性能小技巧

深入理解final

String三姐妹你所不知道的坑!

面试必备SpringMVC工作原理,涨薪5K就靠它!

连阿里HR都知道的四种引用类型,你知道多少!

升职加薪,点击关注,不要走丢

一不小心错过的几个亿还可以再回来!解密微信红包算法相关推荐

  1. 暴雨,她还会再回来的,广东已开通本月降雨套餐

    昨晚11点40多坐车回来,和司机大叔聊了一会,他来一句"你是广东人吗?"我说"是啊",他接着说"叼,唔早D讲."我说"系吖,我系广 ...

  2. 震惊!还能用Python制作微信红包封面,展现自己满满的诚意

    公众号 "菜鸟学Python", 设为 "星标" 第446篇原创,和30w+一起学Python! 过年期间,家人和朋友之间少不了的是互相发红包,钱多钱少不重要, ...

  3. 我给了老公3个月的花心期!爱还会再回来吗?

    2006.9.15 07:09 2002年7月初的一个傍晚,李勃的手机响了,他起身到阳台上接电话,而后说:"一个大学同学来成都,约我出去喝茶."我静静地看着他放下碗,去了洗手间. ...

  4. python微信红包提醒_用Python写个了红包提醒,再不怕错过一个亿了

    又到了辞旧迎新的时候,群里的红包也多起来了.然而大佬们总是喜欢趁我不在的时候发红包,经常打开手机,发现红包已被抢完,感觉错过了一个亿. 安卓上有不少红包助手工具,但 iOS 似乎没有.而且就算有,这种 ...

  5. 董明珠:10个亿不要了,还想再赌五年 雷军:可以试一下

    8月28日,格力电器董事长董明珠在北京表示,跟雷军的10亿赌约已经结束了,结果大家都知道了.10个亿我不要了,还想再跟雷军赌5年.小米集团董事长雷军回应称:"我觉得可以试一下".对 ...

  6. 私钥设置_私钥忘了怎么办,还能找回来吗?能

    Part 1 在币圈,最遥远的距离不是比特币就在我面前我却没办法买下,而是我手里拿着数字钱包却忘了私钥...... 数字钱包不比银行卡,银行卡密码丢了,我们可以带上身份证去找回,但数字钱包的私钥丢了, ...

  7. 简单的python抢红包脚本-Python自动抢红包,超详细教程,再也不会错过微信红包了!...

    来源:python专栏 github:https://github.com/MiracleYoung/You-are-Pythonista/tree/master/PythonExercise/Too ...

  8. 高并发资金交易系统设计方案—百亿双十一、微信红包背后的技术架构

    21CTO社区导读 : 今天带来的是一个长篇文章.主要讲解高可用的互联网交易系统架构,包括双十一.支付宝&微博红包技术架构,以及微信红包的技术架构,希望能给各位提供价值. 概述 话说每逢双十一 ...

  9. 把 14 亿中国人民都拉到一个微信群里在技术上能实现吗?

    全世界只有3.14 % 的人关注了 爆炸吧知识 作者丨Max 链接:zhihu.com/question/293021546/answer/487157602 把 14 亿中国人民都拉到一个微信群里在 ...

最新文章

  1. 深度揭秘Windows 7
  2. 随机生成50个字段的elasticsearch的测试程序输入
  3. wifi无线网卡移植到andorid
  4. TypeError: decoding Unicode is not supported
  5. oracle 日结 数据量大,如何对一个oracle11gsql语
  6. win7卡在正在启动windows界面_win7如何重装ie8
  7. android UI设计时须要注意遵循的设计原则
  8. 【APICloud系列|33】移动应用软件加固步骤,适合所有的安卓应用市场
  9. iOS一次定位解决方案(基于高德iOS SDK)
  10. 如何获取url中的参数并传递给iframe中的报表
  11. AfterLogic WebMail
  12. 智利可以使用支付宝嘛?_智利的水电和输电规划使用开源地理空间工具
  13. mcrp 对接软件换
  14. 企业IT构建核心基础架构解决方案
  15. 你与顶级架构师的差距,可能就在这个数据中台解决方案
  16. LeetCode-210 Course Schedule II
  17. java如何验证手机号码_Java 手机号码正则表达式验证
  18. 申请永久免费空间、数据库空间、域名
  19. Lua 程序设计——Lua 教程01
  20. 被垃圾分类逼疯?这个深度学习技术帮你做到垃圾自动分类

热门文章

  1. ng1和ng2的部分对比
  2. 支付宝还信用卡开始收费 互联网服务进入收费时代?
  3. me shy是什么歌 抖音make_原来这才是抖音上最火爆的6首英文歌原版!每一首听不腻!...
  4. RocketMQ 中Topic、Tag、GroupName基本概念介绍
  5. 超神学院计算机等级,【深度研究】关于【雄兵连】哲学价值观等系列研究及对蜀山启示...
  6. 苹果邮箱绑定UCAS国科大邮箱
  7. 通信行业的加班套路,到底有多深?
  8. 公安审讯室温湿度万年历字符视频叠加
  9. Unity动态加载与内存关系3:AssetBundle (Addressable Assets)篇
  10. 《失控》之八--封闭系统