Redis事务

目录

前言

一.redis事务原理

二.事务命令


Redis的学习专栏:http://t.csdnimg.cn/a8cvV

前言

        谈起事务,就会想起MySQL的四大特性,原子性、隔离性、一致性以及持久性。但是在Redis上,Redis的事务机制主要侧重于原子性,而在一致性、隔离性和持久性方面有一些特殊的实现和限制。并且在原子性上具有巨大的争议!

原子性:事务中包含的所有命令要么全部执行成功,要么全部执行失败,回滚。

而对于Redis而言,如果事务中的某个命令执行失败(例如语法错误或操作错误),事务中的其余命令仍会继续执行。因此对于原子性而言,他是不足的!因此个人而言,其实不具有原子性!并且在官网上,关于原子性的声明也删除了!

一致性:在事务开始之前和事务结束之后,数据库的完整性约束(例如,唯一性约束、外键约束等),没有被破坏;如果被破坏进行回滚

对于Redis而言,没有所谓的约束,更没有回滚机制,所以不具备所谓的一致性

隔离性:多个事务并发执行时,每个事务都有各自独立的操作空间,互不干扰。

Redis事务默认使用单线程处理,因此在执行事务期间不会被其他客户端的命令中断。这确保了在事务执行期间,Redis不会发生并发问题。

持久性:持久性指一旦事务提交,其结果就应该是永久性的。

在redis持久化章节里,我们可以学习到,无论是AOF还是RDB,都无法时刻写入硬盘当中,哪怕是AOF,如果进程异常挂了,那么主存的数据也不会写入硬盘!

一.redis事务原理

        redis事务的实现,其实使用了队列。在开始事务,会将之后执行的命令放入一个队列当中,直到执行命令的到来,一旦执行命令来此,队列的任务会按照顺序执行,由Redis主线程将事务的操作都执行!

未使用事务的情况下:

        假设商店里,有一件商品,数目为一个,两个客户端都进行购买,一般在Java当中,我们可以使用加锁的方式,如此第二个购买时,就会显示商品已抢空,而不会出现超卖的方式!但是在Redis当中,我们又是什么样的情况呢?

redis会开启事务并监视库存量,由于redis使用单线程处理命令,服务器就会接收先到来的执行命令,等执行完成之后,再进行执行下一条事务,而进行当监视的库存量等于0时,则会取消事务的执行,并且返回一个失败的状态!

注:集群不支持事务

二.事务命令

事务的命令有:

  1. MULTI: 开始事务。之后执行的命令都会被放入一个队列中等待执行。

  2. EXEC: 执行事务。将之前放入队列的所有命令一次性执行。

  3. DISCARD: 取消事务。取消事务中的所有命令,清空事务队列。

  4. WATCH: 监视给定的键。如果在事务执行之前,被监视的键被修改,事务将被打断。

watch的实现

        watch类似一个乐观锁,其作用主要是用来监视一个或多个键(key),以便在事务执行之前检测这些键是否被其他客户端修改过。

WATCH 更像是乐观锁中的版本控制机制,而不是传统的悲观锁。它不会直接锁定数据,而是在执行事务前检查监视的键是否被修改,从而决定是否继续执行事务。

特性

  • WATCH 是轻量级的,不会阻塞其他客户端对键的操作。
  • 它保证了事务的原子性和一致性,确保在执行事务时,监视的键没有被其他客户端修改过。

扩展资料:Redis有一种lua脚本,可以起到类似事务的效果

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tq02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值