Redis事务详解(特性命令及使用案例)

Redis事务详解(特性命令及使用案例)-mikechen

Redis事务定义

Redis事务是一次可以执行多个命令,一个事务中所有的命令都会被序列化,在事务执行的过程中会按照顺序执行队列中的命令。

总的来说:Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令,事务在执行过程中不会被其他客户端发送来的命令打断。

 

Redis事务特性

Redis事务有如下三大特性

1.单独的隔离操作

事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

2.没有隔离级别的概念

队列中的命令没有提交之前不会被实际执行,因为事务提交前任何指令都不会被实际执行。

3.不保证原子性

事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

 

Redis事务命令

Redis提供了以下5个基本指令实现事务功能。

Redis事务详解(特性命令及使用案例)-mikechen

1.标记事务开始:MULTI

标记一个事务块的开始,Redis会将后续的命令逐个放入队列中。

示例如下:

Redis事务详解(特性命令及使用案例)-mikechen

2.执行事务:EXEC

执行事务中的所有操作命令,我们可以使用EXEC来提交一个事务,调用完EXEC之后,正确执行的都会返回OK。

示例如下:

Redis事务详解(特性命令及使用案例)-mikechen

3.取消事务:DISCARD

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

示例如下:

Redis事务详解(特性命令及使用案例)-mikechen

4.监控WATCH

监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。

示例如下:

Redis事务详解(特性命令及使用案例)-mikechen

5.取消UNWATCH

取消WATCH对所有key的监视。

 

Redis事务实例

上面谈了Redis事务的特征与具体操作命令,下面一起来看看相关的Redis事务案例,加强对Redis事务的理解。

我们首先为mikechen和ada初始化自己的金额,然后使用MULTI命令显式开启Redis事务,然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令。

# 给mikechen初始化100元
127.0.0.1:6379> set mikechen 100
OK
# 给ada初始化100元
127.0.0.1:6379> setada 100
OK
# 显式开启事务
127.0.0.1:6379> MULTI
OK
# 给mikechen增加10元
127.0.0.1:6379(TX)> INCRBY mikechen 10
QUEUED
# 给ada减少10元
127.0.0.1:6379(TX)> DECRBYada 10
QUEUED
# 执行事务中的所有指令(提交事务)
127.0.0.1:6379(TX)> EXEC
1) (integer) 110
2) (integer) 90

 

Redis事务优缺点

Redis事务优点:

  • 一次性按顺序执行多个Redis命令,不受其他客户端命令请求影响;
  • 事务中的命令要么都执行(命令间执行失败互相不影响),要么都不执行(比如中间有命令语法错误);

Redis事务缺点

  • 事务执行时,不能保证原子性;
  • 命令入队每次都需要和服务器进行交互,增加带宽;

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法