代码改变世界

Redis 事务

2018-03-03 12:13  DillGao  阅读(283)  评论(0编辑  收藏  举报

一、Redis 事务是什么

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

  • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

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

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

二、Redis Multi 命令

Redis Multi 命令用于标记一个事务块的开始。

事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性(atomic)地执行。

三、Redis Exec 命令

Redis Exec 命令用于执行所有事务块内的命令。

三、Redis Watch 命令

Redis Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

事务执行后,Watch 命令失效;也就是说下次事务执行不会监视这个 key 是否被其他命令改动。

 

实例:

# 事务被成功执行
 
redis 127.0.0.1:6379> MULTI               # 标记开始执行事务
OK
 
redis 127.0.0.1:6379> INCR user_id        # 事务中执行的命令
QUEUED
 
redis 127.0.0.1:6379> INCR user_id
QUEUED
 
redis 127.0.0.1:6379> INCR user_id
QUEUED
 
redis 127.0.0.1:6379> PING
QUEUED
 
redis 127.0.0.1:6379> EXEC               # 执行事务
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG
 
 
# 监视 key ,且事务成功执行
 
redis 127.0.0.1:6379> WATCH lock lock_times
OK
 
redis 127.0.0.1:6379> MULTI
OK
 
redis 127.0.0.1:6379> SET lock "huangz"
QUEUED
 
redis 127.0.0.1:6379> INCR lock_times
QUEUED
 
redis 127.0.0.1:6379> EXEC
1) OK
2) (integer) 1
 
 
# 监视 key ,且事务被打断
 
redis 127.0.0.1:6379> WATCH lock lock_times
OK
 
redis 127.0.0.1:6379> MULTI
OK
 
redis 127.0.0.1:6379> SET lock "joe"        # 就在这时,另一个客户端修改了 lock_times 的值
QUEUED
 
redis 127.0.0.1:6379> INCR lock_times
QUEUED
 
redis 127.0.0.1:6379> EXEC                  # 因为 lock_times 被修改, joe 的事务执行失败
(nil)