分布式秒杀方案--java

前提:先把商品详情和秒杀商品缓存redis中,减少对数据库的访问(可使用定时任务)
秒杀商品无非就是那几步(前面还可能会有一些判断,如用户是否登录,一人一单,秒杀时间验证等)
1一人一单
2.判断库存
3.减库存
4.创建订单

秒杀需要解决的问题?

1.解决超卖问题

1.1这样秒杀肯定会出现超卖的情况,所以必须加锁。加锁无非就两种锁,乐观锁和悲观锁。
悲观锁:直接在1前上锁即可,这里使用redisson里的可重入锁

        // 获取分布式锁对象RLock lock = redissonClient.getLock("seckillLock");try {//等待5秒获取锁,执行60秒还是没有释放锁就强制释放boolean b = lock.tryLock(5L, 60L, TimeUnit.SECONDS);if (b){SeckillProductVo  seckillProductVo = seckillProductService.find(time, seckillId);//1.保证库存足够if (seckillProductVo.getStockCount()<=0){return Result.error(SeckillCodeMsg.SECKILL_STOCK_OVER);}//下面两个方法必须写在一起避免事务未提交,未扣减库存就释放锁//2.扣减库存//3.生成订单orderInfo=orderInfoService.doSeckill(phone,seckillProductVo);}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}

1.2乐观锁:这个就不需要用代码演示了
1一人一单
2.判断库存
3.减库存
4.创建订单

在3.减库存的时候mysql语句 and 库存>0即可,MySQL会有自己的行锁。所以每次只会执行一次修改操作。以上两个方法都不会造成超卖
但是却未能解决秒杀问题,原因高并发请求都进入了数据库来查库,会造成数据库崩溃或阻塞其它mysql的执行。

2.重复下单问题,如何解决?

2.1 在4.创建订单后,把用户的唯一标识,id或phone存入redis的set中 key->{phone1,phone2}
redisTemplate.opsForSet().isMember(orderKey,phone)返回true或false
流程变成 1.一人一单 2.判断库存 3.减库存 4.创建订单 5.redisTemplate.opsForSet().add(orderKey,phone);

2.2 但是这样并不能完全解决重复下单,比如用户同时点了两次请求。极端条件下,a线程进入步骤1的判断,从1到4 需要进行很多操作,当a线程未走到5时,b线程就进来了这样也会造成重复下单。所以必须使用数据库的唯一索引进行解决,把用户唯一标识和秒杀商品唯一标识做成唯一索引即可解决
在这里插入图片描述
也就是在 4.创建订单 的时候会出现报错,3库存减掉之后数据回滚即可。
然而redis里的库存却和数据库的就不一样了,redis是无法被回滚的。后面会使用cannal对数据库和redis的库存进行同步。。。
有些人可能会说了,2.1没有解决重复问题,为什么不直接用2.2解决?2.1在大部分情况下都能解决,避免有人多次点击秒杀对数据造成压力,所以2.1和2.2一起使用才是最佳的选择

3.流量控制
3.1 必须把请求拦截在数据库之外,如果库存只有10个,也只有10个线程能最终到达数据库就是一个比较理想的方案
所以把数据库的秒杀商品库存存入redis中,进行预售,只有redis里能执行-1操作才能进入service,这样就极大的减少了请求到service层中

3.2 如果同一个秒杀时间段有多个商品 如100个秒杀商品,每个秒杀商品的库存为10个,那么就会有10*100个请求到达数据库,如果是淘宝的双11显然秒杀的商品会更多。那么我们就需要进行流量的削峰控制。
在这里插入图片描述
从controller中拦截消息,service取消息的时候慢慢拿,mq能够占时的让一部分请求存储在里面排队处理,service根据自己的处理能力去拿。有些人可能会说排队处理不是很慢?在controller中发完消息这个请求已经可以算是结束了,用户不会立即看到抢购结果。后面经过
在这里插入图片描述

在这里插入图片描述
最终方案
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/73083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV 03(数据结构--Mat)

一、Mat介绍 Mat是OpenCV在C语言中用来表示图像数据的一种数据结构.在python中转化为numpy的ndarray. Mat由header和data组成, header中记录了图片的维数, 大小, 数据类型等数据. 1.1 Mat拷贝 - Mat共享数据 在python中Mat数据对应numpy的ndarray, 使用numpy提供的深浅拷贝方…

C++——类与对象(下篇)

前言 前面已经介绍了类与对象&#xff08;上&#xff09;&#xff0c;类与对象&#xff08;中&#xff09;的两篇文章&#xff0c;下面是类与对象的最后一些重要知识点的介绍和总结。 目录 再谈构造函数Static成员友元内部类匿名对象拷贝对象时的一些编译器优化再次理解封装…

使用wkhtmltoimage实现生成长图分享

需求 用户可以选择以长图的形式分享本网页 方法 wkhtmltopdf wkhtmltopdf url filewkhtmltoimage url file java Runtime.getRuntime().exec() 下载 直接去官网下载对应的版本&#xff1a;官网 命令行使用WK > wkhtmltopdf https://www.nowcoder.com /opt/project/…

