文章目录:
1.开篇
Redis事务可以一次执行多个命令,并且带有以下三个重要的保证:
· 批量操作在发送 EXEC 命令前被放入队列缓存。
· 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
· 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历以下三个阶段:
· 开始事务。
· 命令入队。
· 执行事务。
一个事务的例子,它先以 MULTI 开始一个事务,然后将多个命令入队到事务中,最后由 EXEC 命令触发事务,一并执行事务中的所有命令。
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
2.Redis事务相关命令
序号 |
命令及描述 |
1 |
DISCARD |
2 |
EXEC |
3 |
MULTI |
4 |
UNWATCH |
5 |
WATCH key [key...] |
Redis Multi 命令用于标记一个事务块的开始。
事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。
redis 127.0.0.1:6379> Multi
总是返回 OK 。
Redis Exec 命令用于执行所有事务块内的命令。
redis 127.0.0.1:6379> Exec
事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil 。
如果在我们执行事务的时候,出现了语法错误,那么整个事务都不会被执行了。
我们让一个字符串自增,也就是执行 INCR 命令,这样肯定会出现错误,但是事务的其他语句还是正常执行了 。
当我们执行事务的时候,还未执行 EXEC,然后有其他客户端进行干扰。
可以看到在第一个客户端中,我们设置键 money 的值为150,之后执行 INCR 命令使得 money 自增1,紧接着再执行 EXEC 命令之前,我们打开另一个客户端,对 money 设置新的值999,此时返回第一个客户端,我们执行 EXEC 命令,可以看到 money 的值并没有受到第二个客户端的影响,仍然为自增之后的结果 151。(如果想解决这个问题,就需要用到下面的WATCH命令!!!)
Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
redis 127.0.0.1:6379> WATCH key [key ...]
总是返回 OK 。
使用 WATCH 命令对 money 进行监控,则事务中执行相应的命令,由于我们对 money 进行了监控,所以 EXEC 命令返回了 (nil),而在另一个客户端中对 money 进行修改,就修改成功了,值为 999。
Redis Unwatch 命令用于取消 WATCH 命令对所有 key 的监视。
redis 127.0.0.1:6379> UNWATCH
总是返回 OK 。
Redis Discard 命令用于取消事务,放弃执行事务块内的所有命令。
redis 127.0.0.1:6379> DISCARD
总是返回 OK 。







