Redis事务机制讲解与传统关系型事务比较

Redis基本命令

MULTI与EXEC命令

以 MULTI 开始一个事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令
在这里插入图片描述

DISCARD命令

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

get class应该返回nil 因为之前我有拿这个key操作过 不用在乎

当输入EXEC报错表示:EXEC没有MULTI 这两个是跟着的
在这里插入图片描述

WATCH命令

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

首先监听了msg这个键 在EXEC之前 新开一个客户端去修改msg键的值 再EXEC会失败 而且get出来的是新终端的值

在这里插入图片描述

图接Redis执行事务过程原理

如果set key value 会判断是否处于事务状态 如果处于事务状态 会返回Query
在这里插入图片描述

扫描二维码关注公众号,回复: 12918479 查看本文章

Redis事务ACID

传统关系型数据库ACID就不列举了 可以去博主Mysql专栏有详细讲解

原子性

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

一致性

入队错误

在命令入队的过程中,如果客户端向服务器发送了错误的命令,比如命令的参数数量不对,等等, 那么服务器将向客户端返回一个出错信息, 并且将客户端的事务状态设为 REDIS_DIRTY_EXEC 。

执行错误

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

隔离性

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

持久性

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

所以说Redis只具有原子性、一致性(一旦入队错误整个事务失败)和隔离性(事务都是单个队列组成)

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/113839128