redis的事务

传统事务

Redis事务和传统事务的区别
传统事务特性(ACID)

  • 原子性(Atomicity): 事务的原子性是指事物是最小的执行单位,不允许分割,事务内的一系列操作,要不都执行,要不都不执行。
  • 一致性(Consistency): 事物的提交只会导致数据库的状态从一个一致性状态到另外一个一致性状态,换句话来说就是事务一系列操作的中间操作导致的中间不一致状态不会让别的事务看到。一致性状态指的是多个事务访问到的数据库的数据和数据结构是一致的。
  • 隔离性(Isolation): 事务的隔离性是指并发事务在执行过程中不能相互影响,其对数据库的影响和它们串行执行时一样。
  • 持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不会导致提交改变结果的丢失。

redis命令操作

在这里插入图片描述

Redis的事务

那么 Redis具有这些事务特性吗?
官网Redis事务链接

官网描述

What about rollbacks?
Redis does not support rollbacks of transactions since supporting rollbacks would have a significant impact on the simplicity and performance of Redis.
Redis不支持事务回滚,因为支持事务回滚将对Redis的简单性和性能产生重大影响

  • 原子性分析: 首先来看下Redis是否具有原子性,首先Redis不支持事务回滚操作,Redis事务在组队阶段若某一个命令出错会中断事务放弃事务内的所有命令;但到了真正的执行阶段,若事务内某一个命令执行出错,却不影响其它命令,抛弃出错命令,其它命令照常执行,以此看来Redis并不满足原子性的事务内命令要不都执行要不都不执行的特性,因此Redis事务并没有原子性。从这个角度来看,Redis事务更像一个批量处理的操作。虽然Redis在组队阶段会对命令进行检查,对于错误的命令会放弃事务的执行,但若是因为程序员自身的逻辑问题导致事务的某一个命令在执行阶段被抛弃,其它命令照样执行,最终的结果还是事务的一些操作执行,一些操作没有执行,从结果来看还是违背了事务的原子性定义。
  • 隔离性分析: Redis是用单线程来处理请求,天然就具有隔离性,因为它本来就是串行的执行命令,具有最高的隔离级别。其它客户端的命令无法在Redis事务执行的过程中插入进去,自然也无法影响其事务执行。
  • 持久性分析: Redis与Memcached的一个区别就是Redis支持持久化,Redis支持RDB(快照)和AOF两种持久化机制(当然Redis也可以设置为不进行持久化)。RDB的机制是每隔一段时间将内存中的数据以快照的方式存储到磁盘dump.rdb文件中;而AOF是每当有写命令执行时,都将写命令写入磁盘的appendonly.aof文件中(也可以设置为每隔一秒将写命令写入文件),以便机器重启时通过写命令再将数据更新到内存中,AOF方式持久化的实时性更好。以此看来Redis事务其实是具有持久性的,若它使用的是AOF方式的每当有写命令,都将命令写入磁盘文件,可以保证事务的持久性。
  • 一致性分析: Redis单线程处理请求以及Redis事务在执行时不允许别的命令插入的特点就决定了事务中间操作导致的中间一致性状态不会被其它事务所看到,且Redis可在机器宕机后通过持久化的文件恢复到一致性状态,从这些角度看,Redis事务貌似具有一致性。但Redis不支持事务回滚,意味着它很可能导致现实意义中的不一致性,例如常见的例子银行转账,账号A给B转账100,命令有两条,分别是账号A减去100和账号B加上100,若第一条命令出错,而第二条命令正常执行,就导致了不一致性。其实Redis为了保持简洁和效率,放弃了事务回滚,也就放弃了原子性和一致性,因为事务回滚主要是在命令出错时保持数据的一致性,而在Redis中,命令出错主要是编程人员使用错误,而这点应该在开发中被发现,而不是在使用过程中,因此Redis认为我不需要为你的错误买单,Redis放弃了事务回滚的机制。因此Redis不具有传统事务的一致性。

Redis常用来做缓存而不是真正意义上的数据库,不是用来永久存储数据,因此Redis的很多设计理念与普通关系型数据库并不一致,Redis事务为了简洁和快速抛弃了事务回滚,也就同时抛弃了原子性和一致性,事务操作更像是一个批量操作了,只是在批量操作过程中不允许别的事务或者命令加塞,插入进来。

Redis事务简单实操

Redis Transactions allow the execution of a group of commands in a single step, they are centered around the commands MULTI, EXEC, DISCARD and WATCH. Redis Transactions make two important guarantees
上面的意思是:redis的事务是将一组命令作为一个步骤一起执行,这些操作围绕着以下几个命令进行:

  1. MULTI用来组装一个事务;
  2. EXEC 用来执行一个事务;
  3. DISCARD 用来取消一个事务;
  4. WATCH 用来监视一些 key,一旦这些 key 在事务执行之前被改变,则取消事务的执行。

操作上手

  • 切换至db2
    在这里插入图片描述
  • 开启一个事务MULTI,并插入两条数据,刷新db2,并没有数据提交上去
    在这里插入图片描述
  • 提交事务 EXEC
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

WATCH 机制

使用 WATCH 监视一个或多个 key , 跟踪 key 的 value 修改情况,如果有key 的 value 值在事务 EXEC 执行之前被修改了,整个事务被取消。EXEC 返回提示信息,表示事务已经失败。
WATCH 机制使的事务 EXEC 变的有条件,事务只有在被 WATCH 的 key 没有修改的前提下才能执行。不满足条件,事务被取消。使用 WATCH 监视了一个带过期时间的键,那么即使这个键过期了,事务仍然可以正常执行.
大多数情况下,不同的客户端会访问不同的键,相互同时竞争同一 key 的情况一般都很少,watch 能很好解决数据冲突的问题。
①WATCH 命令可以被调用多次。对键的监视从 WATCH 执行之后开始生效,直到调用 EXEC 为止。不管事务是否成功执行,对所有键的监视都会被取消。
②当客户端断开连接时,该客户端对键的监视也会被取消。
③UNWATCH 命令可以手动取消对所有键的监视
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值