Redis 事务指令 MULTI、EXEC、DISCARD、WATCH、UNWATCH

Redis 事务

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

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

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

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

 

1.DISCARD用来取消一个事务;

2.EXEC用来执行一个事务;

3.MULTI用来组装一个事务; 

4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行

5.WATCH取消 WATCH 命令对所有 key 的监视。

 

在用MULTI组装事务时,每一个命令都会进入到内存队列中缓存起来,如果出现QUEUED则表示我们这个命令成功插入了缓存队列,在将来执行EXEC时,这些被QUEUED的命令都会被组装成一个事务来执行。


1.调用EXEC之前的错误

有可能是由于语法有误导致的,也可能时由于内存不足导致的。只要出现某个命令无法成功写入缓冲队列的情况,redis都会进行记录,在客户端调用EXEC时,redis会拒绝执行这一事务。

2.调用EXEC之后的错误

而对于“调用EXEC之后的错误”(入队成功,执行出错),redis则采取了完全不同的策略,即redis不会理睬这些错误,而是继续向下执行事务中的其他命令。这是因为,对于应用层面的错误,并不是redis自身需要考虑和处理的问题,所以一个事务中如果某一条命令执行失败,并不会影响接下来的其他命令的执行。

指令“WATCH",这是一个很好用的指令,它可以帮我们实现类似于“乐观锁”的效果

 

 

WATCH都会尽职尽责的监视,一旦发现某个key被修改了,在执行EXEC时就会返回nil,表示事务无法触发。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis事务是一组命令的集合,可以作为一个单一的原子操作进行执行。Redis事务通过MULTIEXECDISCARD三条指令来进行操作。 MULTI指令用于开启一个事务。当执行MULTI指令后,Redis会将客户端的操作转换为一个事务队列,而不是立即执行。之后,所有的命令都会被放入这个队列中,直到EXEC指令被调用。 在MULTIEXEC之间,可以执行任意多条命令,Redis会将这些命令按照顺序放入事务队列中。这意味着在事务队列中的所有命令可以在EXEC执行时原子地一起执行,保证了事务的一致性。 EXEC指令用于执行事务队列中的所有命令。当EXEC被调用时,Redis会按照顺序执行事务队列中的所有命令,并返回每个命令的执行结果。如果在执行事务时发生了错误,Redis会返回对应的错误信息。 DISCARD指令用于取消一个事务,将事务队列中的所有命令清空。当调用DISCARD时,所有在MULTIEXEC之间的命令都会被丢弃,Redis会忽略这些命令的执行。 通过使用这三条指令,我们可以将多个Redis命令捆绑在一起,形成一个原子操作的事务。这样可以保证多个命令的一致性并且提高执行效率,因为事务中的所有命令会在一次调用中一起执行,减少了客户端和服务器之间的通信开销。但需要注意的是,Redis事务不能保证原子性,因为在执行过程中可能发生异常或错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值