基本的Redis事务

文章引用:

https://www.runoob.com/redis/redis-transactions.html
https://www.cnblogs.com/kyrin/p/5967620.html

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。




有时候为了同时处理多个结构,我们需要向Redis发送多个命令.尽管Redis有几个可以在两个键之前复制或移动元素的命令,但却没有那种可以在两个不同类型之间移动元素的命令(虽然可以使用ZUNIONSTORE命令将元素从一个集合复制到另外一个有序集合).为了对相同或者不同类型的多个键执行操作,Redis有5个命令可以让用户在不被打断(interruption)的情况下对多个键执行操作,他们分别是

  1. WATCH
  2. MULTI
  3. EXEC
  4. UNWATCH
  5. DISCARD.



这里写图片描述




1 什么是Redis的基本事务

Redis的基本事务(basic transaction)需要用到MULTI命令和EXEC命令.这种事务可以让客户端在不被其他客户端打断的情况下执行多个命令.和关系数据库那种可以在执行的过程进行回滚(rollback)的事务不同,在Redis里面,被MULTI和EXEC命令包围的所有命令会一个接一个地执行,直到所有命令都执行完毕为止.当一个事务执行完毕之后,Redis才会处理其他客户端的命令.

1 Redis不支持回滚
2 如果事务中的某一条命令出错,剩余命令仍然会执行。所以Redis事务并不能保证原子性。

要在Redis里面执行事务,我们首先需要执行MULTI命令,然后输入那些我们想要在事务里面执行的命令,最后再执行EXEC命令.当Redis从一个客户端那里接受到MULTI命令时,Redis会将这个客户端之后发送的命令都放入到一个对队列里面,知道这个客户端发送EXEC命令为止,然后Redis就会在不被打断的情况下,一个接一个地执行存储在队列里面的命令.从语义上来说,Redis事务在Python客户端上面是由流水线(pipeline)实现的:对连接对象调用pipeline()方法创建一个事务.在一切正常的情况下,客户端会自动的使用MULTI和EXEC包裹起用户输入的多个命令.此外,为了减少Redis与客户端之前的通信往返次数,提升执行多个命令的性能,Python的Redis客户端会存储起事务包含的多个命令,然后在事务执行时一次性第将所有命令都发送给Redis.

2 为什么Redis不支持回滚

如果你具备关系型数据库的知识背景,你就会发现一个事实:在事务运行期间,虽然Redis命令可能会执行失败,但是Redis仍然会执行事务中余下的其他命令,而不会执行回滚操作,你可能会觉得这种行为很奇怪。

然而,这种行为也有其合理之处:

只有当被调用的Redis命令有语法错误时,这条命令才会执行失败(在将这个命令放入事务队列期间,Redis能够发现此类问题),或者对某个键执行不符合其数据类型的操作:实际上,这就意味着只有程序错误才会导致Redis命令执行失败,这种错误很有可能在程序开发期间发现,一般很少在生产环境发现。
Redis已经在系统内部进行功能简化,这样可以确保更快的运行速度,因为Redis不需要事务回滚的能力。

对于Redis事务的这种行为,有一个普遍的反对观点,那就是程序有可能会有缺陷(bug)。但是,你应当注意到:事务回滚并不能解决任何程序错误。例如,如果某个查询会将一个键的值递增2,而不是1,或者递增错误的键,那么事务回滚机制是没有办法解决这些程序问题的。请注意,没有人能解决程序员自己的错误,这种错误可能会导致Redis命令执行失败。正因为这些程序错误不大可能会进入生产环境,所以我们在开发Redis时选用更加简单和快速的方法,没有实现错误回滚的功能。

3 Redis事务特征

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

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

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

  1. 开始事务。
  2. 命令入队。
  3. 执行事务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值