如何设计一个抢红包系统?
如何设计一个抢红包系统?
月伴飞鱼需求分析
包红包:
- 系统为每个红包设置一个
ID,然后将红包发送个用户。
- 这里需要设置 红包金额,红包个数,要发送的用户,存储这些信息。
发红包:
- 设置完红包参数后,微信支付,完成付款,然后收到付款成功通知,红包系统更新红包订单状态,更新为已支付,并写入红包发送记录表。
- 这样用户可以将用户的红包信息和红包的收发记录发出,红包系统调用微信通知,将红包信息发送到微信群。
抢红包:
- 微信群用户收到红包后,点开,红包系统会校验红包是否被抢完,是否过期。
拆红包:
- 拆红包时,要先查询红包订单,判断是否可拆,计算本次拆的红包金额,记录抢红包流水。

锁库存,插入秒杀记录,更新库存。
拆红包过程:
扣减库存和秒杀记录的操作,更新库存就是更新红包发送的订单,还有就是写入秒杀记录就是写入红包领取的信息流水。
还需要以用户为中心记录用户整体领了多少红包。
最后调用支付系统将拆红包后的金融转入用户余额,成功之后更新抢红包的订单状态为转账成功。
为提高性能,往往将库存信息放到内存 Cache 中, 内存 Cache 操作成功后给 Server 返回成功,然后异步落 DB 持久化。
微信红包设计
微信红包用户发一个红包时,有一个系统 ID ,作为这个红包的唯一标识,接着有 包,发 ,抢,拆 都与 ID 关联。
红包系统根据 ID,按照一定规则,垂直上下切分,切分后一个垂直链条上的逻辑
Server服务器。包含一个DB,同一个红包 ID 的所有请求均路由到同一个
Set内处理。同个红包 ID 的所有请求,按照红包 ID 路由到同一个
Set,一个逻辑Server会存在多个Server。
- 但是 这些
Server共享同一个 DB。
把海量的抢红包系统分成一个个的小型秒杀系统。
在调度处理中,通过对红包 ID 哈希取模,将一个个请求打到多台服务器上解耦处理。
然后,为了保证每个用户抢红包的先后顺序,把一个红包相关的操作串行起来,放到一个队列里面,依次消费。
一台服务器可能会同时处理多个红包的操作:
- 所以,为了保证消费者处理
DB不被高并发打崩,还需要在消费队列时用缓存来限制并发消费数量。抢红包业务消费时由于不存储数据,只是用缓存来控制并发。
- 所以可以选用大数据量下性能更好的
Memcached。
除此之外,在数据存储上,可以用红包 ID 进行哈希分表,用时间维度对 DB 进行冷热分离。
红包加锁
从业务来看,加锁可能会带来一些额外的问题:
抢红包时大量用户涌入,但只有一个可以成功,其它的都会失败并给用户报错,导致用户体验极差。
抢红包时,如果第一时间有很多用户涌入,都失败回滚了,过一段时间并发减小后,反而让手慢的用户抢到了红包。
大量无效的更新请求和事务回滚,可能给
DB造成额外的压力,拖慢处理性能。总的来说,乐观锁适用于数据竞争小,冲突较少的业务场景,而悲观锁也不适用于高并发场景的数据更新。
因此对于抢红包系统来说,加锁是非常不适合的。















