- 如果上司给一个任务,让我们在实现微信抢红包这个功能,我们该怎么做?

* 业务思考,实现方式千百种,不追求方法复制,只追求推导过程的思考总结

* 功能点探索

* 新建红包:在DB、cache各新增一条记录

* 抢红包:请求访问cache,剩余红包个数大于0则可拆开红包

* key:1,value:20 string decr原子减,每次减1 , 而decreby减指定数量N

* 拆红包: 20个红包里面有500块,key:1,value:50000(以分为单位) decreby 548,decreby 1055 ,decreby 2329

* 请求访问cache,剩余红包个数大于0则继续,同时获取可抢红包数与金额

* 计算金额(从1分到剩余平均值2倍之间随机数,如果不是最后一个红包,剩余金额预留最少1分给cas更新失败,最后一位拿红包的人)

* cas更新数据库(更新红包计数表记录【剩余红包个数、剩余红包金额】、插入领取记录)

* 查看红包记录:用户进来直接查DB即可

1微信红包数据库表设计

- 红包流水表

CREATE TABLE`red_packet_info` (

`id`int(11) NOT NULLAUTO_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 UPDATECURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY(`id`) )

ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='红包信息表,新建一个红包插入一条记录';

- 红包记录表

CREATE TABLE`red_packet_record` (

`id`int(11) NOT NULLAUTO_INCREMENT,

`amount`int(11) NOT NULL DEFAULT '0' COMMENT '抢到红包的金额',

`nick_name`varchar(32) NOT NULL DEFAULT '0' COMMENT '抢到红包的用户的用户名',

`img_url`varchar(255) NOT NULL DEFAULT '0' COMMENT '抢到红包的用户的头像',

`uid`int(20) NOT NULL DEFAULT '0' COMMENT '抢到红包用户的用户标识',

`red_packet_id`bigint(11) NOT NULL DEFAULT '0' COMMENT '红包id,采用timestamp+5位随机数',

`create_time`timestamp COMMENT '创建时间',

`update_time`timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY(`id`) )

ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='抢红包记录表,抢一个红包插入一条记录';

- 将库表导入数据库

- 通过mybatis generator生成代码

2发红包接口实现

- 发红包功能接口开发

* 新增一条红包记录

* 往mysql里面添加一条红包记录

* 往redis里面添加一条红包数量记录 decr

* 往redis里面添加一条红包金额记录 decreby

- 抢红包功能接口开发

* 抢红包功能属于原子减操作

* 当大小小于0时原子减失败

- 当红包个数为0时后面进来的用户全部抢红包失败,并不会进入拆红包环节

- 抢红包功能扩展设计

* 将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回

* 类推出token令牌和秒杀设计原理

- 注意点

* 抢到红包不到能拆成功

* 2014年的红包一点开就知道金额,分两次操作,先抢到金额,然后再转账。

2015年后的红包的拆和抢是分离的,需要点两次,因此会出现抢到红包了,但点开后告知红包已经被领完的状况。进入到第一个页面不代表抢到,只表示当时红包还有。

3 抢红包接口实现

- 抢红包功能接口开发

* 在抢红包这里并不能保证用户已经能领到这个红包

- 抢红包只是做了一个判断,判断当前是否还有红包

- 有红包则返回可以领

- 没红包则返回不可以领

- 拆红包功能接口开发

* 拆红包才是用户能领到红包

* 这时候要先减redis里面的金额和红包数量

* 减完金额再入库

4微信红包设计算法分析

- 玩法:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储

- 分配:

* *发100块钱,总共10个红包,那么平均值是10块钱一个,那么发出来的红包的额度在0.01元~20元之间波动*

* 当前面4个红包总共被领了30块钱时,剩下70块钱,总共6个红包,那么这7个红包的额度在:0.01~(70➗6✖️2)=23.33之间波动(红包金额/个数*2)

* 这样算下去,可能会超过最开始的全部金额,因此到了最后面如果不够这么算,那么会采取如下算法:保证剩余用户能拿到最低1分钱即可

- 存储:数据库会累加已经领取的个数与金额,插入一条领取记录。入账则是后台异步操作

- 转账:通过财付通往红包所得者账户转账,过程通过是异步操作

抢红包项目总结

- take all操作

- 入库转账时需要保证红包个数和红包剩余金额正确

- 高并发处理:红包如何计算被抢完?

- cache会抵抗无效请求,将无效的请求过滤掉,实际进入到后台的量不大。cache记录红包个数,原子操作进行个数递减,到0表示被抢光

- 性能扩展

* 多主sharding,水平扩展机器

* 数据库层面sharding分片

* redis层面sharding分片技术

- 业务能动性,从发展的角度来看待业务

- 观察总结,技术赋能业务

