Redis事物

Redis 事务

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

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

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

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

Redis事物的两个特点:“连坐”“冤有头债有主”

Redis事物命令:

  1. MULTI:标记一个事物块的开始
  2. EXEC:执行书屋块中的命令
  3. WATCH key1 [key2 key3.....]:监视多个key,多个key之间用空格分割。若这些key在事物执行前被修改,事物将会被打断
  4. UNWATCH:取消watch命令对所有key的监视
  5. DISCARD:取消事物,放弃multi块中的所有命令

Redis事物相关命令演示:

MULTI、EXEC:

1、首先我们启动同一个redis服务的两个redis客户端,并添加几条数据:

2、我们用事物添加和修改一些数据

这里我们可以看到,开启事物后,对redis中数据的操作命令后,输出的是:QUEUE,而不再是OK。且从另一个客户端中获取的数据,没有任何变化。

3、执行事物中的命令:exec

执行exec后。multi命令后的所有命令都被执行,且从另一个客户端中,也可以获取到更新后的数据。当然multi事物块中也可以执行查询操作:

WATCH、MULTI、EXEC:

watch命令用于监控指定的key,如果key被更改,则事物取消,multi块中的命令也不会被执行。

我们首先用watch命令监视key;第二步,在multi块中操作被监视的key;第三步,在执行multi中的命令前,将被监视的key更改;最后,执行exec命令,执行multi中的命令。这时我们会发现,执行exec后,输出的是nil(空)。再次获取multi中被修改的key时,得到的不是multi中被设定的值,由此可见,multi中的命令没有被执行。

注意:

  1. 这里如果我们将第二步和第三步顺序颠倒,事物依然会被取消。也就是说只要key被监视后,对key的更新操作,而key被取消监视前,的首次事物操作,都会被取消事物操作。
  2. watch命令后,进行一次事物操作,无论事物是否成功,监视都会结束,即监视命令式一次性的。

如下图:

UNWATCH、DISCARD:

unwatch是在watch命令后,取消所有被监视的key;discard是执行multi命令后,但是执行exec前,取消当前事物即事物中的所有命令。执行效果如下图:

事物的“连坐”和“冤头债主”:

所谓“连坐”是指,multi块中,有任何一个语句不合法,则所有语句都不会执行。这里的语句不合法指的是命令不是redis能执行的命令,如下图所示:

在multi后的命令中,有一个错误settt命令,他不是redis能识别的命令,导致multi块中的所有命令都不能被执行。这就是所谓的连坐。

而“冤头债主”是指,在multi块中的命令都是可以被redis执行的命令,但是如果其中一条语句执行出错,不会影响其他语句的执行,如下图:

multi块中的命令,由于key3不是数值类型的数据,在执行“incr key3”时会出错,但是不影响其他两条命令的执行。我们在执行exec命令后,可以看到输出了两个OK和一个error,且在查询key1、key2、key3时,key1、key2的值已经被更新。

 

由此可以看出,redis对事物的支持,只能说是部分支持,不是强支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值