redis高可用——主从复制、哨兵模式、cluster集群

1、redis群集有三种模式 分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cIustr群集 主从复制:主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的…

功能测试常用的测试用例大全

登录、添加、删除、查询模块是我们经常遇到的&#xff0c;这些模块的测试点该如何考虑 1)登录 ① 用户名和密码都符合要求(格式上的要求) ② 用户名和密码都不符合要求(格式上的要求) ③ 用户名符合要求&#xff0c;密码不符合要求(格式上的要求) ④ 密码符合要求&#xff0c;…

WireShark抓包工具的安装

1.下载安装包 在官网或者电脑应用商城都可以下载 2.安装 打开安装包&#xff0c;点击next 点击next 选择UI界面&#xff0c;两种都装上 根据习惯选择 选择安装位置点击安装 开始安装安装成功

CMake+CLion+Qt配置

在这里我下载MSVC的工具包&#xff0c;并没有下载Visual Studio。 配置编译环境 下载Visual Studio&#xff0c;其中有MSVC编译工具&#xff0c;下载MSVC工具包&#xff0c; 工具包下载链接&#xff1a;https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ …

SQL Server 跨库/服务器查询

这里写目录标题 1 SQL Server 跨库/服务器查询1.1 跨库查询1.2 跨服务器查询1.2.1 创建链接服务器1.2.2 跨库查询 1.3 拓展&#xff1a;SQL Server 中所有权和用户与架构的分离 1 SQL Server 跨库/服务器查询 1.1 跨库查询 在同一服务器下的跨库查询较为简单&#xff0c;示例…

macOS Ventura 13.5.2(22G91)发布,附黑/白苹果镜像下载地址

系统介绍&#xff08;下载请百度搜索&#xff1a;黑果魏叔&#xff09; 黑果魏叔 9 月 8 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5.2 更新&#xff08;内部版本号&#xff1a;22G91&#xff09;&#xff0c;本次更新距离上次发布隔了 21 天。 本次更新查…

ABY2.0:更低的通信开销

参考文献&#xff1a; [ABY] Demmler D, Schneider T, Zohner M. ABY-A framework for efficient mixed-protocol secure two-party computation[C]//NDSS. 2015.[ABY3] Mohassel P, Rindal P. ABY3: A mixed protocol framework for machine learning[C]//Proceedings of the…

【数据结构初阶】二、 线性表里的顺序表

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】一. 复杂度讲解_高高的胖子的博客-CSDN博客 1 . 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实…

WMS仓储管理系统的功能与WCS系统有什么区别

在物流行业的现代化管理中&#xff0c;WMS仓储管理系统和WCS仓库控制系统是两个重要的组成部分。虽然它们都是用于仓库管理的软件系统&#xff0c;但是它们的功能和应用场景有很大的区别。本文我们将详细阐述这两者的功能和区别。 一、WMS仓储管理系统 WMS是一种软件系统&…

科技资讯|苹果Vision Pro获得被动冷却系统及数字表冠控制界面专利

据patentlyapple报道&#xff0c;美国专利商标局正式授予苹果一项与头戴式设备&#xff08;Apple Vision Pro&#xff09;相关的专利11751366&#xff0c;该设备可以提供被动冷却系统&#xff0c;利用光学组件的表面来管理热量&#xff0c;而不会对用户显示的视觉信息产生不利影…

计算机竞赛 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

[C++]杨辉三角

目录 题目 解题思路 代码实现 获取数字 打印函数 主函数 全部代码 运行结果 题目 给定一个非负整数numRows &#xff0c;生成「杨辉三角」的前numRows行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 解题思路 第k列的第i个数字的值第k-1列的(…

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

Linux编辑器vim

目录 一、vim的几种模式 1、命令模式 2、编辑/插入模式 3、底行模式 ①增加行号 ②分屏操作 ③不退出vim执行命令 4、替换模式 二、vim的常见命令 1、yy命令 2、p命令 3、dd命令 4、u命令 5、Ctrl r命令 6、shirtg命令 7、gg命令 8、shirt6命令 9、shirt4命…

查看视频文件关键帧间隔

一、Elecard StreamEye Tools拖放视频文件查看。 红的是I帧&#xff1b;蓝的是P帧&#xff1b;绿的是B帧。 二、ffprobe -show_streams统计。 1、统计视频关键帧、非关键帧 ffprobe.exe -i 1.mp4 -show_streams v -show_packets -print_format json > d:\1.json 再统计1.j…

[SSM]MyBatisPlus拓展

五、拓展篇 5.1逻辑删除 在电商网站中&#xff0c;我们会上架很多商品&#xff0c;这些商品下架以后&#xff0c;我们如果将这些商品从数据库中删除&#xff0c;那么在年底统计商品的时候&#xff0c;这个商品要统计的&#xff0c;所以这个商品信息我们是不能删除的。 如果商城…

分布式锁怎么抗高并发 redis

比如&#xff0c;多个人下单某一个商品 怎么处理 分段加锁 合并扣减。 这里首先要让redis是集群&#xff0c;避开单机性能问题。 大概意思就是将商品分摊到多个服务器上&#xff0c;这样就减轻了单台的压力