当前位置: 首页 > news >正文

Redis实现乐观锁+秒杀场景demo

在Redis中,乐观锁通常是通过使用 WATCH、MULTI 、EXEC和DISCARD命令实现的。这种乐观锁机制允许客户端在执行事务期间监视一个或多个键,并且只有在事务执行期间没有其他客户端修改被监视的键时,才会执行事务。

应用场景:
  1. 库存控制:在电商系统中,通过乐观锁控制商品库存的增减操作,避免超卖或超卖的情况发生。
  2. 秒杀系统:在秒杀活动中,通过乐观锁控制用户抢购商品的库存,确保活动期间库存不会超卖。
  3. 限流控制:通过乐观锁实现对某个资源的限流操作,可以控制请求的并发数量,保护系统免受突发高并发的影响。
使用案例:

下面是一个简单的伪代码,简单演示如何在 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面试宝典》

http://www.lryc.cn/news/310497.html

相关文章:

  • 阅读笔记 | Transformers in Time Series: A Survey
  • WPF MVVM中List<>和ObservableCollection<>的区别与对比分析
  • python给企微发消息
  • TCP/IP状态迁移
  • C语言实现各类排序算法
  • Network LSA 结构简述
  • 揭示IP风险画像的作用与价值
  • [python] dataclass 快速创建数据类
  • opencv实现图像的融合
  • Orbit 使用指南 02 | 在场景中生成原始对象| Isaac Sim | Omniverse
  • 【2024】利用python爬取csdn的博客用于迁移到hexo,hugo,wordpress...
  • 从嵌入式Linux到嵌入式Android
  • 蓝桥ACM培训-实战1
  • 波动数列(蓝桥杯)
  • 第二篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas金融数据分析
  • Flink:Temporal Table Function(时态表函数)和 Temporal Join
  • Go语言中的时间控制:定时器技术详细指南
  • 面试笔记系列六之redis+kafka+zookeeper基础知识点整理及常见面试题
  • Golang动态高效JSON解析技巧
  • 双重检验锁
  • 【RISC-V 指令集】RISC-V DSP 扩展指令集介绍(一)
  • RocketMQ - CentOS 7.x 安装单机版并测试
  • [JavaWeb玩耍日记]HTML+CSS+JS快速使用
  • 如何使用ArcGIS Pro创建最低成本路径
  • Neoverse CSS N3:实现市场领先能效的最快途径
  • JavaScript实现的计时器效果
  • 仿函数(Functor(c++))
  • 智能汽车加速车规级存储应用DS2431P+TR 汽车级EEPROM 存储器IC
  • js json转换成字符串
  • Linux笔记--基本操作指令