Redis事务

Posted schangxiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis事务相关的知识,希望对你有一定的参考价值。

 

1、简介

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

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

 

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

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

 

1、Redis会将一个事务中的所有命令序列化,然后按顺序执行

2、执行中不会被其他命令插入,不允许出现加塞行为

 

2、命令

下表列出了 redis 事务的相关命令:

 

序号

命令及描述

1

DISCARD 
取消事务,放弃执行事务块内的所有命令。

2

EXEC 
执行所有事务块内的命令。

3

MULTI 
标记一个事务块的开始。

4

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

5

WATCH key [key ...] 
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

 

3、示例

3.1. 示例1MULTI EXEC

功能需求:AB账号转账50元,原始A账号余额是80元,B账户余额是10元。

一个事务的例子,它先以MULTI开始一个事务,然后将多个命令入队到事务中,最后由EXEC命令触发事务。

 

 技术图片

 

 技术图片

 

 

 

3.2. 示例2DISCARD放弃队列执行

     通过discard命令进行rollback的操作,就是回滚事务。

     技术图片

 

 

 

3.3. 示例3:事务的错误处理

   事务的错误处理:

      如果某个命令爆出来错误,则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

 技术图片

 

我们发现,incy hello 命令会出错,因为他将字符串-1操作。

但是这个命令也是在事务里面(事务队列里面),虽然他执行失败了,但是没影响别的命令的执行。

 

3.4. 示例4:事务的错误处理

   事务的错误处理:

   队列中的某个命令出现了报告错误,执行时整个的所有队列都会被取消。

 技术图片

 

由于之前的错误,导致事务回滚。

即运行时异常和编译错误时。

 

3.5. 示例5:事务的WATCH

WATCH key [key ...] 
监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断,回滚。

 

需求:某一账户在一事务中进行操作,在提交事务前,另一个进程对该账户进行操作。

 

 技术图片

 

 

(客户端1进行账户减10的操作,在事务中,注意是在watch监视中

 技术图片

 

(客户端2在客户端1未执行事务的时候,就减去了账户的100

技术图片

 


(客户端1此时执行exec,发现事务没有执行成功,回滚了。。

 

3.6. 示例5:事务的UNWATCH

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

 

这个命令用的少,因为在执行WATCH命令后,执行exec和discard命令后会自动执行unwatch,不需要自己主动执行unwatch

4、应用场景

  一组命令必须同时都执行,或者都不执行。

  我们想保证一组命令在执行过程之中不被其他命令插入。

  商品秒杀(活动)。

 

以上是关于Redis事务的主要内容,如果未能解决你的问题,请参考以下文章

redis避免大事务提交失败

redis学习redis事务

Redis入门——Redis事务

redis-- redis的事务

Redis的事务

Redis的事务和watch