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

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

* 功能点探索

* 新建红包:在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微信红包数据库表设计

- 红包流水表

()  ()     COMMENT ()     COMMENT ()     COMMENT ()     COMMENT ()     COMMENT ()     COMMENT  COMMENT       CURRENT_TIMESTAMP COMMENT  InnoDB AUTO_INCREMENT  CHARSETutf8mb4 COMMENT;

- 红包记录表

()  ()     COMMENT ()     COMMENT ()     COMMENT ()     COMMENT ()     COMMENT  COMMENT       CURRENT_TIMESTAMP COMMENT  InnoDB AUTO_INCREMENT  CHARSETutf8mb4 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分片技术 - 业务能动性,从发展的角度来看待业务- 观察总结,技术赋能业务

技术之家希望本篇文章对你有用!!

欢迎来到技术之家,

如需转载,烦请保留本文链接和出处:http://www.jszja.com/contents/14/1459.html

您的支持将是我们前进的动力!如对本篇文章有疑问或建议,请通过本站下方邮箱联系我们,让技术之家每天进步一点点!(●'◡'●)

java基础多线程抢红包_高并发开发-微信抢红包实现相关推荐

  1. Java——使用多线程模拟真实高并发业务并保证安全性(一)

    作者专注于Java.架构.Linux.小程序.爬虫.自动化等技术. 工作期间含泪整理出一些资料,微信搜索[javaUp],回复 [java][黑客][爬虫][小程序][面试]等关键字免费获取资料.技术 ...

  2. java抢红包并发设计_高并发开发之-使用redis抢红包设计

    假设一个需求,在某个预告活动中准备了10w个红包,100w人在某个时间点去开抢,每人只能抢1次,如何保证性能和准确性,下面我给出我的一个设计方案,抛砖引玉分析瓶颈查询用户是否已参与过活动 获取一个可抢 ...

  3. java设计模式并发_[高并发Java 七] 并发设计模式

    [高并发Java 七] 并发设计模式 [高并发Java 七] 并发设计模式 为什么80%的码农都做不了架构师?>>> 在软件工程中,设计模式(design pattern)是对软件设 ...

  4. Java多线程学习处理高并发问题

    在程序的应用程序中,用户或请求的数量达到一定数量,并且无法避免并发请求.由于对接口的每次调用都必须在返回时终止,因此,如果接口的业务相对复杂,则可能会有多个用户.调用接口时,该用户将冻结. 以下内容将 ...

  5. 线程基础,多线程架构,高并发,线程安全基础知识

    线程基础,多线程架构,高并发,线程安全基础知识 线程基础 一.线程安全 1.1概念:当多个线程访问某一个类(对象或者方法)时,这个类始终都能表现出正确额行为,那么这个类(对象或者方法)就是线程安全的. ...

  6. java currenttimemillis 效率_高并发场景下System.currentTimeMillis()的性能问题的优化

    前言 System.currentTimeMillis()的调用比new一个普通对象要耗时的多(具体耗时高出多少我也不知道,不过听说在100倍左右),然而该方法又是一个常用方法,有时不得不使用,比如生 ...

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

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

  8. Java生鲜电商平台-高并发核心技术订单与库存实战

    Java生鲜电商平台-高并发核心技术订单与库存实战 一. 问题 一件商品只有100个库存,现在有1000或者更多的用户来购买,每个用户计划同时购买1个到几个不等商品. 如何保证库存在高并发的场景下是安 ...

  9. oracle rac 高并发性能_高并发业务下 JVM 涉及的垃圾回收与性能问题分析与定位...

    最近好多 Java 的朋友问:"高并发业务场景下,JVM涉及的性能问题好难搞呀--".看来是大家的技术经验相对少了些,拿不准该从哪些地方上手,其实,每个技术人要该懂得怎样更好打造自 ...

最新文章

  1. Apache2.2中文手册
  2. HTTP 500 服务器内部错误的解决方法
  3. placeholder在不同浏览器下的表现及兼容方法
  4. python变量类型-Python 变量类型详解
  5. 华为交换机不同网段互访_华为S5700系列交换机使用高级ACL限制不同网段的用户互访...
  6. php 中 stream_select 中的小窟窿.
  7. 在Windows上搭建Go开发环境
  8. 验证性因子分析(三)
  9. 抛负载”ISO 7637-2测试标准讲解,车规级TVS管优选建议
  10. 《博弈论全家桶》(ACM / OI)(超全的博弈论 / 组合游戏大合集)
  11. python粒子特效_初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞
  12. 1158: 零基础学C/C++158——删除中间的*
  13. Java版Spring Cloud B2B2C o2o鸿鹄云商平台--概述
  14. zabbix微信报警
  15. HDU CCPC网络选拔赛 6441 Find Integer(数学)
  16. Java代码使用最小二乘法实现线性回归预测
  17. 合工大计算机录取分数,合肥工业大学适合“捡漏”的专业,录取分数最低
  18. Java IO模型:BIO、NIO、AIO讲解
  19. Mysql的四表练习题(一)
  20. 百度文库推广怎么做-百度文库推广技巧

热门文章

  1. Redis IO 多路复用机制
  2. 国科大学习资料–模式识别--第二次作业
  3. python 2维列表定义踩坑ans=[[0] * n] * m
  4. 购物车 mongoDB
  5. APP的登录认证与安全
  6. TKM32F499评估板使用评测之万事开头难先点个灯压压惊
  7. 张悟本教授----不吃药的食疗医病方案(一)
  8. MTK-4G安卓核心板MT6761平台介绍
  9. 【蓝桥杯单片机组第十一届省赛】— 客观试题
  10. 1019. 程序猿和产品狗