Redis(三)—— Redis基本的事务操作、Redis实现乐观锁

news2024/9/23 17:17:00

一、Redis基本的事务操作

首先声明:

  • redis的单条命令是保证原子性的(回想一下setnx k1 v1 k5 v5命令如果k1已经存在,那么k5也会设置失败)
  • 但是redis的事务不保证原子性!见下面“1.2 某条命令有错怎么办?”
  • redis的事务也没有隔离性!mysql的事务必须具有隔离性是因为可能有多个线程操作数据,但是redis是单线程的,所以根本不需要隔离。相应的,redis也就没有脏读、幻读等一系列由隔离性引发的问题。

1.1 开始事务、执行事务、放弃事务

 注意:每次exec执行完事务后,这个事务就消失了。下次要再输入multi命令去创建新事务

discard命令放弃事务

 1.2 事务中某条命令有错怎么办?

  • 编译型异常”,也就是事务中某条命令语法有错,比如把“hget”写成了"ghet",那么整个事务中的所有命令都不会被执行,这里是具有原子性特点的
  • 运行时异常”,语法没错,但是命令执行出现问题。比如事务中某条命令是“geodist china:city beijing tianjin”,但是china:city这个集合中压根没有天津这个城市。那么这一条命令执行失败,但是其他命令会执行成功。所以redis的事务不具有原子性

注意看下面的演示

 

二、通过redisTemplate操作再次理解事务

    @Test
    public void test01(){
        // 1.从数据库中取出数据,转为java对象
        Blog blog1 = blogMapper.selectById(2);
        Blog blog2 = blogMapper.selectById(3);
        // 2.java对象-->json
        String blogString1 = JSON.toJSONString(blog1);
        String blogString2 = JSON.toJSONString(blog2);

        redisTemplate.multi();
        try{
            redisTemplate.opsForValue().set("blog1",blogString1);
            redisTemplate.opsForValue().set("blog2",blogString2);
            int i=1/0;  //运行时异常,但是上面两条命令会执行成功
            redisTemplate.exec();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println(redisTemplate.opsForValue().get("blog1"));
            System.out.println(redisTemplate.opsForValue().get("blog2"));
        }

    }

三、Redis用watch实现乐观锁

mysql用version版本号实现乐观锁,我们的redis用watch监控实现乐观锁。

 先看一下加watch监控后,事务成功的情况下:

cj:11>set money 1000
"OK"
cj:11>watch money  # 给money开启监控,记录money当前的值
"OK"
cj:11>multi
"OK"
cj:11>incrby money 100
"QUEUED"
cj:11>incrby money 200
"QUEUED"
cj:11>exec   # 事务执行前money没有被别的线程修改过(money值没变),那么事务执行成功!
1) "OK"
2) "1100"
3) "OK"
4) "1300"
5) "OK"

再看一下,事务执行前,命令里的值被其他线程修改的情况(入门篇里说过,redis的单线程指的是给一个用户网络连接请求开启一个单线程,这个单线程不会开子线程。但是当多个网络请求的时候,自然是多个线程在同时进行,当然这不属于redis级别的多线程,而是java程序级别的多线程)

 这个事务就会失败

 失败后再怎么弄勒?毕竟我们还是要花500块钱的。当然是再来一遍了!但是要先解除监控,再加上监控

cj:11>unwatch  # 解除监控
"OK"
cj:11>watch money  # 再次加上监控,获取money最新的值
"OK"
cj:11>multi
"OK"
cj:11>decrby money 500
"QUEUED"
cj:11>exec
1) "OK"
2) "2500"
3) "OK"

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

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

相关文章

产品经理:如何做好项目需求管理

产品经理每天都要接触各种不同的需求,只有对这些需求进行分析,才能更好地了解问题,从而制定相应的解决方案。那么,怎么做需求分析呢? 一、需求确定 选择需求是很重要的,先做出选择,才会有对应的…

Item2连接SSH

在MocOS系统上,没有xshell,而一些类似xshell的工具中,好用的要收费,免费的不好用,于是决定使用iTerm2打造一个好用的ssh神器。 一、新建一个Profile 在配置管理页面切换到Profiles管理页面: 二、配置ssh连接…

五、控制流(1)

本章概要 true 和 falseif-else迭代语句 whiledo-whilefor 逗号操作符 for-in 语法 程序必须在执行过程中控制它的世界并做出选择。 在 Java 中,你需要执行控制语句来做出选择。 Java 使用了 C 的所有执行控制语句,因此对于熟悉 C/C 编程的人来说&…

KNN模型进行分类和回归任务

KNN工作原理 “近朱者赤,近墨者黑”可以说是KNN的工作原理。整个计算过程分为三步:1:计算待分类物体与其他物体之间的距离;2:统计距离最近的K个邻居;3:对于K个最近的邻居,它们属于哪个分类最多,待分类物体就…

【Nginx12】Nginx学习:HTTP核心模块(九)浏览器缓存与try_files

