外观
一句话答案
二倍均值法随机金额,Redis List 预生成→Lua 原子 LPOP 抢红包→MQ 异步落库转账。
核心要点
二倍均值法: 每次随机 [0.01, 剩余金额/剩余人数*2]
抢红包流程:
- 发红包:预生成金额列表存 Redis List
- 抢红包:Lua 原子 LPOP → 记录流水
- 异步:MQ → 落库转账
防并发: Redis 单线程 + Lua 原子操作
追问与易错
追问方向:
- 二倍均值法公平吗?
- 高并发怎么保证不超发?
- 过期未领完怎么处理?
易错点:
- ❌ 随机生成然后扣减——可能总额对不上应预生成
- ❌ 忽略极端情况——最后一个红包可能很大
💡 记忆锚点
红包三步曲:发——二倍均值法预生成金额列表(每次随机范围[0.01, 剩余/剩余人数*2],保证均匀)存Redis List;抢——Lua原子LPOP(Redis单线程天然防并发,不会超发);落——MQ异步写DB转账流水。预生成是关键:金额总和提前算好存好,抢的时候直接弹出,不现算。