Redis优惠券秒杀超卖问题
Redis秒杀超卖问题
- 前言
- 一、出现秒杀超卖的原因
- 二、超卖解决方案
- 使用乐观锁解决超卖问题
- 程序中进行解决
前言
这是我认为b站上最好的redis教程,各方面讲解透彻,知识点覆盖比较全。
黑马redis视频链接:B站黑马redis教学视频
本文参考黑马redis课程笔记
一、出现秒杀超卖的原因
超卖问题分析:
在我们原有代码中是这么写的
if (voucher.getStock() < 1) {// 库存不足return Result.fail("库存不足!");}//5,扣减库存boolean success = seckillVoucherService.update().setSql("stock= stock -1").eq("voucher_id", voucherId).update();if (!success) {//扣减库存return Result.fail("库存不足!");}
假设线程1过来查询库存,判断出来库存大于1,正准备去扣减库存,但是还没有来得及去扣减,此时线程2过来,线程2也去查询库存,发现这个数量一定也大于1,那么这两个线程都会去扣减库存,最终多个线程相当于一起去扣减库存,此时就会出现库存的超卖问题。
超卖原因流程图:

二、超卖解决方案
超卖问题是典型的多线程安全问题,针对这一问题的常见解决方案就是加锁:而对于加锁,我们通常有两种解决方案:

由于加入悲观锁,他认为安全问题一定发生,所以一定会获取锁进行串行执行,这样程序的性能跟吞吐量等受到很大的影响,效率大大降低,不到万不得已不使用悲观锁
使用乐观锁解决超卖问题
乐观锁:
会有一个版本号,每次操作数据会对版本号+1,再提交回数据时,会去校验是否比之前的版本大1 ,如果大1 ,则进行操作成功,这套机制的核心逻辑在于,如果在操作过程中,版本号只比原来大1 ,那么就意味着操作过程中没有人对他进行过修改,他的操作就是安全的,如果不大1,则数据被修改过,当然乐观锁还有一些变种的处理方式比如cas
程序中进行解决
我们进行扣减库存时,加入判断:
boolean success = seckillVoucherService.update().setSql("stock= stock -1") //set stock = stock -1.eq("voucher_id", voucherId).eq("stock",voucher.getStock()).update(); //where id = ? and stock = ?
以上逻辑的核心含义是:只要我扣减库存时的库存和之前我查询到的库存是一样的,就意味着没有人在中间修改过库存,那么此时就是安全的,但是以上这种方式通过测试发现会有很多失败的情况,失败的原因在于:在使用乐观锁过程中假设100个线程同时都拿到了100的库存,然后大家一起去进行扣减,但是100个人中只有1个人能扣减成功,其他的人在处理时,他们在扣减时,库存已经被修改过了,所以此时其他线程都会失败.
通俗一点将:
如果100个线程同时开始进行库存的扣减,只有一个线程在拿到100库存,这时他查询得到的是100,我扣减时候的库存是100,它可以完美运行,这时候库存变成99,剩下的99个线程开始扣减时,他们一开始拿到的是库存是100,扣减时发现库存变成了99,所以肯定就不会扣减,这样异常率就会特别高
修改上面的判断条件:
之前的方式要修改前后都保持一致,但是这样我们分析过,成功的概率太低,所以我们的乐观锁需要变一下,改成stock大于0 即可
boolean success = seckillVoucherService.update().setSql("stock= stock -1").eq("voucher_id", voucherId).update().gt("stock",0); //where id = ? and stock > 0
相关文章:
Redis优惠券秒杀超卖问题
Redis秒杀超卖问题 前言一、出现秒杀超卖的原因二、超卖解决方案使用乐观锁解决超卖问题程序中进行解决 前言 这是我认为b站上最好的redis教程,各方面讲解透彻,知识点覆盖比较全。 黑马redis视频链接:B站黑马redis教学视频 本文参考黑马redi…...
14个最强大的建筑设计AI工具
在整个行业中,建筑师在他们的创造性追求中正在拥抱一个新的合作伙伴:AI。 一旦受到重复和单调的困扰,建筑工人发现自己正处于数字革命的风口浪尖,其中比特和字节掌握着自动化和曾经难以想象的可能性的关键。 推荐:用 …...
Ueditor 百度强大富文本Springboot 项目集成使用(包含上传文件和上传图片的功能使用)简单易懂,举一反三
Ueditor 百度强大富文本Springboot 项目集成使用 首先如果大家的富文本中不考虑图片或者附件的情况下,只考虑纯文本且排版的情况下我们可以直接让前端的vue来继承UEditor就可以啦。但是要让前端将那几个上传图片和附件的哪些功能给阉割掉! 然后就是说如…...
【NLP】一个使用PyTorch实现图像分类的迁移学习实例
一个使用PyTorch实现图像分类的迁移学习实例 1. 导入模块2. 加载数据3. 模型处理4. 训练及验证模型5. 微调6. 其他代码 在特征提取中,可以在预先训练好的网络结构后修改或添加一个简单的分类器,然后将源任务上预先训练好的网络作为另一个目标任务的特征提…...
【wsl-windows子系统】安装、启用、禁用以及同时支持docker-desktop和vmware方案
如果你要用docker桌面版,很可能会用到wsl,如果没配置好,很可能wsl镜像会占用C盘很多空间。 前提用管理员身份执行 wsl-windows子系统安装和启用 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper…...
使用docker部署springboot微服务项目
文章目录 1. 环境准备1. 准备好所用jar包项目2.编写相应的Dockerfile文件3.构建镜像4. 运行镜像5. 测试服务是否OK6.端口说明7.进入容器内8. 操作容器的常用命令 1. 环境准备 检查docker是否已安装 [rootlocalhost /]# docker -v Docker version 1.13.1, build 7d71120/1.13.…...
uniapp兼容微信小程序和支付宝小程序遇到的坑
1、支付宝不支持v-show 改为v-if。 2、v-html App端和H5端支持 v-html ,微信小程序会被转为 rich-text,其他端不支持 v-html。 解决方法:去插件市场找一个支持跨端的富文本组件。 3、导航栏处有背景色延伸至导航栏外 兼容微信小程序和支…...
LeetCode208.Implement-Trie-Prefix-Tree<实现 Trie (前缀树)>
题目: 思路: tire树,学过,模板题。一种数据结构与算法的结合吧。 代码是: //codeclass Trie { private:bool isEnd;Trie* next[26]; public:Trie() {isEnd false;memset(next, 0, sizeof(next));}void insert(strin…...
第1章 JavaScript简史
JavaScript的起源 JavaScript是Netscape公司与Sun公司合作开发的在JavaScript诞生之前游览器就是显示超文本文档的简单的软件,JavaScript为此增加了交互行为ECMAScript是JavaScript的标准化,本质上是同一个语言JavaScript是一门脚本语言通常只能运行在游…...
DevOps-GitHub/GitLab
DevOps-GitHub/GitLab GitHub是一个开源代码托管平台。基于web的Git仓库,提供共有仓库和私有仓库(私有仓库收费)。 GitLab可以创建免费私有仓库。 GitHub 为了快速操作,这里对创建仓库以及注册不做说明。 首先再GitHub上创建一…...
redis群集(主从复制)
---------------------- Redis 主从复制 ---------------------------------------- 主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的…...
F5 LTM 知识点和实验 5-健康检测
第五章:健康检测 监控的分类: 地址监控(3层)服务监控(4层)内容监控(7层)应用监控(7层)性能监控(7层)路径监控(3、4、7层)三层监控: 三层监控可以帮助bipip系统通过检查网络是否可达监视资源。比如使用icmp echo,向监控节点发送icmp_echo报文,如果接收到响应…...
❤️创意网页:能量棒页面 - 可爱版(加载进度条)
✨博主:命运之光 🌸专栏:Python星辰秘典 🐳专栏:web开发(简单好用又好看) ❤️专栏:Java经典程序设计 ☀️博主的其他文章:点击进入博主的主页 前言:欢迎踏入…...
C语言中的操作符(万字详解)
C语言中的操作符(万字详解) 一、算术操作符()1.除号 /2.取余 %二、移位操作符1.原码2.反码3.补码4.左移操作符5.右移操作符三、位操作符1.按位与操作符:&2.按位或操作符:|3.按位异或操作符:…...
Panda 编译时原子化 CSS-in-JS 框架的跨平台方案
Panda 编译时原子化 CSS-in-JS 框架的跨平台方案 Panda 编译时原子化 CSS-in-JS 框架的跨平台方案 对编译时原子化CSS框架的思考编译时 CSS-in-JS 方案对比 LinariaPandacss总结 weapp-pandacss 介绍快速开始 pandacss 安装和配置 0. 安装和初始化 pandacss1. 配置 postcss2. …...
【图论】BFS中的最短路模型
算法提高课笔记 目录 迷宫问题题意思路代码 武士风度的牛题意思路代码 抓住那头牛题意思路代码 BFS可以解决边权为1的最短路问题,下面是三道相关例题 迷宫问题 原题链接 给定一个 nn 的二维数组,如下所示: int maze[5][5] {0, 1, 0, 0, …...
Linux Mint 21.2 ISO 镜像开放下载
导读Linux Mint 21.2 ISO 镜像于 2023 年 6 月 21 日公测,开发者在这段时间内收集并修复了用户反馈的诸多问题。 代号为“Victoria”的 Linux Mint 21.2 ISO 镜像于今天正式开放下载,新版本基于 Ubuntu 22.04 LTS,提供 Cinnamon 5.8、Xfce 4.…...
版本适配好帮手 Android SDK Upgrade Assistant / Android Studio Giraffe新功能
首先是新版本一顿下载↓: Download Android Studio & App Tools - Android Developers 在Tools中找到Android SDK Upgrade Assistant 可以在此直接查看SDK升级相关信息,不用跑到WEB端去查看了。 例如看一下之前经常要对老项目维护的android 12蓝牙…...
kafka权威指南学习以及kafka生产配置
0、kafka常用命令 Kafka是一个分布式流处理平台,它具有高度可扩展性和容错性。以下是Kafka最新版本中常用的一些命令: 创建一个主题(topic): bin/kafka-topics.sh --create --topic my-topic --partitions 3 --replic…...
自由行的一些小tips
很多很多年前,写过一些关于自由行的小攻略,关于互联网时代的自助旅游,说起来八年了,很多信息可能过期了。 前几天准备回坡,因为自己比较抠门,发现目前大陆回新加坡的机票比较贵(接近4000人民币&…...
SpringBoot微服务架构:集成AnythingtoRealCharacters2511实现分布式转换服务
SpringBoot微服务架构:集成AnythingtoRealCharacters2511实现分布式转换服务 1. 引言 想象一下,一个电商平台每天需要处理成千上万的动漫风格商品图片,想要将它们转换为真实人像风格来提升商品吸引力。传统方案要么依赖人工设计效率低下&am…...
西门子博图V16实战:5种工作模式机械手PLC程序全解析(附HMI组态文件)
西门子博图V16实战:5种工作模式机械手PLC程序全解析(附HMI组态文件) 在工业自动化领域,机械手控制系统一直是核心难点之一。如何实现多工作模式的灵活切换、确保信号互锁安全可靠,是每个PLC程序员必须掌握的技能。本文…...
嵌入式开发五大常见Bug解析与解决方案
1. 嵌入式开发中的五大常见Bug根源解析在嵌入式系统开发领域,代码质量直接关系到产品的可靠性和稳定性。作为一名经历过多个嵌入式项目的开发者,我深刻体会到某些类型的bug特别顽固且难以排查。这些bug往往在实验室测试中难以复现,却在现场运…...
**NPU设计新范式:基于RISC-V的可配置计算单元实现与性能优化实践**在人工智能加速领域,
NPU设计新范式:基于RISC-V的可配置计算单元实现与性能优化实践 在人工智能加速领域,NPU(神经网络处理单元) 正从专用硬件向灵活可编程架构演进。本文将深入探讨一种基于 RISC-V指令集扩展 的轻量级NPU设计方案,并通过实…...
从PMOS、NMOS到CMOS:揭秘现代芯片的互补设计哲学
1. 从PMOS与NMOS的相爱相杀说起 我第一次接触MOSFET晶体管是在大学实验室里,当时对着示波器上那些跳动的波形百思不得其解。教授指着电路板说:"记住,PMOS和NMOS就像电路世界的阴阳两极。"这句话让我花了整整三年时间才真正理解。 P…...
解锁B站视频下载:5个高效技巧让你轻松获取心仪内容
解锁B站视频下载:5个高效技巧让你轻松获取心仪内容 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/B…...
Vita3K终极指南:在PC上完美运行PSVita游戏的完整教程
Vita3K终极指南:在PC上完美运行PSVita游戏的完整教程 【免费下载链接】Vita3K Experimental PlayStation Vita emulator 项目地址: https://gitcode.com/gh_mirrors/vi/Vita3K 想在电脑上重温PSVita经典游戏吗?Vita3K模拟器为你打开了一扇通往掌机…...
Vue3+Vant4移动端架构设计:现代化移动应用工程实践
Vue3Vant4移动端架构设计:现代化移动应用工程实践 【免费下载链接】vue3-vant4-mobile 👋👋👋 基于Vue3.2、vite3、vant4、pinia2、Typescript、windicss 等主流技术开发,集成 Dark Mode(暗黑)模式和系统主题色&#x…...
Nuka Carousel与TypeScript完美集成:类型安全和开发体验提升
Nuka Carousel与TypeScript完美集成:类型安全和开发体验提升 【免费下载链接】nuka-carousel Small, fast, and accessibility-first React carousel library with an easily customizable UI and behavior to fit your brand and site. 项目地址: https://gitcod…...
华为 eNSP 实战:SSH 密钥认证配置与安全加固指南
1. 为什么选择SSH密钥认证而非密码? 在华为eNSP模拟的企业网络环境中,传统的SSH密码认证虽然比Telnet安全,但依然存在被暴力破解的风险。我曾在实际项目中发现,使用弱密码的设备在暴露公网后,平均每天会遭受上千次登录…...
