Redis 实用技术——事务

引言

redis的事务不像关系型数据库的事务那样完整。

“快”是redis的特征,在事务管理的过程中,使用muti命令开启事务块,当输入多条命令后,再使用exec命令执行事务块中的全部命令。

Redis事务可以保证两件事:

1、隔离性:事务是一个单独的隔离操作,这和关系型数据库的事务原则是一致的,事务中的所有命令都会顺序执行,且中途不会被其他事务打断。

2、原子性:要么全部执行,要么全不执行。

一、查看帮助

MULTI、EXEC、DISCARD、WATCH 是 Redis 事务的相关命令:

MULTI 命令用于开启一个事务,它总是返回OK,执行后,客户端可以继续向服务器发送多条命令,这些命令会被暂时存放到队列中而不执行。

EXEC 命令负责触发并执行事务中的所有命令,如果客户端在使用 MULTI 开启一个事务之后,因为掉线没有成功执行 EXEC ,那么事务中的所有命令都不会被执行。

DISCARD 客户端可以通过这个命令清空事务队列,视为放弃执行事务。

二、并发下的事务

由于Redis是单线程处理全部用户请求,因此,在并发事务中,每个命令都会排队执行,事务之间很可能出现“先删后取”的问题。

不论 multi 执行的先后,Redis 只根据最先接收到的 exec 命令来执行事务

如上图所示,绿色事务先开启事务块,但是在执行 exec 提交事务之前,被一个删除事务提前执行,那么绿色事务就无法正确获取 key 的value。

三、WATCH 提供的 CAS

WATCH 可以让 exec 命令有条件的执行:事务只能在所有被监视的key都没有被修改的前提下执行。这是watch为redis提供的check-and-set(CAS)行为。

watch 命令可以被调用多次,对 key 的监视从 watch 执行之后生效,直到调用 exec 为止。当exec 被调用时,不管事务是否成功执行,对所有 key 的监视都会被取消。

使用 无参的 unwatch ,可以手动取消对所有 key 的监视。

如果有至少一个被监视的 key 在 exec 执行之前被修改,那么整个事务都会被取消,exec 返回 nil-reply 来表示事务已经失败。

上面的两个客户端,左侧先watch stu 监视,右侧客户端更改 stu ,左侧再开启事务并修改 stu,最后 exec ,返回结果为 nil,且stu最终并没有被改变。

这种形式的锁被称为乐观锁,它是一种非常强大的锁机制,并且因为大多数情况下,不同的客户端会访问不同的键,碰撞的情况一般都很少,所以通常并不需要进行重试。

另外,当客户端断开连接时,该客户端对 key 的监视也会被取消。

四、事务中的错误

使用事务时可能会遇到两种错误:

1、执行 exec 之前入列命令错误,如语法、参数名、参数数量等。或其他严重错误,内存不足等。

2、执行 exec 之后失败,例如,事务中的命令与处理的类型不匹配等等。

对于第一种错误,在 Redis 2.6.5 之前,客户端会检查命令入列的返回值,如果是 QUEUED,入列成功,否则入列失败

从 2.6.5 开始,服务器会对命令入列失败的情况进行记录,并在客户端调用 exec 命令时,拒绝并自动放弃这个事务。

这种改进方式,是为了在 Redis 管道中包含事务,如果是以前的做法,那么一条拼接的多条命令如果中间某个出了问题将很难快速有效的执行,而改进后,情况就变得简单,发送事务和读取事务的回复都只需要和服务器进行一次通讯

对于第二种错误,exec 执行时或之后出错,并没有什么特别的处理,即使事务中有某些命令在执行时产生错误,事务中的其他命令仍然会继续执行

至于事务回复中,有一些是 OK 而有一些是 ERR,就需要由客户端自己决定如何处理,Redis 不会停止执行事务中的命令

这就是 “Redis 在事务失败时不进行回滚,而是继续执行余下的命令”的含义。这样做有以下几点优点:

1、Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。

2、因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

所以,通常对于精度要求不是特别严格的场合,就可以使用 redis 事务,而不应该将其用在类似银行转账的严格的事务场合。

 

 

 

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

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

相关文章

排序算法——归并排序的相关问题

一、小和问题 问题描述,给定一个数组,如[1, 3, 2, 6, 5],计算每个数左边小于自己的所有数的和,并累加。例如: 1左边没有数 3左边有一个小于自己的数 1 2左边有一个小于自己的数 1 6左边有三个小于自己的数 1 3 2 6…

经典数据结构——堆的实现

一、完全二叉树 堆是一种完全二叉树,什么是完全二叉树? 简单的说,一棵满二叉树表示的是所有节点全部饱和,最后一层全部占满: 而完全二叉树指的是满二叉树的最后一层,所有叶子节点都从左往顺序排满&#x…

排序算法 —— 堆排序

引言 此文基于《经典数据结构——堆的实现》中堆结构,实现一个以堆处理排序的算法。 一、算法思想 基于堆结构的堆排序的算法思想非常简单,循环获取大根堆中的最大值(0位置的根节点)放到堆的末尾,直到将堆拿空。 由…

经典数据结构——前缀树

引言 前缀树——trie /ˈtraɪ//树,也叫作“单词查找树”、“字典树”。 它属于多叉树结构,典型应用场景是统计、保存大量的字符串,经常被搜索引擎系统用于文本词频统计。它的优点是利用字符串的公共前缀来减少查找时间,最大限度…

