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

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

Java微信抢红包实现
  * 功能点探索

* 新建红包:在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即可

Java微信抢红包实现

1微信红包数据库表设计

红包流水表

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`) )
ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='红包信息表,新建一个红包插入一条记录';
  • 红包记录表
CREATE TABLE `red_packet_record` (
`id` int(11) NOT NULL AUTO_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 UPDATE CURRENT_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分片技术
  • 业务能动性,从发展的角度来看待业务
  • 观察总结,技术赋能业务

我是Java工程师,如果你现在也在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中有遇见任何关于学习方法,学习路线等方面的问题,都可以申请加入我的Java学习交流群:3907814,里面聚集了很多正在自学Java的初学者,文件里面还有我做Java技术这段时间整理的一些Java学习手册,面试题,开发工具,PDF文档书记教程,需要的话都可以自行来浏览获取。

Java微信抢红包实现相关推荐

  1. java实现qq抢红包_微信抢红包到底是怎么抢到的?

    " 微信抢红包功能,一下子拉近了长辈与我们之间的距离,每年都是盼望着亲人群抢红包,今天来给大家分享一下,为啥抢红包有人多,有人少,什么时候抢最合适?" 01 - 微信抢红包 场景描 ...

  2. java模拟微信抢红包金额算法规则二倍均值法模拟(满满的注释)

    二倍均值法模拟微信抢红包金额算法规则 ```java /*** 二倍均值法* @param amount 总金额* @param min 最小金额* @param num 个数* 本帖只提供思路,实际 ...

  3. Java模拟微信抢红包

    import java.util.Scanner; import java.util.Random;public class RedBags{public static void main(Strin ...

  4. Java应用_模拟微信抢红包

    如何用Java实现一个微信抢红包的过程呢? Main.java package redEnvelope;import java.util.Scanner;public class Main {publ ...

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

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

  6. 我是如何用微信抢红包一年抢了一千万的

     以前工作养成的习惯.每到这个时候都该写年终总结了.2015年给我最震撼的依旧是互联网,我从里面学到了很多,也得到了很多.本着互联网开源分享的精神,我说说我这一年都干了什么,如何从一个屌丝赚到第一 ...

  7. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  8. 抢红包 html 模板,微信抢红包源码和模拟demo

    微信抢红包源码和模拟demo 资源下载此资源下载价格为3D币,请先登录 资源文件列表 K_wechat/.classpath , 475 K_wechat/.project , 844 K_wecha ...

  9. java 微信抽奖_微信随机生成红包金额算法java版

    最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发. public class WxAlgorithm{ / ...

最新文章

  1. rehl7.3部署K8s集群
  2. windows 程序员电脑设置
  3. 基于HTML5移动web应用
  4. html iframe 播放视频播放,播放iframe视频点击链接javascript
  5. 2018年计算机学校迎新标语,2018学校迎新标语大全.doc
  6. 单处理机系统的进程调度实验_Chcore -- 上交IPADS操作系统银杏书配套Lab实验笔记 - Lab3进程与异常(一)...
  7. 搭建集群负载均衡系统
  8. 双十一喜报式实时成交额今年没了
  9. ELDD Chapter 2..3 Linux Kernel Facilities
  10. Microsoft Office 2016 简体中文 Vol 版镜像下载(Pro Plus、Visio、Project 下载)
  11. Visual C++——定时器(计时器)SetTimer函数
  12. mac book pro 音频设备启动失败
  13. 欧姆龙plc解密实例_欧姆龙PLC CP1H解密实例
  14. python实现onvif客户端及问题小结
  15. 白光led 计算机模拟,大动态白光LED光辐射模拟器
  16. 谷歌浏览器(chrome)版本与驱动对照表
  17. 《设计模式之禅》目录
  18. 反编译微信小程序(图文详细傻瓜式)
  19. 校园歌手信息评分系统(C语言),大一新生期末实训
  20. 在服务器上安装Linux系统

热门文章

  1. YOLO---Darknet下的学习笔记
  2. Win7系统CUDA和cuDNN的安装(选择合适的版本号)
  3. vc2010c语言使用教程,【精选】Lesson 01 C语言基础及VC2010使用指导(02.24).pdf
  4. 快手小风车跳转微信生成超链接
  5. 《电脑音乐制作实战指南:伴奏、录歌、MTV全攻略》——1.4 用电子琴软件弹奏MIDI音乐伴奏...
  6. 李玉婷MYSQL进阶06-连接查询
  7. win10怎么添加计算机共享的打印机,win10系统怎么添加共享打印机?打印机共享设置方法...
  8. 2021校招_满帮(运满满)
  9. 萧乾升:4.12今日财经风险提示
  10. 人工智能管家离我们已不远