✅如何实现一个抢红包功能?

典型回答

抢红包的功能背后的算法一直没有被公开,但是基于一些网传的资料,以及我和wx内部的朋友的沟通,有一些思路,给大家分享下。这里只讨论拼手气类型的。普通红包要比这个简单的多。

基本原则

拼手气红包的核心是确保每个参与者都有机会获得随机金额的红包,而总金额保持不变。算法需要满足以下基本原则:

  1. 公平性:每个人都应该有机会获取不同金额的红包。
  2. 随机性:红包的金额应该是随机分配的,不可预测。
  3. 非零原则:每个红包的金额最小1分钱。
  4. 总额不变:所有红包的总金额等于用户设定的总金额。

二倍均值法

一种常见的实现方法是“二倍均值法”。

二倍均值法的具体算法过程如下:

  1. 确定金额范围:对于每次抢红包,确定每个红包金额的范围。假设剩余红包金额为M,剩余红包数量为N,则每个红包金额的上限为(M/N)*2,这确保了后面的人也有机会抢到金额相对较多的红包。
  2. 随机分配:根据上述金额范围,使用随机函数生成每个红包的金额,同时确保每个红包的金额不低于最小金额单位。
  3. 更新状态:每分配一个红包,更新剩余红包金额和剩余红包数量。

假设有一个总金额为100元的拼手气红包,共10个。对于第一个红包,最大金额为(100/10)2=20元。如果随机函数生成了一个6元的红包,那么更新后的总金额为94元,剩余红包数量为9个。对于下一个红包,最大金额将为(94/9)2,以此类推。

其他考虑

抢红包的算法我们基本上了解了,但是抢红包没那么简单,还需要考虑很多其他的问题,比如:

  • 性能问题:抢红包需要在用户请求的那一刻能快速响应,对性能是有一定的要求的。
  • 高并发:考虑到微信红包的高并发性质,后端系统需要优化数据库操作、缓存策略和网络通信,确保在高流量时仍然保持高性能和稳定性。
  • 安全性:防止作弊和攻击,如确保红包分配的随机性不能被预测或操纵。
  • 用户体验:在确保公平性和随机性的同时,还需要考虑用户体验,如避免极端情况下的极小或极大红包金额。

但是,因为一个微信群中的人数是有上限的,并且红包的数量也是有上限的,所以这个并发度其实是可控的,并且对于单个红包来说,热点问题也并没有那么明显。

有人说微信红包金额是提前生成的,这个我问过他们,答案是实时计算的。主要原因是一方面实时计算效率也很高,并且提前算好会占用内存(因为有些红包不会被抢到之后就会退回,所以浪费空间)。

关于高并发防控、热点问题、防止黄牛这些大家可以参考:

✅让你设计一个秒杀系统,你会考虑哪些问题?

原文: https://www.yuque.com/hollis666/xkm7k3/el7oz10w01tkc2cm