排序算法 —— 计数排序

引言 计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在0~200之间,针对这样的数据,使用从0到200 的桶数组,桶的位置已经是有序的,…

Java多线程 —— 线程状态迁移

引言 线程状态迁移,又常被称作线程的生命周期,指的是线程从创建到终结需要经历哪些状态,什么情况下会出现哪些状态。 线程的状态直接关系着并发编程的各种问题,本文就线程的状态迁移做一初步探讨,并总结在何种情况下…

Java中的Unsafe

Java和C语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C手动管理内存的能力。 Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对…

arm中断保护和恢复_浅谈ARM处理器的七种异常处理

昨天的文章,我们谈了ARM处理器的七种运行模式,分别是:用户模式User(usr),系统模式System(sys),快速中断模式(fiq),管理模式Supervisor(svc),外部中断模式(irq),数据访问中止模式Abor…

Queue —— JUC 的豪华队列组件

目录引言一、Queue 的继承关系1.1 Queue 定义基础操作1.2 AbstractQueue 为子类减负1.3 BlockingQueue 阻塞式Queue1.4 Deque 两头进出二、Queue 的重要实现三、BlockingQueue 的实现原理四、Queue 在生产者消费者模式中的应用五、Queue 在线程池中的应用六、ConcurrentLinkedQ…

daad转换器实验数据_箔芯片电阻在高温应用A/D转换器中的应用

工业/应用领域高温:地震数据采集系统、石油勘探监测、高精度检测仪产品采用:V5X5 Bulk Metal (R) Foil芯片电阻案例介绍TX424是一个完整的4通道24位模数转换器,采用40脚封装。该设计采用最先进设计方案,两个双通道24位调节器和一个…

excel分段排序_学会这个神操作,报表填报不再五花八门,效率远超Excel

在报表工作人员的的日常工作中,常常要面临统计混乱的终端用户输入的问题。由于无法准确限制用户的输入内容,所以在最终进行数据统计时,常常会出现数据不合法的情况。为此需要花费大量的人力和时间核对校验数据。举个简单的例子,某…

IDEA——必备插件指南

目录一、Free-Mybatis-Plugin二、Lombok三、jclasslib Bytecode Viewer一、Free-Mybatis-Plugin 二、Lombok 三、jclasslib Bytecode Viewer 学习 class 文件的必备插件。 使用简单,安装后可以在菜单 View 中看到 show bytecode with jclasslib: 效果…

jitter 如何优化网络_如何做好关键词优化网络?

越来越多的传统企业开始建立自己的网站,进而不断的推广自己的产品。为了能够让自己的企业网站出现在搜索引擎的首页,现在最常用的手段就是竞价排名和关键词优化网络。往往很多企业会选择关键词优化网络这种方式来推广自己的网站,对于新手seoe…

python学生名片系统_Python入门教程完整版400集(懂中文就能学会)快来带走

如何入门Python?权威Python大型400集视频,学了Python可以做什么?小编今天给大家分享一套高老师的python400集视频教程,里面包含入门进阶,源码,实战项目等等,,不管你是正在学习中&…

JVM——详解类加载过程

导航一、过程概述二、Loading2.1 类加载器2.2 双亲委派机制2.3 类在内存中的结构三、Linking四、Initializing一、过程概述 java 源文件编译后会生成一个 .class文件存储在硬盘上。 在程序运行时,会将用到的类文件加载到 JVM 内存中。从磁盘到内存的过程总共分为三…

下载 Java 学习的权威文档

JVMS 和 JLS 文档的下载 快速直达: https://docs.oracle.com/javase/8/ --> Java Language and Virtual Machine Specifications jvm specification 和 java language specification 是Java 学习的两个最权威的文档。如果你用的是 Java 8,就可以去下载…

iso图像测试卡_4700万像素 五轴防抖 徕卡正式发布SL2无反相机

出自蜂鸟网-器材频道,原文链接:https://m.fengniao.com/document/5358989.html徕卡于今日正式发布SL2相机,搭载4700万像素CMOS感光元件、通过感光元件移位实现光学图像稳定的五轴防抖技术、全新徕卡物距探测式自动对焦技术以及576万像素分辨率…

JVM——对象的创建与内存布局

导航一、对象的创建过程二、对象的内存布局2.1 内存布局2.2 计算对象的内存大小三、对象的定位3.1 句柄池3.2 直接指针四、对象的分配过程一、对象的创建过程 对象,又叫实例,是 OOP 的最常用角色。 如何创建一个对象?一般都是使用 new 关键…

JVM垃圾收集器——G1

导航引言一、G1 介绍1.1 适用场景1.2 设计初衷1.3 关注焦点1.4 工作模式1.5 堆的逻辑结构1.6 主要收集目标1.7 停顿预测模型1.8 拷贝和压缩1.9 与 CMS 和 Parallel 收集器的比较1.10 固定停顿目标二、堆的逻辑分区2.1 region2.2 CSet2.3 RSet2.4 Card Table三、G1 的工作原理3.…

的mvc_简述PHP网站开发的MVC模式

为了提高开发时候的代码重用和开发速度,php使用了mvc的模式,主要是对代码的功能进行了分类,M:model主要是对数据库进行操作,v:view主要是前端html文件操作,c:controller主要是编写基…