一文带你熟悉Redis的事务机制

本文深入解析Redis事务机制,包括MULTI与EXEC命令的功能对比MySQL的begin和commit,DISCARD命令的作用,以及WATCH命令如何确保事务的一致性和隔离性。探讨Redis事务的ACID特性,重点介绍其在一致性、隔离性方面的实现,同时指出原子性和持久性的局限。

Redis也是支持事务的,相对来说是要比MySQL这样的数据库简单很多,那么接下来讲一下Redis的事务。

1Redis事务

1.1 MULTI与EXEC命令

MULTI:中文是多的意思,没有明白为什么用这个单词来表示开始事务,MULTI相当于MySQL的begin

EXEC:中文是执行的意思,相当于MySQL的commit

以MULTI开始一个事务,然后再多个命令入队到事务中,最后由EXEC命令触发事务,一并执行事务中的所有命令。

你可能想到那么ROBACK呢,Redis没有ROBACK,在执行事务的过程中,如果出现被其他终端改了当前事务数据,是不会修改当前事务操作的,除非WATCH情况外,一会儿会介绍

1.2 DISCARD

DISCARD中文是丢弃的意思,DISCARD命令用于取消一个事务,它清空客户端的整个事务队列,然后将客户端从事务状态调整非事务状态,最后返回字符串ok给客户端,说明事务已被取消

开始和执行事务示例:1-1图

1-1图

因为事务是队列形式做的,演示一下一套操作是什么情况,开始事务以后设置name,然后获取name,大家看一下返回的值是QUEUED,这个中文是排队的意思,意思是这些指令操作都存储队列里,执行exec才执行对应的命令,看最后我执行exec以后把事务我操作的命令对应的返回值都给我了。看如下1-2图

1-2图

在事务过程中由于命令错误导致失败,咱们看下会是什么情形。

在事务队列里一个操作命令引发错误,那么exec执行的时候不会进行操作。

看如下1-3图

1-3图

执行事务过程中被其他终端更改示例,如下1-4

在第一个终端(1-4图),此时还没有进行执行操作,在另一个终端(1-5图)进行修改相同的键的值操作,返回的是OK(但其实不OK),

1-4图

1-5图

回到第一个终端(1-6图)输入exec执行命令,查看结果发现没有被改,说明事务在进行处理的过程中不会被其他终端更改相同的键

1-6图

取消事务

1.3 WATCH命令

WATCH,中文观看,命令用于在事务开始之前监视任意数量的键;当调用EXEC命令执行事务时,如果任意一个被监视的键已被被其他客户端修改了,那么整个事务不再执行,直接返回失败。

示例:

如下1-1图

1.WATCH一个键

2.开始事务multi

3.存储一个叫df的值

1-1图

另一个终端连接redis以后输入命令存储同样的键,改下值(1-2图)

1-2图

回到第一个终端,提交事务,发现失败了!1-3图

1-3图

然后此时获取值就会发现已经被其他的操作改值了(1-4图)

1-4图

2.Redis事务处理过程

1.当服务端接收到客户端的命令判断当前客户端是否处于事务状态

  1.1 如果不是事务状态,那就去执行对应命令并返回结果给客户端

  1.2 如果是事务状态,那就判断命令是否是MULTI,,EXEC,WATCH,DISCARD

     1.2.1 如果是以上这些命令,就去执行命令,并返回结果

     1.2.2 如果不是,命令就进入队列等待执行,返回QUERY命令进入队列,直到输入EXEC,返回事务处理中所有命令结果。

3 Redis事务的ACID

3.1 原子性Actomicity(Redis不支持)

单个Redis命令是原子性的,但Redis没有在事务上增加任何维持原子性的机制,所以Redis事务执行并不是原子性的,如果一个事务队列中的所有命令都被成功的执行,那么称这个事务执行成功!

3.2 一致性Consistency(支持)

  3.2.1 入队错误:

  在事务处理中,命令入队的过程中,如果客户端向服务发送了错误的命令,比如命令的参数不对等等,那么服务器将向客户端      返回一个出错信息,并且事务中的命令全部失效,提交事务报错

  入队错误的示例:

  

 3.2.2 执行错误:

 如果命令在事务执行过程中发生错误,比如说,对于不同类型的key执行了错误的操作,那么Redis只会将错误包含在事务的结果中,这不会引起事务终端或整个失效,不会影响已执行事务命令的结果,也不会影响后面要执行的事务命令,所以它对事务一致性也没有影响。

3.3 隔离性Isolation(支持)

WATCH命令用在事务开始之前监视任意数量的键;当调用EXEC命令执行事务时,如果任意一个被监视多的键已经被其他客户端修改了,那么整个事务不再执行,直接返回失效。

3.4 持久性Qurability(不支持)

因为事务不过是用队列包裹起了一组Redis命令,并没有提供任何额外的持久性功能,所以事务的持久性由Redis所使用的持久化模型决定。

Redis持久化模式包括:rdb(数据内存备份) 、aof(append onlyif增量备份)每隔一秒钟做一个备份。因为数据在内存里,假如命令做完操作,但是突然宕机,但rdb或aof还没有到时间进行备份,那么那个命令如果是存储操作就一定不会被存储下来,就会消失不见

码字不易,感谢大家支持!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值