Redis实现乐观锁+秒杀场景demo
在Redis中,乐观锁通常是通过使用 WATCH、MULTI 、EXEC和DISCARD命令实现的。这种乐观锁机制允许客户端在执行事务期间监视一个或多个键,并且只有在事务执行期间没有其他客户端修改被监视的键时,才会执行事务。
应用场景:
- 库存控制:在电商系统中,通过乐观锁控制商品库存的增减操作,避免超卖或超卖的情况发生。
- 秒杀系统:在秒杀活动中,通过乐观锁控制用户抢购商品的库存,确保活动期间库存不会超卖。
- 限流控制:通过乐观锁实现对某个资源的限流操作,可以控制请求的并发数量,保护系统免受突发高并发的影响。
使用案例:
下面是一个简单的伪代码,简单演示如何在 Redis 中实现乐观锁:
while(true){// 监视键WATCH key // 开启事务MULTI// 事务中执行操作GET keySET key valuetry{ // 提交事务EXEC }catch{// 如果事务执行失败(被监视的键被其他客户端修改了),执行 DISCARDDISCARD}}
使用jedis实现秒杀场景的demo,通过乐观锁控制用户抢购商品的库存,确保活动期间库存不会超卖
public class SecKillDemo {public static void main(String[] args) {Jedis jedis = new Jedis("localhost", 6379);// 初始化商品库存String productKey = "product:001";jedis.set(productKey, "5");String user = "user1";while (true) {try {jedis.watch(productKey);int remainingStock = Integer.parseInt(jedis.get(productKey));if (remainingStock > 0) {Transaction tx = jedis.multi();tx.decr(productKey);tx.exec();System.out.println(user + " 秒杀成功,剩余库存: " + (remainingStock - 1));} else {System.out.println(user + " 秒杀失败,商品已售罄");}break;} catch (JedisDataException e) {System.out.println(user + " 秒杀失败,重新尝试秒杀");} finally {jedis.unwatch();}}jedis.close();}
}
注意:
在调用 exec() 方法后,会返回一个包含每个命令返回结果的列表,如果列表为空,则表示事务执行失败。当事务执行失败时,可以考虑让程序休眠一段时间后进行重试,而不是无限制地频繁重试,以避免耗尽系统资源导致栈内存溢出或其他问题。通过控制重试次数和重试间隔时间,可以有效地处理事务执行失败的情况,并降低系统负担(无限重试会导致栈内存溢出)。
ps:以下是我整理的java面试资料,密码是obht,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!
链接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面试宝典》
相关文章:
Redis实现乐观锁+秒杀场景demo
在Redis中,乐观锁通常是通过使用 WATCH、MULTI 、EXEC和DISCARD命令实现的。这种乐观锁机制允许客户端在执行事务期间监视一个或多个键,并且只有在事务执行期间没有其他客户端修改被监视的键时,才会执行事务。 应用场景: 库存控…...
阅读笔记 | Transformers in Time Series: A Survey
阅读论文: Wen, Qingsong, et al. “Transformers in time series: A survey.” arXiv preprint arXiv:2202.07125 (2022). 这篇综述主要对基于Transformer的时序建模方法进行介绍。论文首先简单介绍了Transformer的基本原理,包括位置编码、多头注意力机…...
WPF MVVM中List<>和ObservableCollection<>的区别与对比分析
在WPF MVVM(模型-视图-视图模型)架构中,数据绑定是实现UI与后端逻辑分离的关键特性。为了使UI能够响应后端数据的变化,通常需要用到特定的集合类型。在WPF中,最常见的两种集合类型是List< T>和ObservableCollect…...
python给企微发消息
方法一:webhook方式。使用群机器人给企微群发消息 import requestsdef qwxsendmessage(msg):urlhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6c598840-804a-4eb5-a999-a023313 #url换成自己群机器人的webhookurldata{msgtype:text,text:{content:msg}}…...
TCP/IP状态迁移
TCP(传输控制协议)是一种面向连接的流式控制协议,它定义了不同的状态以管理通信过程中的连接。TCP 状态迁移描述了 TCP 连接在不同状态之间的转换过程,常见的 TCP 状态包括 CLOSED、LISTEN、SYN_SENT、SYN_RECEIVED、ESTABLISHED、…...
C语言实现各类排序算法
排序算法是计算机科学中的一个重要概念,它是一种将一个无序的数列重新排列成有序的方法。常见的排序算法有: 选择排序(Selection Sort) 选择排序是一种简单直观的排序演算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序…...
Network LSA 结构简述
Network LSA主要用于描述一个区域内的网络拓扑结构,包括网络中的路由器和连接到这些路由器的网络。它记录了每个路由器的邻居关系、连接状态以及连接的度量值(如带宽、延迟等),以便计算最短路径和构建路由表。display ospf lsdb n…...
揭示IP风险画像的作用与价值
在当今数字化时代,互联网的快速发展为企业和个人带来了巨大的机遇,同时也带来了各种安全风险和威胁。随着网络攻击手段的不断升级和演变,传统的安全防御手段已经无法满足对抗复杂多变的网络威胁的需求。IP风险画像作为一种新型的网络安全解决…...
[python] dataclass 快速创建数据类
在Python中,dataclass是一种用于快速创建数据类的装饰器和工具。自Python 3.7起,通过标准库中的dataclasses模块引入。它的主要目的是简化定义类来仅存储数据的代码量。通常,这样的类包含多个初始化属性,但没有复杂的方法…...
opencv实现图像的融合
实现图像的融合并且输出一张jpg格式的照片。 先显示一个彩色图的照片 然后我以彩色方式读取1.png,以灰度图方式读取3.png这张图片,并且用两个窗口独立地去显示(我后来发现不能把灰度图和彩色图相融合) 然后实现两个融合 #include <opencv2/highgu…...
Orbit 使用指南 02 | 在场景中生成原始对象| Isaac Sim | Omniverse
如是我闻: Orbit使用指南02将 深入探讨如何使用Python代码在Orbit中向场景生成各种对象(或原始对象)。一起探索如何生成地面平面、灯光、基本图形形状以及来自USD文件的网格。前置知识:如何生成空白场景,Orbit 使用指…...
【2024】利用python爬取csdn的博客用于迁移到hexo,hugo,wordpress...
前言 博主根据前两篇博客进行改进和升级 利用python爬取本站的所有博客链接-CSDN博客文章浏览阅读955次,点赞6次,收藏19次。定义一个json配置文件方便管理现在文件只有用户名称,后续可加配置读取用户名称,并且将其拼接成csdn个人博客链接ty…...
从嵌入式Linux到嵌入式Android
最近开始投入Android的怀抱。说来惭愧,08年就听说这东西,当时也有同事投入去看,因为恶心Java,始终对这玩意无感,没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业,所以只能回过头又来学。 首先还是…...
蓝桥ACM培训-实战1
前言: 今天老师没讲课,只让我们做了一下几道题目。 正文: Problem:A 小蓝与操作序列: #include<bits/stdc.h> using namespace std; stack<int> a; int main(){int n,flag1,ans;string cz;cin>>n;for(int i1;…...
波动数列(蓝桥杯)
问题描述: 观察如下数列: 1 3 0 2 -1 1 -2 … 这个数列中后一项总是比前一项增加 2 或者减少 3。 栋栋对这种数列很好奇,他想知道长度为 n nn 和为 s ss 而且后一项总是比前一项增加 a aa 或者减少 b bb 的整数数列可能有多少种呢?…...
第二篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas金融数据分析
传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas 在金融数据分析中的常见用途和功能介绍二、金融数据清洗和准备示例代码三、金融数据索引和选择示例代码四、金融数据时间序列分析示例代码五、金融数据可视化示例代码六、金融数…...
Flink:Temporal Table Function(时态表函数)和 Temporal Join
博主历时三年精心创作的《大数据平台架构与原型实现:数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行,点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,…...
Go语言中的时间控制:定时器技术详细指南
Go语言中的时间控制:定时器技术详细指南 引言定时器基础创建和使用time.Timer使用time.Ticker实现周期性任务定时器的内部机制小结 使用time.Timer实现简单的定时任务创建和启动定时器停止和重置定时器定时器的实际应用小结 利用time.Ticker处理重复的定时任务创建和…...
面试笔记系列六之redis+kafka+zookeeper基础知识点整理及常见面试题
目录 Redis redis持久化机制:RDB和AOF Redis 持久化 RDB的优点 RDB的缺点 AOF 优点 AOF 缺点 4.X版本的整合策略 Redis做分布式锁用什么命令? Redis做分布式锁死锁有哪些情况,如何解决? Redis如何做分布式锁?…...
Golang动态高效JSON解析技巧
JSON如今广泛用于配置和通信协议,但由于其定义的灵活性,很容易传递错误数据。本文介绍了如何使用mapstructure工具实现动态灵活的JSON数据解析,在牺牲一定性能的前提下,有效提升开发效率和容错能力。原文: Efficient JSON Data Ha…...
用了这么久 Claude Code,你可能从来没打开过它最重要的文件夹!
点击上方卡片关注我设置星标 学习更多AI出海知识装完 Claude Code 跑第一个项目的时候,根目录会多出一个 .claude/ 文件夹。大部分人看到了,没点开过,也没想过里面有什么。这就错过了 Claude Code 最值得折腾的部分。.claude/ 不是缓存目录&a…...
LumiPixel Canvas Quest多模态探索:结合文本描述生成特定场景人像
LumiPixel Canvas Quest多模态探索:结合文本描述生成特定场景人像 1. 效果亮点预览 LumiPixel Canvas Quest在理解复杂文本描述并生成对应场景人像方面展现出惊人的能力。输入一段详细的场景描述,模型就能生成高度符合文本意境且细节丰富的图像。比如输…...
2026最权威的AI论文助手横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在学术写作范畴里,“论文一键生成”身为一种崭露头角的技术工具,正渐…...
ESP8266+MQTT+Home Assistant:DIY智能插座全流程(附代码调试技巧)
ESP8266MQTTHome Assistant:打造高可靠智能插座的进阶实践 在智能家居DIY领域,ESP8266凭借其低廉的价格和强大的Wi-Fi功能,已成为硬件爱好者的首选。本文将带您深入探索如何利用ESP8266模块构建一个工业级可靠性的智能插座,并通过…...
B站字幕高效解决方案:从下载到应用的全流程指南
B站字幕高效解决方案:从下载到应用的全流程指南 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 1. 解决B站字幕获取难题 在视频内容消费日益增长的今…...
seo收录查询工具如何提高网站的关键词排名
SEO收录查询工具如何提高网站的关键词排名 在当前竞争激烈的互联网环境中,网站的SEO排名直接影响到网站的流量和收入。而关键词排名作为SEO的重要组成部分,如何通过SEO收录查询工具提高网站的关键词排名,是每一个网站运营者都需要关注的问题…...
MPI并行编程避坑指南:实现Cannon算法时,你的进程通信真的高效吗?
MPI并行编程实战:Cannon算法性能调优的五大关键陷阱 当你第一次在集群上运行Cannon算法时,是否遇到过这样的场景:代码逻辑完全正确,计算结果也准确无误,但性能提升却远低于预期?或者更糟——程序莫名其妙地…...
别再手动摆引脚了!嘉立创EDA专业版符号库设计,从蓝桥杯真题到高效实战
嘉立创EDA符号库设计实战:从竞赛真题到工程级规范 第一次用嘉立创EDA专业版设计符号库时,我盯着满屏的引脚和属性栏发呆了十分钟——明明教程里的步骤看起来那么简单,为什么自己操作时总在"摆引脚-改属性-保存报错"的循环里打转&am…...
D3KeyHelper:革新性暗黑3自动化助手,重新定义游戏效率体验
D3KeyHelper:革新性暗黑3自动化助手,重新定义游戏效率体验 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款…...
IHaskell与Python对比分析:函数式编程在数据科学中的独特价值
IHaskell与Python对比分析:函数式编程在数据科学中的独特价值 【免费下载链接】IHaskell A Haskell kernel for the Jupyter project. 项目地址: https://gitcode.com/gh_mirrors/ih/IHaskell 在数据科学领域,选择合适的编程语言往往直接影响开发…...
