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 事务,而不应该将其用在类似银行转账的严格的事务场合。

 

 

 

相关推荐
<p> <span style="font-size:14px;color:#E53333;">限时福利1:</span><span style="font-size:14px;">购课进答疑群专享柳峰(刘运强)老师答疑服务</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;"></span> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>为什么需要掌握高性能的MySQL实战?</strong></span> </p> <p> <span><span style="font-size:14px;"><br /> </span></span> <span style="font-size:14px;">由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准之一。</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了</span><span style="font-size:14px;">「高性能 MySQL 知识框架图」</span><span style="font-size:14px;">,帮你梳理学习重点,建议收藏!</span> </p> <p> <br /> </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006031401338860.png" /> </p> <p> <br /> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;">课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。</span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;"></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>一、性能优化篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>二、MySQL 8.0新特性篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>三、高性能架构篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>四、面试篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。</span> </p>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页