抢红包实现原理

本文详细探讨了微信红包的功能实现,包括数据库表设计、发红包和抢红包接口的实现,以及红包设计算法。核心操作涉及在Redis中进行原子减操作确保并发安全性,同时介绍了红包金额的实时计算和随机分配策略,以及在高并发场景下的性能扩展措施。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抢红包实现原理

微信红包原理业务探讨

功能点探索

在这里插入图片描述
功能点探索
1.新建红包:在DB、cache各新增一条记录
2. 抢红包:请求访问cache,剩余红包个数大于0则可拆开红包
3. key:1,value:20 string decr原子减,每次减1 ,而decreby减指定数量2
4.拆红包:20个红包里面有500块,key:1,value:50000(以分为单位) decreby 548,decreby 1055 ,decreby 2329
5.请求访问cache,剩余红包个数大于0则继续,同时获取可抢红包数与金额
6.计算金额(从1分到剩余平均值2倍之间随机数,如果不是最后一个红包,剩余金额预留最少1分给cas更新失败,最后一位拿红包的人)
7. cas更新数据库(更新红包计数表记录【剩余红包个数、剩余红包金额】、插入领取记录)
8.查看红包记录:用户进来直接查DB即可
在这里插入图片描述

微信红包数据库表设计

  • 红包流水表
 mysql
  CREATE TABLE `red_packet_info` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `red_packet_id` bigint(11) NOT NULL DEFAULT  0 COMMENT '红包id,采用timestamp+5位随机数', 
    `total_amount` int(11) NOT NULL DEFAULT 0 COMMENT '红包总金额,单位分',
    `total_packet` int(11) NOT NULL DEFAULT 0 COMMENT '红包总个数',
    `remaining_amount` int(11) NOT NULL DEFAULT 0 COMMENT '剩余红包金额,单位分',
    `remaining_packet` int(11) NOT NULL DEFAULT 0 COMMENT '剩余红包个数',
    `uid` int(20) NOT NULL DEFAULT 0 COMMENT '新建红包用户的用户标识',
    `create_time` timestamp  COMMENT '创建时间',
    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值