听说你会架构设计?来,弄一个微信群聊系统( 四 )


抢红包的交互步骤如下:

  1. 抢红包:抢操作在 Redis 缓存层完成,通过原子递减的操作来更新红包个数,到 0 后就说明抢光了 。
  2. 拆红包:拆红包时,首先会实时计算金额,一般是通过二倍均值法实现(即 0.01 到剩余平均值的 2 倍之间) 。
  3. 红包记录:用户获取红包金额后,通过数据库的事务操作累加已经领取的个数和金额,并更新红包表和记录表 。
  4. 转账:为了提升效率,最终的转账为异步操作,这也是为什么在春节期间 , 红包领取后不能立即在余额中看到的原因 。
 
6.3 红包分配算法红包金额分配时,由于是随机分配 , 所以有两种实现方案:实时拆分和预先生成 。
1、实时拆分实时拆分,指的是在抢红包时实时计算每个红包的金额 , 以实现红包的拆分过程 。
这个需要我们设计一个好的拆分算法,让红包拆分时一直保证后续待拆分红包的金额不能为空 。
实时拆分时 , 不容易做到拆分的红包金额服从正态分布规律 。
 
2、预先生成预先生成,指的是在红包开抢之前已经完成了红包的金额拆分,抢红包时只是依次取出拆分好的红包金额 。
这种方式对拆分算法要求较低,可以拆分出随机性很好的红包金额 , 但通常需要结合队列使用,而且需要多设计一个表来存储红包的拆分金额 。
 
3、二倍均值法综合上述优缺点考虑,以及微信群聊中的人数不多(目前最高 500 人) , 所以我们采用实时拆分的方式,用二倍均值法来生成随机红包,只满足随机即可,不需要正态分布 。
故可能出现很大的红包差额,但这更刺激不是吗
【听说你会架构设计?来,弄一个微信群聊系统】


推荐阅读