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还没有到时间进行备份,那么那个命令如果是存储操作就一定不会被存储下来,就会消失不见
码字不易,感谢大家支持!
本文深入解析Redis事务机制,包括MULTI与EXEC命令的功能对比MySQL的begin和commit,DISCARD命令的作用,以及WATCH命令如何确保事务的一致性和隔离性。探讨Redis事务的ACID特性,重点介绍其在一致性、隔离性方面的实现,同时指出原子性和持久性的局限。
959

被折叠的 条评论
为什么被折叠?



