Redis高并发锁(二)乐观锁
创始人
2024-04-26 01:46:17
0

文章目录

  • redis乐观锁
    • 1. watch 监控key
    • 2. multi 开启事务
    • 3. exec 执行事务
    • 4. 演示
      • 1) 先用两个连接AB访问redis
      • 2) A监控key,此时库存是4501
      • 3) A开启事务,并且将库存-1,事务进入队列等待执行
      • 4)此时B更新库存为2001
      • 5)A开始执行事务
  • 业务改造
    • 1. StockService
  • 测试
  • 问题

redis乐观锁

由watch multi exec配合实现乐观锁

1. watch 监控key

可以监控一个或者多个key的值,若在事务执行(exec)之前,key的值发生变化则取消事务执行

2. multi 开启事务

3. exec 执行事务

4. 演示

1) 先用两个连接AB访问redis

2) A监控key,此时库存是4501

在这里插入图片描述

3) A开启事务,并且将库存-1,事务进入队列等待执行

在这里插入图片描述

4)此时B更新库存为2001

在这里插入图片描述

5)A开始执行事务

在这里插入图片描述

执行为空,即执行失败,且库存已被B更新为了2001

6)若事务执行过程中没有被B执行呢
在这里插入图片描述
执行成功!!!

业务改造

1. StockService

@Service
public class StockService {@Autowiredprivate StockMapper stockMapper;@Autowiredprivate StringRedisTemplate redisTemplate;public void deduct() {redisTemplate.execute(new SessionCallback() {@Overridepublic  Object execute(RedisOperations redisOperations) throws DataAccessException {// watch 监控keyredisOperations.watch((K) "stock");// 1。 查询库存String stockStr = redisTemplate.opsForValue().get("stock");if (!StringUtil.isNullOrEmpty(stockStr)) {int stock = Integer.parseInt(stockStr);// 2。 判断条件是否满足if (stock > 0) {// multi 开启事务redisOperations.multi();// 3 更新redisredisTemplate.opsForValue().set("stock", String.valueOf(stock - 1));// exec 执行事务List list = redisOperations.exec();// 如果执行事务返回结果为空,则重试if (CollectionUtils.isEmpty(list)) {try {Thread.sleep(20);} catch (InterruptedException e) {throw new RuntimeException(e);}deduct();}}}return null;}});}
}
 

需要在redisTemplate.execute(new SessionCallback() {})的匿名内部类中实现redis事务。

而RedisOperations
在这里插入图片描述
其实就是我们使用的StringRedisTemplate,所以直接用它调用即可。

测试

在这里插入图片描述
性能太差了,吞吐量只有6

在这里插入图片描述
但库存成功清0了,问题解决

问题

性能太差

相关内容

热门资讯

安卓更换别的手机系统,轻松切换... 你有没有想过,你的安卓手机用久了,是不是有点审美疲劳了呢?或者,你最近是不是对其他手机系统产生了浓厚...
安卓系统单机神雕侠侣,指尖重温 你有没有想过,在手机上也能体验一把江湖恩怨、侠骨柔肠?没错,就是那个让人心驰神往的《神雕侠侣》!今天...
安卓系统键盘语言切换,安卓系统... 你有没有发现,手机上的安卓系统键盘语言切换功能,简直就像是个神奇的魔法棒,轻轻一点,就能让文字飞舞在...
oppok1安卓系统,性能与体... 你有没有发现,最近手机圈里又掀起了一股热潮?没错,就是OPPO K1这款新机!这款手机不仅外观时尚,...
安卓系统环境的搭建,从零开始构... 想要在电脑上体验安卓系统的魅力,是不是已经跃跃欲试了呢?别急,今天就来手把手教你如何搭建一个属于自己...
【MySQL】锁 锁 文章目录锁全局锁表级锁表锁元数据锁(MDL)意向锁AUTO-INC锁...
【内网安全】 隧道搭建穿透上线... 文章目录内网穿透-Ngrok-入门-上线1、服务端配置:2、客户端连接服务端ÿ...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
数据分页展示逻辑 import java.util.Arrays;import java.util.List;impo...
Redis为什么选择单线程?R... 目录专栏导读一、Redis版本迭代二、Redis4.0之前为什么一直采用单线程?三、R...
【已解决】ERROR: Cou... 正确指令: pip install pyyaml
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
Lock 接口解读 前置知识点Synchronized synchronized 是 Java 中的关键字,...
Win7 专业版安装中文包、汉... 参考资料:http://www.metsky.com/archives/350.htm...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
大模型未来趋势 大模型是人工智能领域的重要发展趋势之一,未来有着广阔的应用前景和发展空间。以下是大模型未来的趋势和展...
python实战应用讲解-【n... 目录 如何在Python中计算残余的平方和 方法1:使用其Base公式 方法2:使用statsmod...
学习u-boot 需要了解的m... 一、常用函数 1. origin 函数 origin 函数的返回值就是变量来源。使用格式如下...
常用python爬虫库介绍与简... 通用 urllib -网络库(stdlib)。 requests -网络库。 grab – 网络库&...
药品批准文号查询|药融云-中国... 药品批文是国家食品药品监督管理局(NMPA)对药品的审评和批准的证明文件...