Nginx学习:HTTP核心模块(九)浏览器缓存与try_files 浏览器缓存在 Nginx 的 HTTP 核心模块中其实只有两个简单的配置,这一块也是 HTTP 的基础知识。之前我们就一直在强调,学习 Nginx 需要的就是各种网络相关的基础知识&…

前端程序员入门:先学Vue3还是Vue2?

一、前言 对于新手来说,学习Vue.js框架时往往会有这样一个疑问:应该先学习Vue2还是直接学习Vue3?在回答这个问题之前,我们先简单介绍一下Vue.js框架。 Vue.js是一个轻量级的MVVM(Model-View-ViewModel)框架,它以数据驱…

数字世界未来十年面貌展望

2023年,数字技术已经深刻改变了我们的生活和社会,而未来十年数字世界的面貌将会更加令人瞩目。从人工智能到区块链,从虚拟现实到5G,各种科技将继续发展演进,给我们带来更多令人兴奋的可能性。以下是对数字世界未来十年…

交换机之HOL拥塞

队首阻塞(Head of Line Blocking, HOL)是一种出现在缓存式通信网络交换中的一种现象,其交换结构通常由缓存式FIFO输入端、交换结构(Switch Fabric)、FIFO输出端构成。 HOL阻塞用一个现实生活中的例子说明,就如同你在一条单车道的马路上右转,…

人机交互与人机混合智能的区别

人机交互和人机融合智能是两个相关但不完全相同的概念: 人机交互是指人与计算机之间的信息交流和互动过程。它关注的是如何设计和实现用户友好的界面,以便人们能够方便、高效地与计算机进行沟通和操作。人机交互通常强调用户体验和界面设计,旨…

如何找回删除的文件?文件恢复,3招就行!

“昨天不小心把我的毕业资料删除了,因为改了很多版,删除的时候没想到把正确的版本删除了,错误的版本还在!这种情况应该怎么办呢?怎样才能找回我删除的文件呀?” 对于一些比较重要的文件,不小心删…

【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入输出、缺省参数、函数重载

目录 1. C关键字 2. 命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理——名字修饰(name Mingling) 5.3 extern &…

围棋基础知识

1、气 1.1星位位置 1.2天元位置 1.3 气的位置 2、禁入点 白棋里面的位置就是禁入点,也可以称为没有气的位置可以称为禁入点 破解之法: 在于将白棋全部围住,下一步为围住之策,即可。 3、死棋和活棋 3.1活棋 3.2 死棋 白棋的样…

探寻数据服务的本质:API之外的可能性

数据服务在数据建设中发挥着重要的作用。数据服务到底啥样? 是不是只对外提供一个API? 这么简单? 而我希望你能在学完这部分内容之后,真正掌握数据服务的产品功能设计和系统架构设计。因为这会对你设计一个数据服务,或…

青少年护眼灯哪个好?2023全新五款台灯推荐

国内儿童青少年的视力健康问题越来越突出,甚至许多孩子年纪非常小就已经近视了,所以许多老师以及眼科医生都和家长们强调护眼台灯的重要性。不过,护眼台灯虽好,但在选购时也要注意那些无法护眼的不专业品牌,许多产品有…

ICC2如何计算Gate Count?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?知识星球入口 我们认为gate count等于standard cell(非physical only)总面积 / 最小驱动二输入与非门面积。 ICC2没有专门的命令去报告gate count,只能自己计算,使用report_d…

MySQL数据库——DDL基本操作

文章目录 前言数据库操作查看已存在的所有数据库创建数据库选中数据库删除数据库修改数据库编码 表操作创建表显示创建表时的语句显示表结构删除表修改表的结构增加列修改列删除列 修改表名 前言 DDL 操作是与数据库结构相关的操作,它们不涉及实际的数据操作&#…

B2B企业如何选择CRM系统?

CRM软件的优势在于简化业务流程,实现企业的降本增效。越来越多的B2B企业通过CRM为业务赋能,B2B企业如何快速找到适合公司业务的CRM系统?总的来说就是根据企业自身业务而量身打造的一套系统。 1.整理业务需求 B2B企业首先要考虑是业务痛点&a…

易基因:m6A-seq等揭示RBM33参与调控m6A去甲基化酶ALKBH5活性及其底物选择性|科研进展

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 RNA结合蛋白(RNA-binding protein,RBP)是一类结构和功能多样化的蛋白质,参与多种生物过程。越来越多的证据表明,RBP通过调控编…

意外:WPS编程新工具,不用编程,excel用户:可以不用VBA啦

来来来,拓宽一下视野! 别总以为excel和WPS只能用VBA编程,也别总是想着ACCESS这些老生常谈的工具。其实对于电子表格高级用户来讲,不会VBA,不用ACCESS,也一样可以解决复杂问题或者高级应用。 尤其是WPS用户…

C++多线程编程(第三章 利用栈特性自动释放锁RALL,锁管理器、控制器)

1、什么是RALL,手动代码实现 RALL(resource Acquisition Is Initialization )C 之父Bjarne Stroustrup 提出; 使用局部对象来管理资源的技术称为资源获取即初始化;它的生命周期是由操作系统来管理的,无需人…