Redis 教程
1. Redis 教程 2. Redis 简介 3. Redis 安装 4. Redis 配置 5. Redis 数据类型 6. Redis 命令 7. Redis 键(key) 8. Redis 字符串(String) 9. Redis 哈希(Hash) 10. Redis 列表(List) 11. Redis 集合(Set) 12. Redis 有序集合(sorted set) 13. Redis HyperLogLog 14. Redis 发布订阅 15. Redis 事务 16. Redis 脚本 17. Redis 连接 18. Redis 服务器 19. Redis 数据备份与恢复 20. Redis 安全 21. Redis 性能测试 22. Redis 客户端连接 23. Redis 管道技术 24. Redis 分区 25. Java 使用 Redis 26. PHP 使用 Redis

Redis 事务

Redis 事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

实例

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:


redis 127.0.0.1:6379> MULTI

OK



redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"

QUEUED



redis 127.0.0.1:6379> GET book-name

QUEUED



redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"

QUEUED



redis 127.0.0.1:6379> SMEMBERS tag

QUEUED



redis 127.0.0.1:6379> EXEC

1) OK

2) "Mastering C++ in 21 days"

3) (integer) 3

4) 1) "Mastering Series"

   2) "C++"

   3) "Programming"

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

这是官网上的说明 From redis docs on transactions:

It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

比如:


redis 127.0.0.1:7000> multi

OK

redis 127.0.0.1:7000> set a aaa

QUEUED

redis 127.0.0.1:7000> set b bbb

QUEUED

redis 127.0.0.1:7000> set c ccc

QUEUED

redis 127.0.0.1:7000> exec

1) OK

2) OK

3) OK

如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。


Redis 事务命令

下表列出了 redis 事务的相关命令:

序号命令及描述
1DISCARD
取消事务,放弃执行事务块内的所有命令。
2EXEC
执行所有事务块内的命令。
3MULTI
标记一个事务块的开始。
4UNWATCH
取消 WATCH 命令对所有 key 的监视。
5WATCH key [key ...]
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。