MENU

微信红包机制浅析

January 24, 2020 • 日常

过年了,抢红包这一全民运动再次兴起。

毕导在昨天发了《如何抢到大红包》这一视频。我看了后感觉挺有意思,就来唠唠抢红包这件事儿。

《如何抢到大红包》

微信红包架构

当有人在群里发了一个 N 人的红包,总金额 M 元,后台大概发生的事情如下:

发红包

  • 在数据库中增加一条红包记录,存储到CKV,设置过期时间;
  • 在 Cache(可能是腾讯内部 kv 数据库,基于内存,有落地,有内核态网络处理模块,以内核模块形式提供服务))中增加一条记录,存储抢红包的人数 N

抢红包

此操作分为两部分

抢操作在 Cache 层完成,通过原子减操作进行红包数递减,到 0 就说明抢光了,最终实际进入后台拆操作的量不大,通过操作的分离将无效请求直接挡在 Cache 层外面。

这里的原子减操作并不是真正意义上的原子减操作,是其 Cache 层提供的 CAS ,通过比较版本号不断尝试,存在一定程度上的冲突,冲突的用户会放行,让其进入下一步拆的操作,这也解释了为啥有用户抢到了拆开发现领完了的情况。

拆红包在数据库完成,通过数据库的事务操作累加已经领取的个数和金额,插入一条领取流水,入账为异步操作,这也解释了为啥在春节期间红包领取后在余额中看不到。

拆的时候会实时计算金额,其金额为

1 分到剩余平均值 2 倍之间随机数,一个总金额为 M 元的红包,最大的红包为 M * 2 /N(且不会超过 M )

当拆了红包后会更新剩余金额和个数。财付通按 20 万笔每秒入账准备,实际只到 8 万每秒。


以上即为微信红包的简要架构,我们所要知道的一点就是:

每个人能抢到的金额 ,服从 0.01 到二倍剩余均值间的均匀分布。

所以理论上后抢出大包的概率大。

如果你想抢到大红包,那么抢红包时应该先憋一会儿。但是别憋太久了,否则结果会是这样

Last Modified: March 18, 2020
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

已有 1 条评论
  1. 真实真实~一新来访~@(滑稽)