Redis (十五)——Redis的事务机制

前言

Redis可以看成NoSQL类型的数据库系统, Redis也提供了事务, 但是和传统的关系型数据库的事务既有相似性, 也存在区别。Redis对事务的支持是部分支持

Redis事务简介

Redis的基本事务(basic transaction)需要用到MULTI命令和EXEC命令,Redis只能保证一个客户端发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个连接会进入一个事务的上下文,该连接后续的命令不会立即执行,而是先放在一个队列中,当执行exec命令时,redis会按照顺序的执行队列中的所有命令

Redis事务命令

在这里插入图片描述

事务的几种情况
1、正常执行

先看下面的例子:
在这里插入图片描述
通过上面的命令可以看到使用 multi 命令开启事务之后,执行的Redis命令返回结果 QUEUED(队列),表示命令并没有执行,而是暂时保存在Redis事务中,直到执行 exec 命令提交事务后才会执行上面的命令并且返回结果。只要是符合redis语法的命令都会入队成功,返回一个QUEUED。正常执行可以实现批处理的效果。

所以,事务正常执行的三个过程是:开启、入队、执行。

2、放弃事务

在这里插入图片描述
可以看到,当我们开启一个事务后,不想提交这个事务,我们可以使用discard命令来放弃这个事务。

3、事务对异常的处理机制

Redis执行命令的错误主要分为两种:

  • 1.命令错误:执行命令语法错误,比如说将 set 命令写成 sett
  • 2.运行时错误:命令语法正确,但是执行错误,比如说对非数字的值执行 incr命令

(1)、命令错误处理机制-----全体连坐

开启事务之后,往事务中添加的命令如果有命令错误(语法错误),那么整个事务中的命令都不会执行。
在这里插入图片描述
这个案例中,开启事务后其他命令添加返回QUEUED,第三条命令语法错误,导致整个事务中的命令都不会执行。

(2)、运行时错误处理机制-----冤头债主

如果语法没有错误,而执行过程中发生了运行时错误,Redis不仅不会回滚事务,还会跳过这个运行时错误,继续向下执行命令。
在这里插入图片描述
在这个案例中,可以看到最后事务的执行结果是第一条和第三条命令执行成功,第二条命令执行失败,所以第二条命令由于“jj”不是数字,在执行“incr"命令时运行错误导致执行失败,不仅没有回滚事务而且还不会影响后续第三条命令的执行。

5、watch监控

WATCH是一个乐观锁,它可以在exec命令执行之前,监视任意数量的数据库键,并在exec命令执行时,检查被监视的键是否至少有一个已经被修改过了,如果是服务器则拒绝执行事务,并向客户端返回代表事务执行失败的空回复.。

客户端一:
在这里插入图片描述
客户端二:
在这里插入图片描述
在上面这个例子中,我们监视了k1,k2,k3 三个键。当客户端一在执行事务过程中,客户端二已经对k3的值做了改动,这时候监视到键k3已经被修改过了,服务器则拒绝执行事务,并向客户端返回代表事务执行失败的空回复.。遇到这种情况,需要我们将最新的值摘出来,重新进行修改和提交。

需要注意两点:

1、使用UNWATCH可以取消对所以key的监视。
2、一旦执行了EXEC命令,之前加的监控锁都会被取消掉了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis现有分布式事务的实现是通过Redis Cluster来实现的。Redis Cluster是Redis 3.0开始推出的分布式解决方案,可以很好地解决不同Redis节点存放不同数据,并将用户请求方便地路由到不同Redis的问题。在Redis Cluster中,使用了数据分区算法将数据分布在不同的节点上,每个节点负责管理自己分区的数据。这样可以提高系统的扩展性和可用性。 对于分布式事务的实现,Redis Cluster目前并没有直接支持事务的功能,但可以通过一些技巧和策略来实现类似的效果。例如,可以使用乐观锁机制来保证数据的一致性,通过在应用层进行事务的控制和处理。另外,也可以利用Redis的WATCH指令和MULTI/EXEC指令来实现基于命令的事务,尽管这种方式并不是严格的分布式事务。 此外,还可以利用Redis实现分布式锁来辅助实现分布式事务Redis提供了一些原子操作,如SETNX、GETSET等,可以用来实现分布式锁。通过在分布式系统中加锁和解锁的操作,可以保证在同一时间只有一个客户端能够对某个资源进行操作,从而保证数据的一致性。 总结起来,Redis目前的分布式事务实现主要依赖于Redis Cluster的分布式解决方案,并结合乐观锁机制、基于命令的事务和分布式锁等技术来实现。这些方法可以满足大部分的分布式事务需求,但需要开发人员在应用层面进行适当的处理和控制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [超详细Redis入门教程——Redis分布式系统](https://blog.csdn.net/qq_42146402/article/details/131483214)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [利用Redis实现分布式锁](https://blog.csdn.net/shasharoman/article/details/85056055)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值