redis事务可以一次执行多个命令,并且带有以下两个重要的保证:
1、批量操作在发送exec命令前被放入队列缓存。
2、收到exec命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
3、在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
一个事务从开始到执行会经历一下三个阶段:
(1)开始事务
(2)命令入队
(3)执行事务。
实例:一下是一个事务的例子,它现已MULTI开始一个事务,然后将多个命令入队到事务中,最后exec命令触发事务,一并执行事务中的所有命令:
1 127.0.0.1:6379> multi 2 OK 3 127.0.0.1:6379> set book_name "english" 4 QUEUED 5 127.0.0.1:6379> get book_name 6 QUEUED 7 127.0.0.1:6379> sadd tag "C++" "Python" "Java" "C" "c#" 8 QUEUED 9 127.0.0.1:6379> smembers tag 10 QUEUED 11 127.0.0.1:6379> exec 12 1) OK 13 2) "english" 14 3) (integer) 5 15 4) 1) "C" 16 2) "Python" 17 3) "Java" 18 4) "C++" 19 5) "c#" 20 127.0.0.1:6379> keys * 21 1) "tag" 22 2) "book_name"
redis事务命令
discard命令
该命令用于取消事务,放弃执行事务块内的所有命令。
discard命令基本语法:discard
返回值:总是返回OK
实例:
1 127.0.0.1:6379> multi 2 OK 3 127.0.0.1:6379> ping 4 QUEUED 5 127.0.0.1:6379> set greeting "hello" 6 QUEUED 7 127.0.0.1:6379> discard #执行discard命令,事务块内的所有命令放弃执行 8 OK 9 127.0.0.1:6379> exec #执行discard命令后,在执行exec命令报错 10 (error) ERR EXEC without MULTI
exec命令
用于执行素有事务块内的命令
exec命令基本语法:exec
返回值:事务块内所有命令的返回值,按命令执行的先后顺序排列,当操作被打断时,返回空值nil.
实例:
1 127.0.0.1:6379> multi 2 OK 3 127.0.0.1:6379> incr user_id 4 QUEUED 5 127.0.0.1:6379> incr user_id 6 QUEUED 7 127.0.0.1:6379> incr user_id 8 QUEUED 9 127.0.0.1:6379> ping 10 QUEUED 11 127.0.0.1:6379> exec 12 1) (integer) 1 13 2) (integer) 2 14 3) (integer) 3 15 4) PONG 16 127.0.0.1:6379> keys * 17 1) "user_id" 18 127.0.0.1:6379> get user_id 19 "3"
multi命令
该命令用于标记一个事务块的开始,事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由exec命令原子性(atomic)地执行。
基本语法:multi
返回值:总是返回OK
实例:
1 127.0.0.1:6379> multi 2 OK 3 127.0.0.1:6379> incr user_id 4 QUEUED 5 127.0.0.1:6379> incr user_id 6 QUEUED 7 127.0.0.1:6379> incr user_id 8 QUEUED 9 127.0.0.1:6379> ping 10 QUEUED 11 127.0.0.1:6379> exec 12 1) (integer) 1 13 2) (integer) 2 14 3) (integer) 3 15 4) PONG
UNwatch命令
命令用于取消watch命令对所有key的监视。
基本语法:UNwatch
返回值:总是返回OK
实例:
1 127.0.0.1:6379> watch lock lock_times 2 OK 3 127.0.0.1:6379> unwatch 4 OK
watch命令
watch命令用于监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。
基本语法:watch key 【key...】
返回值:总是返回OK
实例:
1 127.0.0.1:6379> watch lock lock_times 2 OK