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

一、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"

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ueditor 百度强大富文本Springboot 项目集成使用(包含上传文件和上传图片的功能使用)简单易懂,举一反三

Ueditor 百度强大富文本Springboot 项目集成使用 首先如果大家的富文本中不考虑图片或者附件的情况下,只考虑纯文本且排版的情况下我们可以直接让前端的vue来继承UEditor就可以啦。但是要让前端将那几个上传图片和附件的哪些功能给阉割掉! 然后就是说如…

SpringMvc+Mybatis完整项目

0目录 1.SpringmybatisSpringmvc查询功能(记录数) 2.查询所有 3.增删改查(根据id) 4.增加用户注册登录功能 1.SpringmybatisSpringmvc增删改查 新建数据库 创建工程 配置web.xml 配置applicationContext.xml 实体类 My…

SpringBoot 配置⽂件

1.配置文件作用 整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如: 数据库的连接信息(包含⽤户名和密码的设置);项⽬的启动端⼝;第三⽅系统的调⽤秘钥等信息;⽤于发现和定位问题的普通⽇…

EMP-SSL: TOWARDS SELF-SUPERVISED LEARNING IN ONETRAINING EPOCH

Recently, self-supervised learning (SSL) has achieved tremendous success in learning image representation. Despite the empirical success, most self-supervised learning methods are rather “inefficient” learners, typically taking hundreds of training epoch…

MySQL高可用之MHA集群

目录 一、MHA概述 1.1 什么是 MHA 1.2 MHA 的组成 1.3 MHA 的特点 二、MySQL MHA搭建准备 2.1 实验思路 2.2 实验准备 MHA一主两从高可用集群示意图: 三、搭建 MySQL MHA 3.1 配置主从复制 1、四台服务器都关闭防火墙 2、修改 Master、Slave1、Slave2 节…

汇编调用C语言定义的全局变量

在threadx移植中,系统的systick通过了宏定义的方式定义,很难对接库函数的时钟频率,不太利于进行维护 所以在C文件中自己定义了一个systick_Div的变量,通过宏定义方式设定systick的时钟频率 在汇编下要加载这个systick分频系数 …

STM32 串口基础知识学习

串行/并行通信 串行通信:数据逐位按顺序依次传输。 并行通信:数据各位通过多条线同时传输。 对比 传输速率:串行通信较低,并行通信较高。抗干扰能力:串行通信较强,并行通信较弱。通信距离:串…

在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制休眠(二)

问题场景 本月7月10日处理了一个虚拟机被强制暂停的问题,详见:在Windows server 2012上使用virtualBox运行CentOS7虚拟机,被强制暂停当时是由于C盘存储空间不足,导致虚拟机被强制暂停,将虚拟机迁移后,问题…

Mybatis-plus 配置自定义sql(.xml文件)查询语句的步骤

这是使用Mybatis-plus 的自动生成实体类代码生成.xml文件, 所以他会在java目录下,不在resources目录下 如果在java目录下的xml文件,需要分别配置application.yml和pom.xml文件 application.yml 文件进行以下配置: mybatis-plus…

【C刷题】矩阵相等判断与序列中删除指定的数字

目录 BC105-矩阵相等判断 方法1:两矩阵输入完毕后,进行比较 方法2:在接收过程中直接比较 BC98 - 序列中删除指定的数字 方法1:把要删除的元素改为0 方法2:打印不用删除的元素 方法3:定义两个下标 i 和 j(动图演示) 此篇文章是关于牛客网刷题的做题思路和代码…

Docker的数据管理和Dockerfile的指令

Docker的数据管理 一、Docker数据的概念1、数据卷2、数据卷容器 二、端口映射三、容器互联(使用centos镜像)四、Docker 镜像的创建1、基于现有镜像创建(1)首先启动一个镜像,在容器里做修改(2)然…

记录Selenium自动化测试过程中接口的调用信息

上一篇博客,我写了python自动化框架的一些知识和粗浅的看法,在上一篇中我也给自己提出一个需求:如果记录在测试过程中接口的调用情况?提出这个需求,我觉得是有意义的。你在测试过程中肯定会遇到一些莫名其妙的问题&…

K8S故障排查

故障现象:部署pod时,报错没发调度到节点。 排查步骤: 1、查看集群的状态 [rootk8s-master1 nginx]#kubectl get nodes2、查看k8s组件的状态-kubelet,kube-apiservice 3、查看docker的Cgroup driver和k8s的Cgroup driver类型&…

创建Electron项目

一、使用vite 构建 electron项目 npm init vitelatest Need to install the following packages:create-vitelatest Ok to proceed? (y) y √ Project name: ... CertificateDownload √ Package name: ... certificatedownload √ Select a framework: Vue √ Select a var…

Packet Tracer - 配置和验证 NTP

Packet Tracer - 配置和验证 NTP 地址分配表 设备 接口 IP 地址 子网掩码 N1 NIC 209.165.200.225 255.255.255.0 R1 G0/0 209.165.200.226 255.255.255.0 R2 G0/0 209.165.200.227 255.255.255.0 目标 在本练习中,您将在 R1 和 R2 中配置 NTP 以…

1.react useState使用与常见问题

文章目录 0. 取消批处理合并更新, render 2次1. 合并更新,setCount(异步更新) 3次相当于1次, count值为12. 如何取消批处理合并,让值累加?,改为回调函数写法,内部会依次执行函数, 执行3次 count值为33. 异步更新,获取异步更新的值?useEffect4.利用扩展运算符的形式来解决对象…

NSS [SWPUCTF 2021 新生赛]pop

NSS [SWPUCTF 2021 新生赛]pop 倒推一下,最后一步是调用getflag函数,admin和password要求为w44m和08067。 第一步应该从w22m类的魔术方法__destruct()入手,所以中间第二步应该是w33m(第一步w22m类的魔术方法__destruct()里面的ec…

【LeetCode热题100】打卡第44天:倒数第30~25题

文章目录 【LeetCode热题100】打卡第44天:倒数第30~25题⛅前言 移动零🔒题目🔑题解 寻找重复数🔒题目🔑题解 二叉树的序列化与反序列化🔒题目🔑题解 最长递增子序列🔒题目&#x1f5…

pytorch分类和回归:阿里天池宠物年龄预测

文章目录 dog年龄预测论文Deep expectation of real and apparent age from a single image without facial landmarks分类的损失函数1.多分类交叉熵损失函数:2.KLDiv Loss: 分布差异3.facenet 三元组损失函数 timm and torchvisiontorchvision 尝试一&a…

全面防护!Fortinet发布混合式部署防火墙HMF

在企业IT复杂性日益增长、网络安全威胁日趋紧迫、网络安全设施可维护性逐渐降低的背景下,企业迫切寻求可无缝跨越所有IT区域,有效简化企业防护架构的统一解决方案。近日, Fortinet Accelerate 2023中国区15城巡展圆满落幕,在收官之…