`

Redis 事务

阅读更多

Redis 事务支持

 

Redis中事务相关的命令有MULTI、EXEC、DISCARD、WATCH和UNWATCH。

 

Redis事务保证原子性:要么所有命令都执行(都执行并不代表都成功执行),要么都不执行

 

事务以MULTI开始,以EXEC或DISCARD结束,示例:

原子性删除多个key:


 (版本3.2.5)

 

Redis会将MULTI后面的多个命令入队列,等待EXEC时将队列的命令顺序执行,在执行事务内的命令时不会去处理其它客户端的请求。

 

有两种事务错误的情况:

 

  • 命令无法入队列, 因此在执行EXEC之前我们就可以知道这种错误(正常入队列返回的是"QUEUED"), 什么情况下会出现无法入队列这种情况呢?比如错误的命令, 命令参数对不上, Redis服务器内存不足等

2.6.5版本之前, 客户端需要手动地检查是否所有命令入队成功, 客户端可以感知到第一种错误(只要不是返回QUEUED就是入队发送错误), 这时调用DISCARD终止事务即可,如果不这么做,会造成这样一种后果:部分命令执行成功而部分命令执行失败,示例:

 

 (版本2.4.5)

上面事务中有两条指令,第二条是语法错误的,因此入队列失败,调用exec时redis并不知道有命令入队列失败,因此会执行队列中的命令,也就是incr k1,这样导致对客户端来说出现不一致的现象。

 

在2.6.5版本及之后, 就无需自己检查是否所有的命令都入队成功了,Redis会自己记录下是否有命令入队不成功, 如果有, 那么调用EXEC时就会返回一个错误。这时调用DISCARD终止事务即可 

同样的例子:

 (版本3.2.5)

 

可以看到,和2.4.5版本不一样的是,当有命令入队列不成功时,调用exec时redis压根不会去执行该事务的任何命令,而是返回一个错误 

 

 

  • 命令本身符合语法, 但执行过程中出错(即EXEC调用后出错), 比如incr一个非数值类型的key

 演示:


 (版本2.6.5)

 

 

 (版本3.2.5)

 

 可以看到这种情况,无论哪个版本都一样,都会导致部分命令执行成功而部分执行失败的现象,也就是说Redis事务是没有回滚这个概念的(-__-),官方怎么解释这个?见文章末尾.

 

WATCH和UNWATCH命令

redis中的watch可以实现乐观锁的效果,用watch来实现incr:

 

WATCH mykey
val = GET mykey
val = val + 1
MULTI
SET mykey $val
EXEC

 如果事务执行过程中别的client修改了mykey的值,那么该事务将会失败,这就类似于cas的操作,你可以在客户端套一层循环来实现加1的操作

 

在以下情况时就无需显示地调用UNWATCH:

exec或者discard被调用后,所有被watched的key是都将变成unwatched状态。

connection断开时,所有该connection上被watched的key都将变成unwatched状态

 

 

Why Redis does not support roll backs?

If you have a relational databases background, the fact that Redis commands can fail during a transaction, but still Redis will execute the rest of the transaction instead of rolling back, may look odd to you.

However there are good opinions for this behavior:

  • Redis commands can fail only if called with a wrong syntax (and the problem is not detectable during the command queueing), or against keys holding the wrong data type: this means that in practical terms a failing command is the result of a programming errors, and a kind of error that is very likely to be detected during development, and not in production.
  • Redis is internally simplified and faster because it does not need the ability to roll back.

An argument against Redis point of view is that bugs happen, however it should be noted that in general the roll back does not save you from programming errors. For instance if a query increments a key by 2 instead of 1, or increments the wrong key, there is no way for a rollback mechanism to help. Given that no one can save the programmer from his or her errors, and that the kind of errors required for a Redis command to fail are unlikely to enter in production, we selected the simpler and faster approach of not supporting roll backs on errors.

 

 个人觉得这个解释比较勉强,程序员犯二是很正常的,一个事务中间错了一条命令,就会导致不一致的情况,这就比价尴尬了,所以我是不知道这个事务能用在啥地方?求路过的高人指点

 

  • 大小: 8.6 KB
  • 大小: 8.7 KB
  • 大小: 15.4 KB
  • 大小: 8.5 KB
  • 大小: 8.2 KB
0
1
分享到:
评论

相关推荐

    springboot-redis事务

    本文将深入探讨“SpringBoot-Redis事务”这一主题,旨在帮助开发者理解如何在SpringBoot项目中利用Redis进行事务操作。 首先,SpringBoot是Spring框架的一种快速启动方式,它简化了配置,提供了自动配置的功能,...

    redis事务与关系型数据库事务比较

    【Redis 事务与关系型数据库事务的比较】 Redis 和关系型数据库(如 MySQL)在事务处理上有显著的差异。在Redis中,事务提供了一种批量执行命令的方式,以确保原子性,但其机制与传统的ACID(原子性、一致性、隔离...

    redis事务常用操作详解

    Redis 事务是数据库系统中的一种特性,允许用户一次性提交...例如,Redis事务不支持回滚操作,如果事务中的某条命令失败,后续命令仍会执行。因此,在设计使用Redis的事务时,需要考虑到这些限制并进行适当的错误处理。

    redis事务回滚工具

    基于SpringBoot的轻量级redis事务回滚机制,使用栈和ThreadLocal记录业务链的redis操作,发生异常进行回滚,参考了阿里巴巴Seata AT模式的db回滚策略:补偿回滚,记录前镜像与当前操作语句,反向解析生成补偿动作。...

    redis事务_动力节点Java学院整理

    Redis 事务(Transactions)是 Redis 数据库提供的一种批量执行命令的功能,尽管它的事务机制相比于传统的关系型数据库事务较为简化,但仍能满足一些基本的事务需求。Redis 事务的主要特点在于其简单、快速和高效,...

    redis常用命令,redis配置文件,redis持久化,redis事务,redis主从复制,jedis的使用

    下面是对 Redis 的常用命令、配置文件、持久化、事务、主从复制、Jedis 使用的详细讲解。 Redis 常用命令 Redis 提供了很多有用的命令来管理和操作数据。下面是一些常用的 Redis 命令: * SET key value:设置...

    第7单元 Redis事务与持久化1

    【Redis事务】 Redis事务是Redis数据库中提供的一种确保数据操作原子性的机制,它允许用户在一个操作序列中执行多条命令,这些命令会被串行化并按顺序执行,以保证在并发环境下的数据一致性。事务的开启是通过`MULTI...

    redis事务处理:(error) EXECABORT

    然而,事务处理并非总是顺利进行,"redis事务处理:(error) EXECABORT" 是一个常见的错误提示,意味着在执行事务时遇到了问题。本文将深入探讨这个错误的原因以及如何解决。 一、Redis 事务基础 Redis 的事务机制...

    redis事务1

    Redis 事务是 Redis 数据库提供的一种批量执行命令的机制,旨在提高数据操作的效率和原子性。虽然在传统的数据库系统中,事务具有ACID(原子性、一致性、隔离性和持久性)特性,但 Redis 事务并不完全具备这些特性。...

    Redis事务的使用

    一、Redis事务简介 Redis事务可以一次执行多个命令,一个事务的所有命令都会序列化并按顺序地串行化执行,而不会被其他客户端提交的命令请求插入到事务执行命令序列中。 二、Redis事务命令 下面的表格节选自:...

    Redis 事务(上).flv

    Redis 事务(上).flv

    剖析!Redis事务实现原理

    在Redis中实现事务主要依靠以下几个命令来实现:Redis事务从开始到结束通常会通过三个阶段:1.事务开始2.命令入队3.事务执行以下是一个最简单的Redis事务流程:第一步跟其他的关系型数据库类似,也是需要开启一个事务...

    【高频 Redis 面试题】Redis 事务是否具备原子性?

    一、Redis 事务的实现原理 一个事务从开始到结束通常会经历以下三个阶段: 1、事务开始 客户端发送 MULTI 命令,服务器执行 MULTI 命令逻辑。 服务器会在客户端状态(redisClient)的 flags 属性打开 REDIS_MULTI ...

    redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

    redis 的并发竞争问题是什么?如何解决这个问题?了解 redis 事务的 CAS 方案吗?

    记录redisson实现redis分布式事务锁

    本篇文章将详细探讨如何使用Redisson实现Redis分布式事务锁,以及在Spring Boot环境中如何进行集成。 首先,Redis作为一个内存数据库,其高速读写性能使其成为实现分布式锁的理想选择。分布式锁的主要作用是在多...

    Redis事务及CAS(Check-And-Set)机制

    Redis事务和CAS(Check-And-Set)机制是Redis中用于处理并发操作的重要特性,确保数据的一致性和完整性。在高并发的网络活动中,如证券交易,这类机制是必不可少的。 Redis事务通过`MULTI`, `EXEC`, `DISCARD`, 和 ...

    Redis之Redis事务

    本文主要介绍了Redis事务的概念、Redis不保证原子性、Redis事务的三个阶段、Redis事务相关命令以及Redis事务使用案例。 本文来自于博客园,由火龙果软件Anna编辑、推荐。Redis事务的本质是一组命令的集合。事务支持...

Global site tag (gtag.js) - Google Analytics