实现拼手气红包算法,有以下几个需要注意的地方:

抢红包的期望收益应与先后顺序无关

保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如区块链货币或者积分,需要自定义一个最小金额。

所有抢红包的人领取的子红包的金额之和加起来,等于发红包的人发出的总红包的金额。

下面实现的方式是一次生成所有的子红包,让用户按顺序领取。也可以每领取一个生成一个,两种方式性能上各有优劣。

之前看过一篇文章说是微信的红包算法是每次动态获取红包金额,不是一次生成,那样会造成储存空间浪费。转一下原文

微信红包的架构设计简介

@来源于QCon某高可用架构群整理,整理朱玉华。

背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢)

概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量。

微信的金额什么时候算?

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

采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低。

实时性:为什么明明抢到红包,点开后发现没有?

答:2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。

2015年的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。

分配:红包里的金额怎么算?为什么出现各个红包金额相差很大?

答:随机,额度在0.01和(剩余平均值2)之间。

例如:发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动。

当前面3个红包总共被领了40块钱时,剩下60块钱,总共7个红包,那么这7个红包的额度在:0.01~(60/72)=17.14之间。

注意:这里的算法是每被抢一个后,剩下的会再次执行上面的这样的算法(Tim老师也觉得上述算法太复杂,不知基于什么样的考虑)。

这样算下去,会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可。

如果前面的人手气不好,那么后面的余额越多,红包额度也就越多,因此实际概率一样的。

红包的设计

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

发性处理:红包如何计算被抢完?

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

通如何保持8w每秒的写入?

答:多主sharding,水平扩展机器。

据容量多少?

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

询红包分配,压力大不?

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

一个红包一个队列?

答:没有队列,一个红包一条数据,数据上有一个计数器字段。

有没有从数据上证明每个红包的概率是不是均等?

答:不是绝对均等,就是一个简单的拍脑袋算法。

拍脑袋算法,会不会出现两个最佳?

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

每领一个红包就更新数据么?

答:每抢到一个红包,就cas更新剩余金额和红包个数。

红包如何入库入账?

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

入帐出错怎么办?比如红包个数没了,但余额还有?

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

不过上图用的double计算,金额的精度会受影响,而且计算max的算法不严谨,会出现后面余额不够的情况,在它的基础上优化版本:1,改成java.math.BigDecimal实现,2,余额不够处理;

java实现微信抢红包_GitHub - collection8899/RedPackage: java 实现仿照微信抢红包算法相关推荐

  1. java读取war3模型_GitHub - wucao/jw3gparser: Java Warcraft Ⅲ Replay Parser(Java解析《魔兽争霸3》游戏录像工具)...

    jw3gparser Java解析<魔兽争霸3>游戏录像工具,可解析w3g.nwg(网易对战平台录像)格式录像. 使用方法 public class Test { public stati ...

  2. Java在Quant应用_GitHub - tigerfintech/tiger_quant: Java 实盘量化框架

    Tiger Quant 启动命令 TigerQuantBootstrap 是项目的Main方法入口,负责项目的启动. 停止命令 查出项目运行的进程 pid. ps -ef|grep TigerQuan ...

  3. java 应用 知乎_GitHub - liangsonghua/zhihu: JAVA仿知乎与redis应用

    用户:admin/admin liangsonghua/liangsonghua 注册登陆: 拦截器: @Component public class PassportInterceptor impl ...

  4. java售票界面设计_GitHub - CoderGeshu/StationTicketingSystem: Java GUI 系统设计:使用 Java Swing 编写的铁路售票应用系统...

    StationTicketingSystem 这是一个 Java GUI 系统设计:使用 Java Swing 编写的铁路售票应用系统. 技术栈 所使用到的技术:Java Swing + Java A ...

  5. java 对数取反_GitHub - giraffegzy/ex_java: java练习题(来源各个地方and难度随机)

    java基础练习题 1.检查是否为素数(素数:该数除了1和它本身以外不再有其他的因数的数被称为素数.) 2.打印出1-100的数,每十个数为一组. 3.接收一个层数值n,打印一个有n层的直角三角形,并 ...

  6. 微信企业号OAuth2.0授权-Java

    为什么80%的码农都做不了架构师?>>>    我也是醉了,中午做个饭这么难吃!连自己都看不下去了!怀着沉重的心情把微信企业号OAuth2.0授权看了看,感觉与公众号差别没什么,相信 ...

  7. java 微信群发多图文_[Java教程]httpClient实现微信公众号消息群发

    [Java教程]httpClient实现微信公众号消息群发 0 2016-09-21 20:00:10 1.实现功能 向关注了微信公众号的微信用户群发消息.(可以是所有的用户,也可以是提供了微信ope ...

  8. java 微商城开发_Java网上商城系统可以开微信商城吗

    开微信商城是现在非常火的一件事,我们身边有很多人都在开微信商城.而开发微信商城吗?MCmore小麦来为你解惑. Java网购商城系统和微信商城 网上商城系统是由很多种类型的,如java网上购物系统,p ...

  9. 微信机、网络和java的相关知识点

    TCP/IP体系和OSI参考模型 TCP/IP体系的网际层及其协议 网际协议(IP) Internet控制报文协议 地址解析协议 反向地址解析协议(RARP) 动态主机配置协议 TCP/IP体系的传输 ...

最新文章

  1. linux支持hd610显卡吗,HD610相当于什么显卡 HD610和HD630的区别 (全文)
  2. 再次体会wireshark的威力!
  3. 大受褒扬,BCH中国开发者走向世界!
  4. linux 内存日志,性能优化:使用ramlog将日志文件转移到内存中
  5. c#10:string内插处理
  6. (软件工程复习核心重点)第十章面向对象设计-第五节:设计数据管理子系统和设计类中的服务
  7. ORACLE EXPLAIN PLAN的总结 (优化SQL语句)
  8. Android 应用开发(31)---界面原型设计
  9. js遍历树节点下的所有子节点_「Javascript数据结构」× 二叉搜索树
  10. xml TO json
  11. Python学习路程day9
  12. 如何在 Mac 上的“音乐”应用和 iTunes 中创建 Genius 播放列表?
  13. Spire.pdf Pdf添加图片,无水印
  14. Written English-书面-现在进行时
  15. 数量关系--容斥原理
  16. 刚才对着电脑发呆了很久,天马行空想起在B站看到的两句话,感悟颇多,活出一个真正有灵魂的人吧。分享给大家。
  17. Frp配置——stcp及p2p模式
  18. EfficientDet: Scalable and Efficient Object Detection
  19. php wordpressCMS 网站局域网搭建--笔记
  20. 图像编辑系列之(2)基于StyleGAN(3)GAN逆映射(4)人脸 (5)语义生成 | ICCV2021生成对抗GAN梳理汇总...

热门文章

  1. java语言基础知识点
  2. 特权同学IP核心中的学习
  3. Google Adsense(谷歌网站联盟)广告申请指南
  4. Ubuntu1804换源
  5. 对“英语趣配音”学习软件的教学设计分析
  6. 安全的网络通道——网络准入之二层准入
  7. 区块链技术在物联网中应用的思路探讨
  8. shell脚本基础知识-什么是shell、环境变量
  9. JS中的两个感叹号是什么意思
  10. LC6936-TWS耳机方案