微信抢红包的方案_高并发10-微信抢红包实现相关推荐

  1. 高并发处理方案_高并发系统下的缓存解决方案

    什么样的数据适合做缓存? 缓存和DB数据一致性在之前已讲过,详细可参考下面阅读推荐<如何保障mysql和redis之间的数据一致性>,我们这里讲一讲缓存穿透.缓存雪崩和击穿的三种场景解决方 ...

  2. java基础多线程抢红包_高并发开发-微信抢红包实现

    - 如果上司给一个任务,让我们在实现微信抢红包这个功能,我们该怎么做? * 业务思考,实现方式千百种,不追求方法复制,只追求推导过程的思考总结 * 功能点探索 * 新建红包:在DB.cache各新增一 ...

  3. 视频教程-企业微信支付JAVA版_向员工收款-微信开发

    企业微信支付JAVA版_向员工收款 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信息 ...

  4. 微信抢红包的方案_免费公开实收20000的烤鸭店营销方案,餐饮行业可复用

    此篇分享,是来自内部学员的语音转文字,全篇删除了些许语气词,内容是完整的.逻辑上可能有点天马行空,但很适合餐饮人通过移动互联网迅速引爆客流. 主题:李总实操分享如何引爆一家烤鸭店客流量 我不太会分享, ...

  5. 微信抢红包的方案_微信抢红包怎样才能抢到最大的告诉你一个方法

    抢红包眼疾手快, 发红包精打细算, 可算起账来为什么还是亏?! 抢到大红包就是好事吗? 元旦节的时候,一个壕同学在群里发了一个大红包,刚洗完脚的我凭借一个唯美的睡姿抢到了最大的一个,50多块. 正当我 ...

  6. Java实现库存防超卖_高并发场景-订单库存防止超卖

    背景 在电商系统中买商品过程,先加入购物车,然后选中商品,点击结算,即会进入待支付状态,后续支付. 过程需要检验库存是否足够,保证库存不被超卖. 场景一:买家需要购买数量可以多件 场景二:秒杀活动,到 ...

  7. .netcore大型商城系统源码_前后端完全分离_高并发支持_八大数据库

    OctShop是一个底层用C#,.net core 6.0编写的大型专业级的,B2B2C+O2O一体化的商城系统,并免费提供商城所有系统源码. API接口和系统SDK多语言支持,也可根据客户需求定制相 ...

  8. 5000并发的qps是多少_高并发初体验记录-02

    前言 这半个多月完成了这次活动的业务代码开发和测试,至于性能调优对我而言近乎玄学.总结记录,以备参考.如有错误,欢迎指正.不过其实大佬不用浪费时间看这篇低质量的流水账了. 实测过后,一个月前老板给我说 ...

  9. mysql并发获取唯一数值_高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]...

    需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...

  10. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

最新文章

  1. 虚拟服务器的运行原理,虚拟机复制的工作原理
  2. Linux避免重复添加,重新封装一个iptables防止规则重复
  3. jquery实现表格中点击相应行变色功能
  4. WF工作流开发回顾:介绍
  5. 【控制】传递函数的性质
  6. 【IT人的管理进阶课】如何提升带团队的能力
  7. Notebook中?的trick
  8. patator mysql 字典_利用patator进行子域名爆破
  9. svn查看某个时间段的日志信息
  10. SpringBoot(1.5.6.RELEASE)源码解析(三)
  11. GRE tunnel 2
  12. 计算机系统组成导学案,单元一任务2认识计算机系统的组成导学案.pdf
  13. 计算机屏幕上的显示记录,什么样的桌面日历便笺既可以显示日期又可以提醒我所记录的时间表...
  14. Mac 安装仿宋GB2312 For Word/WPS
  15. 一个完整的数据挖掘项目-纽约市建筑能源之星预测
  16. 微型计算机课程设计电子密码锁,《微机原理及应用》课程设计基于74LS112的电子密码锁设计报告初版...
  17. 使用Java实现一个简单的贪吃蛇小游戏
  18. R语言 霍尔特指数平滑法(Holt)
  19. 注册造价工程师用书免费电子版_2019-2020造价工程师各科电子教材精讲高清课件拿来和大家免费分享.......
  20. Android代码心得6-Intent的使用

热门文章

  1. 软考高级 真题 2011年下半年 信息系统项目管理师 综合知识
  2. 读书感受 之 《心理学入门》
  3. C语言 栈的应用 :火车的调度(软硬座)
  4. java支付宝转账到银行卡_Java 支付宝支付,退款,单笔转账到支付宝账户(单笔转账到支付宝账户)...
  5. linux gst qt,c – 致命错误:gst / gst.h:没有这样的文件或目录(使用CMake)
  6. python逐行读取xls文件
  7. elementUI的 tree搜索过滤,可识别拼音,且不区分大小写
  8. 实验三mysql查询_实验三 数据库的查询实验
  9. 如何查看IP地址是否被占用
  10. 谢国忠:2012年股市、楼市泡沫终将破灭