过家家项目:如何设计抢红包
在我的项目“过家家”里,有一个抢红包的功能。功能类似微信抢红包。 抢红包的基本逻辑 v1(低并发)抢红包时实时使用二倍均值法计算,只使用MySQL 1. 红包创建流程 用户发红包时,指定总金额与红包个数 系统将总金额拆分为指定数量的红包 红包数量约束: 最少为 1 个 最多不能超过群成员数量 2. 红包金额分配策略 单个红包:不进行随机计算,抢到即获得全部金额 多个红包:采用二倍均值法进行随机分配 当前用户最大可抢金额 = 剩余金额 / 剩余人数 × 2 实际可抢区间为 [0.01, 最大可抢金额 - 0.01] 下限 0.01 元:保证每个抢到的用户都有收益 上限减 0.01 元:保证剩余红包仍有余额可抢 边际示例:10 元红包 2 人分,第 1 人可抢区间为 [0.01, 9.99] 3. 数据持久化与防刷控制 红包创建后入库存储 发红包限流:同一用户 10 秒内仅允许发送 1 个红包,防止手抖误操作 4. 抢红包并发控制 防重复抢:在 redpacket_grabs 表中建立 (userId, redpacketId) 联合唯一索引,确保同一用户对同一红包仅能抢一次 防超卖:采用数据库乐观锁机制 更新 redpacket 表时,必须同时满足: remaining_count > 0 remaining_amount >= 本次扣减金额 5. 方法缺点 每次请求直接打数据库,导致响应时间没有访问内存快 每次请求都会使用二分均值法计算抢到的金额,并且做超卖判断,比较麻烦 v2 (高并发)红包创建好了就已经固定了抢红包的数量和个数,加入Redis 大致流程 ...