Skip to content

面试速答(先看这里)

**一句话结论:**拼手气红包的核心是确保每个参与者都有机会获得随机金额的红包,而总金额保持不变。

60秒标准回答:

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

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

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

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**抢红包的功能背后的算法一直没有被公开,但是基于一些网传的资料,以及我和wx内部的朋友的沟通,有一些思路,给大家分享下。
  • **要点2:**一种常见的实现方法是“ 二倍均值法 ”。
  • **要点3:**假设有一个总金额为100元的拼手气红包,共10个。
  • **要点4:**抢红包的算法我们基本上了解了,但是抢红包没那么简单,还需要考虑很多其他的问题,比如:
  • **要点5:**有人说微信红包金额是提前生成的,这个我问过他们,答案是实时计算的。

**记忆锚点:**红包的功能背后的算法 → 二倍均值法的具体算法 → 虑到微信红包的高并发 → 这里只讨论拼手气类 → 抢红包的算法 → 二倍均值法

关键取舍:

  • 抢红包的算法我们基本上了解了,但是抢红包没那么简单,还需要考虑很多其他的问题,比如: 性能问题 :抢红包需要在用户请求的那一刻能快速响应,对性能是有一定的要求的。
  • 高并发 :考虑到微信红包的高并发性质,后端系统需要优化数据库操作、缓存策略和网络通信,确保在高流量时仍然保持高性能和稳定性。

易错提醒:

  • 安全性 :防止作弊和攻击,如确保红包分配的随机性不能被预测或操纵。
  • 用户体验 :在确保公平性和随机性的同时,还需要考虑用户体验,如避免极端情况下的极小或极大红包金额。

加分表达:

  • 拼手气红包的核心是确保每个参与者都有机会获得随机金额的红包,而总金额保持不变。
  • 如果随机函数生成了一个6元的红包,那么更新后的总金额为94元,剩余红包数量为9个。

追问准备:

  • 围绕「红包的功能背后的算法」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「二倍均值法的具体算法」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「虑到微信红包的高并发」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

抢红包的功能背后的算法一直没有被公开,但是基于一些网传的资料,以及我和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,以此类推。

其他考虑 ​

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

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

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

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

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

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

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