Redis系列-事务

事务

1.事务的概念和原理

  • Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis中的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
  • 事务的原理是先将属于一个事务的命令发送给Redis,然后在让Redis一次执行这些命令
    Redis 通过 MULTI DISCARD EXEC WATCH 四个命令来实现事务功能,本章首先讨论使用 MULTI DISCARD EXEC 三个命令实现的一般事务,然后再来讨论带有 WATCH 的事务的实现  .

2. 事务相关命令

  • MULTI 
    • 标记一个事务块的开始。 随后的指令将在执行EXEC时作为一个原子执行。
    • Redis 事务是不可嵌套的,当客户端已经处于事务状态,而客户端又再向服务器发送 MULTI
      时,服务器只是简单地向客户端发送一个错误,然后继续等待其他命令的入队MULTI 命令
      的发送不会造成整个事务失败,也不会修改事务队列中已有的数据。


  • EXEC 
    • 执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行。

1.Redis保证一个事务中的所有命令要么被都不执行,要么都执行。
2.如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行;
3.一旦客户端发送了EXEC命令,所有的命令都会被执行,即使伺候客户端断线也没关系,因为Redis会记录所有要执行的命令。
WATCH  key [key …] 
  • 标记所有指定的key 被监视起来,在事务中有条件的执行(乐观锁)。
  • 被监控的键一旦被修改或删除,之后的事务就不会执行。(须在multi之前执行)
  • 监控一直会持续到EXEC命令。
  • UNWATCH
  • 取消一个事务中已被监视的所有key。
  • 如果执行EXEC 或者DISCARD, 则不需要手动执行UNWATCH 。

DISCARD

  • 命令用于取消一个事务,它清空客户端的整个事务队列,然后将客户端从事务状态
    调整回非事务状态,最后返回字符串
    OK 给客户端,说明事务已被取消。

3.在事务和非事务状态下执行命令的区别

    无论在事务状态下,还是在非事务状态下,Redis 命令都由同一个函数执行,所以它们共享很多服务器一般设置,比如 AOF 的配置、 RDB 的配置,以及内存限制,等等。不过事务中的命令和普通命令在执行上还是有一点区别的,其中最重要的两点是:

  1. 非事务状态下的命令以单个命令为单位执行,前一个命令和后一个命令的客户端不一定是同一个;  而事务状态则是以一个事务为单位,执行事务队列中的所有命令:除非当前事务执行完毕,否则服务器不会中断事务,也不会执行其他客户端的其他命令。
  2. 在非事务状态下,执行命令所得的结果会立即被返回给客户端;而事务则是将所有命令的结果集合到回复队列,再作为 EXEC 命令的结果返回给客户端。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值