【redis知识点整理】 --- redis事务简介

redis官网关于redis事务的描述:https://redis.io/topics/transactions



1 redis的事务与mysql等关系型数据库事务的不同

关系型数据库的事务想必大家都不陌生,即在一个事务内的所有操作,要么全部成功,要么全部失败!!!
在这里插入图片描述
而redis数据库中的事务却并非如此,这里我把redis官网里关于redis事务的介绍贴在了上面,通过红色框框内的字体可以看到,redis官网对于redis事务的描述是:在redis 的事务内,所有的命令要么全部执行,要么全部不执行,因此redis的事务也是原子性的。

这和关系型数据库的事务看似相似,但是实则大不相同:

  • 关系型数据库的事务是: 一个事务内的操作要么全部成功,要么全部失败
  • 而redis数据库的事务是:一个事务内的操作要么全部执行,要么全部不执行

这里一定要区分清楚 — 即redis并不会像关系型数据库一样,当发生错误时进行事务的回滚!!!


2 redis的事务怎么玩?


2.1 正常情况下

举例如下:
在这里插入图片描述
可以看到正常情况下redis事务的执行流程如下:

  • MULTI命令即开启了事务
  • 之后的每条命令都会加入到一个队列里
  • 最后运行命令EXEC,在事务里加入到队列的命令将按照顺序依次执行

redis的原子性就表现在,它可以让一个事务中入队的这些所有命令,依次顺序的执行,且在这些命令执行期间,永远不可能有其他非这个事务的命令插入到中间进行执行。


2.2 当事务中有错误时


2.2.1 在事务内直接报错 —> 事务内所有的操作将全部失败

举例如下:
在这里插入图片描述
由此可知当某条命令直接在事务内就报错时:

  • 当前事务会被自动取消
  • 当前事务内的所有操作将会全部失败 — 只是入队了,但根本都没执行

2.2.2 当执行完EXEC才知道事务中的某条命令有误时 —> 只有该条命令失败

举例如下:
在这里插入图片描述
由此可知当执行完EXEC才知道事务中的某条命令有误时:

  • 全部命令都执行了,失败的就失败了,成功的也会成功。

这其实就是和为什么说redis的事务和mysql等关系型数据库事务实则大不相同的原因。


2.2.3 redis不支持事务回滚的原因

直接把官网给出的理由贴出来吧:
在这里插入图片描述


2.3 事务撤销 — Discarding the command queue

前面已经说过,当使用MULTI 命令开启事务后,之后的命令都会加入到一个队列里,当运行了EXEC命令后,队列中的命令才会一次性丢给redis进行执行 。 而DISCARD命令可以在事务内部,随时将队列进行撤销。
在这里插入图片描述


2.4 WATCH / UNWATCH — 类似于CAS机制

前置知识 乐观锁、悲观锁 、 CAS等
CAS可参考我的另一篇文章《【并发编程】 — Compare And Swap(CAS)原理分析

举例如下:

正常的使用WATCH / UNWATCH,但这并不能体现出什么
在这里插入图片描述

WATCH真正的体现, 类似于CAS机制
在这里插入图片描述
由此可知Watch极其类似于CAS机制,即:

  • (1)当监控了某个或某些个值时,之后还可以允许其他进程或线程对其进行操作
  • (2)但是当我开启事务后,并在事务里对监控的值进行修改时,若提交事务,会先拿着当前值与监控时的值进行对比,如果一致,则更新成功,否则更新失败 —> 当然更新失败后就需要进行重试。。

这里把我在《【并发编程】 — Compare And Swap(CAS)原理分析》那篇文章里画的CAS的原理图贴出来,有兴趣的可以对比一下:
在这里插入图片描述


3 redis脚本和事务

我这篇文章基本是对于redis官网 https://redis.io/topics/transactions 事务这一部分的翻译 + 具体实践 ,关于redis脚本和事务这一块,我就直接引用官网的原文了:
在这里插入图片描述
这段话啥意思呢?

  • (1) redis脚本可以做现在redis提供的事务的任何工作,且脚本方式更简单,更快
  • (2)之所以又有脚本方式、又有本文介绍的这些方式,是因为本文介绍的内容很早就有了,脚本方式是Redis2.6才引入的
  • (3)或许未来所有使用redis的用户都只用脚本方式进行事务的操作,如果真是那样,redis官网就有可能弃用并删除本文介绍的事务方式。

end!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值