Redis事务使用详解


Redis 事务简介


redis事务是一组命令 要不全部执行成功 要不全部不执行。

例:
打开redis-cli客户端连接至redis数据库

redis 192.168.8.123:6379> flushdb  //清空当前redis数据库
OK
redis 192.168.8.123:6379> multi    //开始事务
OK
redis 192.168.8.123:6379> set k1 value1  //设置一个string类型键
QUEUED 
redis 192.168.8.123:6379> set k2 value2  //设置一个string类型键
QUEUED
redis 192.168.8.123:6379> set k3 value3  //设置一个string类型键
QUEUED
redis 192.168.8.123:6379> exec           //提交事务  分别返回三条命令的执行结果 
1) OK
2) OK
3) OK
redis 192.168.8.123:6379> get k1
"value1"
redis 192.168.8.123:6379> get k2
"value2"
redis 192.168.8.123:6379> get k3
"value3"
 


1 当客户端输入mulit命令时,redis数据库返回 OK 表示事务开始成功
2 依次输入待执行的命令,当我们每输入一条命令时,客户端返回”QUEUED”,表示redis服务器接受此命令,并放入待执行区域
3 当客户端输入EXEC时,此时命令会依次提交至redis数据库执行
4 返回的三个OK 信息,依次对应三条命令的执行结果
此时未返回其它信息,代表命令全部执行成功。


redis 192.168.8.123:6379> flushdb     
OK
redis 192.168.8.123:6379> multi
OK
redis 192.168.8.123:6379> set k1 v1
QUEUED
redis 192.168.8.123:6379> show k2   //输入错误的命令  ,redis检测命令发现异常 未放入队列
(error) ERR unknown command 'show'
redis 192.168.8.123:6379> set k2 v2
QUEUED
redis 192.168.8.123:6379> exec     //提交事务 返回错误信息
(error) EXECABORT Transaction discarded because of previous errors.
redis 192.168.8.123:6379> get k1    //获取事务是否执行成功
(nil)
redis 192.168.8.123:6379>get k2     //获取事务是否执行成功
(nil)

以上的命令,就是在命令队列中加入错误的命令,所以整个命令队列都未执行,满足事务的ACID特性。


redis DISCARD命令

放弃当前的操作命令队列,丢弃未运行事务

 redis 192.168.8.123:6379> flushdb   //清空当前数据库 
OK
redis 192.168.8.123:6379> multi    //开启事务
OK
redis 192.168.8.123:6379> set k1 v1  
QUEUED
redis 192.168.8.123:6379> multi  //未丢弃事务时,再次开启事务,客户端返回错误信息
(error) ERR MULTI calls can not be nested
redis 192.168.8.123:6379> set k2 v2
QUEUED
redis 192.168.8.123:6379> exec
1) OK
2) OK
redis 192.168.8.123:6379> multi   //开启事务
OK
redis 192.168.8.123:6379> set k2 v2
QUEUED 
redis 192.168.8.123:6379> discard  //丢弃事务
OK
redis 192.168.8.123:6379> multi  //开启事务
OK
redis 192.168.8.123:6379> set k3 4
QUEUED
redis 192.168.8.123:6379> exec
1) OK 

从以上的例子我们可以看出,当我们开启事务后,我们可以通过discard命令丢弃当前事务,如果在事务开启后,不执行discard 或 exec 命令,事务会一直处于等待接收命令状态。


redis WATCH命令

watch命令的功能是:监控一个键,当键变监控后,如果键发生修改/删除 操作,如果此时事务中涉及这个键,那么事务将会执行失败,当事务执行完毕后,watch命令会自动解除。 

语法如下:

redis 192.168.8.123>watch key1 key2 key3 ...
注意事项:

   watch 命令可以同时监控一个键或多个键
   命令执行成功后  返回OK

例:

   redis 192.168.8.123:6379> flushdb
OK
redis 192.168.8.123:6379> set k1  v1
OK
redis 192.168.8.123:6379> watch k1  //监控k1键 
OK
redis 192.168.8.123:6379> set k1 v2  //改变k1键
OK
redis 192.168.8.123:6379> get k1
"v2"
redis 192.168.8.123:6379> multi  //开启事务标记
OK
redis 192.168.8.123:6379> set k1 v3   
QUEUED
redis 192.168.8.123:6379> exec  //提交事务  由于键k1发生变化,客户端返回事务命令执行结果为空
(nil)
redis 192.168.8.123:6379> get k1
"v2" 
 


redis UNWATCH命令

UNWATCH命令的功能是:取消所有键的监控,同WATCH命令是一个互逆的命令

  redis 192.168.8.123:6379> flushdb
OK
redis 192.168.8.123:6379> set k1 v1
OK
redis 192.168.8.123:6379> watch k1  //监控一个键
OK
redis 192.168.8.123:6379> set k1 v2
OK
redis 192.168.8.123:6379> get k1
"v2" 
redis 192.168.8.123:6379> unwatch  //取消监控
OK
redis 192.168.8.123:6379> multi
OK
redis 192.168.8.123:6379> set k1 v2
QUEUED
redis 192.168.8.123:6379> set k1 v3
QUEUED
redis 192.168.8.123:6379> exec  //事务提交成功
1) OK
2) OK
redis 192.168.8.123:6379> get k1 //检测键是否被修改
"v3" 
 

相关阅读:
redis 事务 简介
window redis 文件夹文件说明 (二) —[ redis-cli]
window redis 文件夹文件说明 (一 )
Redis 数据类型简介
windows下 Redis配置
c# redis应用实例
redis相关简介
KV数据库简介