Redis实例发生故障,而Redis使用RDB机制,事务的原子性能否得到保证?

Redis——Redis如何保证数据一致性? Redis 通过单线程操作、事务支持、持久化机制、复制和高可用、数据结构的原子性操作以及分布式锁等多种机制,保证了数据的一致性和可靠性。这些特性使得 Redis 成为一个广泛应用于高性能、高并发场景下的数据存储解决方案。 阅读详情

图片

Redis实例发生故障,而Redis使用的RDB机制,事务的原子性还能否得到保证?


干货:[公粽号:堆栈future]

Redis事务

Redis原子性保证


当Redis采用RDB机制保证数据可靠性时,Redis会按照一定的周期执行内存快照。

一个事务在执行过程中,事务操作对数据所做的修改并不会实时地记录到RDB中,而且,Redis也不会创建RDB快照。我们可以根据故障发生的时机以及RDB是否生成,分成三种情况来讨论事务的原子性保证。

  1. 假设事务在执行到一半时,实例发生了故障,在这种情况下,上一次RDB快照中不会包含事务所做的修改,而下一次RDB快照还没有执行。所以,实例恢复后,事务修改的数据会丢失,事务的原子性能得到保证。

  2. 假设事务执行完成后,RDB快照已经生成了,如果实例发生了故障,事务修改的数据可以从RDB中恢复,事务的原子性也就得到了保证。

  3. 假设事务执行已经完成,但是RDB快照还没有生成,如果实例发生了故障,那么,事务修改的数据就会全部丢失,也就谈不上原子性了。

Redis的事务到底是什么?Redis提供了MULTI、EXEC两个命令来完成这三个步骤。下面我们来分析下。

  • 第一步,客户端要使用一个命令显式地表示一个事务的开启。在Redis中,这个命令就是MULTI。

  • 第二步,客户端把事务中本身要执行的具体操作(例如增删改数据)发送给服务器端。这些操作就是Redis本身提供的数据读写命令,例如GET、SET等。不过,这些命令虽然被客户端发送到了服务器端,但Redis实例只是把这些命令暂存到一个命令队列中,并不会立即执行。

  • 第三步,客户端向服务器端发送提交事务的命令,让数据库实际执行第二步中发送的具体操作。Redis 提供的EXEC命令就是执行事务提交的。当服务器端收到EXEC命令后,才会实际执行命令队列中的所有命令。

了解了Redis的事务之后我们看下它如何满足ACID特性之一:原子性的(A)。

  1. 第一种情况是,在执行EXEC命令前,客户端发送的操作命令本身就有错误(比如语法错误,使用了不存在的命令),在命令入队时就被Redis实例判断出来了。等到执行了EXEC命令之后,Redis就会拒绝执行所有提交的命令操作,返回事务失败的结果。这样一来,事务中的所有命令都不会再被执行了,保证了原子性。

#开启事务
127.0.0.1:6379> MULTI
OK
#发送事务中的第一个操作,但是Redis不支持该命令,返回报错信息
127.0.0.1:6379> PUT a:stock 5
(error) ERR unknown command `PUT`, with args beginning with: `a:stock`, `5`, 
#发送事务中的第二个操作,这个操作是正确的命令,Redis把该命令入队
127.0.0.1:6379> DECR b:stock
QUEUED
#实际执行事务,但是之前命令有错误,所以Redis拒绝执行
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.

  1. 第一种情况是,事务操作入队时,命令和操作的数据类型不匹配,但Redis实例没有检查出错误。但是,在执行完EXEC命令以后,Redis实际执行这些事务操作时,就会报错。不过,需要注意的是,虽然Redis 会对错误命令报错,但还是会把正确的命令执行完。在这种情况下,事务的原子性就无法得到保证了。
#开启事务
127.0.0.1:6379> MULTI
OK
#发送事务中的第一个操作,LPOP命令操作的数据类型不匹配,此时并不报错
127.0.0.1:6379> LPOP a:stock
QUEUED
#发送事务中的第二个操作
127.0.0.1:6379> DECR b:stock
QUEUED
#实际执行事务,事务第一个操作执行报错
127.0.0.1:6379> EXEC
1) (error) WRONGTYPE Operation against a key holding the wrong kind of value
2) (integer) 8

  1. 最后,我们再来看下第三种情况:在执行事务的EXEC命令时,Redis实例发生了故障,导致事务执行失败。在这种情况下,如果Redis开启了AOF日志,那么,只会有部分的事务操作被记录到AOF日志中。我们需要使用redis-check-aof工具检查AOF日志文件,这个工具可以把未完成的事务操作从AOF文件中去除。这样一来,我们使用AOF恢复实例后,事务操作不会再被执行,从而保证了原子性。当然,如果AOF日志并没有开启,那么实例重启后,数据也都没法恢复了,此时,也就谈不上原子性了。

总结下Redis原子性保证情况如下:

  • 命令入队时就报错,会放弃事务执行,保证原子性;

  • 命令入队时没报错,实际执行时报错,不保证原子性;

  • EXEC命令执行时实例故障,如果开启了AOF日志,可以保证原子性。

堆栈future

使很多处于迷茫阶段的coder能从这里找到光明,堆栈创世,功在当代,利在千秋

122篇原创内容

图片

【Redis】redis事务和锁、持久化、RDB、AOF、主从复制、集群、缓存穿透、缓存击穿、缓存雪崩、分布式锁和ACL机制 文章目录Redis事务和锁机制Multi、exec、discard事务的冲突问题悲观锁乐观锁WATCH key [key...] 乐观锁Redis事务三特性单独的隔离操作没有隔离级别的概念不保证原子性Redis持久化两种持久化方式RDBforkRDB的备份AOF备份AOF启动/修复/恢复AOF同步频率设置appendfsync alwaysappendfsync everysecappendfsync noRewrite压缩AOF持久化流程AOF优势AOF劣势Redis主从复制配置从库不配置主库一台从服务器 阅读详情

相关推荐

24.事务机制:Redis能实现ACID属性吗?

如果 Redis 使用了 RDB 模式,那么,在一个事务执行后,而下一次的 RDB 快照还未执行前,如果发生了实例宕机,这种情况下,事务修改的数据也是不能保证持久化的。如果 Redis 采用了 AOF 模式,因为 AOF 模式的三种配置选项 no、everysec 和 always 都会存在数据丢失的情况,所以,事务的持久性属性也还是得不到保证。是,在执行 EXEC 命令前,客户端发送的操作命令本身就有错误(比如语法错误,使用了不存在的命令),在命令入队时就被 Redis 实例判断出来了。

anglybaby的博客 769

为什么Redis的操作是原子性的,怎么保证原子性的?

单线程模型:消除了并发竞争条件。命令的原子性:每个命令在执行时都是原子性的。事务机制:通过MULTI和EXEC实现多个命令的原子性执行。乐观锁机制:通过WATCH命令监视键的变化。Lua脚本:在服务器端执行的脚本是原子性的。这些机制确保了Redis在高并发环境下依然可以保证操作的原子性和数据的一致性。

wupanP的博客 1578

别再手动算频谱了!用这个在线FFT工具,5分钟搞定JSON/CSV数据分析

本文介绍了一款高效的在线FFT工具,帮助用户快速分析JSON/CSV格式的时域数据,5分钟内完成频谱分析。通过傅里叶变换(FFT)算法,大幅提升计算效率,解决传统手动计算的痛点,适用于工业振动分析、设备故障诊断等场景。

weixin_29172201的博客 258

Redis 事务是否具备原子性?

Redis 事务是否具备原子性?

Hanyinh的博客 889

国家医保移动支付国密算法SM2签名验签、SM4加解密DLL

DLL,非.net开发,所以无需安装配置,直接程序引用开发即可,支持各类开发语言。已知省份有广西、贵州、安徽、河北、黑龙江、湖南、吉林、江苏、四川、新疆等各地方。国家医保移动支付国密算法SM2签名验签、SM4加解密DLL。//SM4加密与解密。支持医保移动支付(国家统一版),//SM2签名与验签。

4263

从零开始学习信号完整性(SIPI)--1 简介

信号完整性就是研究如何让驱动芯片发出的信号经过传输通道被接收芯片正确接收的学问。 信号完整性包含了三个要素: 信号:是被传输的主体,我们首先要了解、熟悉信号的特性。 芯片:分为驱动芯片和接收芯片,信号完整性工程师就是要实现信号在驱动芯片和接收芯片之间的正确传输。 传输通道:是传输信号的介质,是信号所走的“路”。如何实现信号的正确传输呢?那就要信号完整性工程师为信号“修路”、“搭桥”。

qq_29476769的博客 4万+

redis常见的报错 和解决方案,收纳中,希望给大家帮助。

今天运行Redis时发生错误,错误信息如下: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for ...

会飞的程序猿的博客 1万+

Xilinx ZYNQ 7000学习笔记二(FSBL代码分析启动-汇编代码)

Xilinx ZYNQ 7000学习笔记

u011116085的博客 4246

Redis(十五)——Redis 持久化之 RDB 机制 和 AOF 机制

文章目录Redis(十五)——Redis 持久化之 RDB 机制 和 AOF 机制1、RDB(快照) 持久化2、AOF 持久化3、总结 Redis(十五)——Redis 持久化之 RDB 机制 和 AOF 机制 由于Redis的数据都存放在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。 redis提供两种方式进行持久化,一种是RDB(Redis

万里顾一程的博客 574

【PyBind11+anaconda+opencv+windows11+cmake+wsl+vscode】从入门到跑通。构建基于opencv c++的python package

如何安装请详见上文 【PyBind11+anaconda+opencv+windows11+cmake+wsl+vscode】从入门到跑通。构建基于opencv c++的python接口_子韵如初的博客-优快云博客w不需要安装啥x11 、 xming直接mobxterm可以搞定点击右上角的X server打开可视化服务器然后 apt install x11-apps -yxclock 搞定从mobxterm可以看到display的端口X11显示可视化的原理是就是通过X协议,类似于http对linux于w

weixin_43953700的博客 3万+

Visual Studio 2015 插件开发 从入门到放弃(一)

必需知识:C#和Visual Studio (1)安装 Visual Studio 2015 的时候选择 Visual Studio 扩展性工具(Visual Studio Extensibility Tools)。对于已经安装好 Visual Studio 2015 的小伙伴,可以找VS2015的安装包,或者在程序与功能中找VS2015双击,在VS2015界面中选择 修改,再选择

AncientPeople的博客 2万+

【2023】Redis事务

Redis事务是一组命令的集合,这些命令要么全部执行,要么全部不执行。它们被视为一个单独的操作单元,要么完全成功,要么完全失败。Redis事务可以用来实现ACID属性(原子性、一致性、隔离性、持久性1️⃣:原子性,是指一个Redis事务中的所有操作要么全部完成,要么全部不完成;2️⃣:一致性是指在事务开始和结束时,数据库的状态必须是一致的;3️⃣:隔离性是指多个事务之间的操作是相互独立的,不会相互干扰;4️⃣:持久性是指事务的操作必须被持久化到磁盘上,即使在发生故障时也能恢复数据库状态。

皮皮的博客 2219

Spring Boot 与 Redisson 版本适配深度解析

Spring Boot 与 Redisson 的版本适配是一个动态演进的过程。开发者需要密切关注两者官方的版本更新日志,建立完善的版本验证机制。本文提供的适配方案基于当前最新技术状态(2024年1月),建议在实际生产环境中通过灰度发布策略验证版本兼容性。只有深入理解底层技术原理,才能在分布式系统的星辰大海中稳健航行。延伸阅读Spring Boot 官方迁移指南。

fudaihb的博客 1081

【Redis】聊一下Redis事务以及watch机制

聊一下Redis事务以及watch机制

芝兰生于深谷,不以无人而不芳 1627

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

YOLO格式数据集【数据增强】终极脚本 | 70+种顶级数据增强方法 | 可带标签增强

Coding... 5500

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Redis(四):持久化和事务:RDB(定期备份)【触发机制、流程说明、文件的处理、优缺点】、AOF(实时备份)【使用AOF、命令写入、文件同步、重写机制、启动时数据恢复】、Redis 事务【操作】

Redis(四):持久化和事务:RDB(定期备份)【触发机制、流程说明、文件的处理、优缺点】、AOF(实时备份)【使用AOF、命令写入、文件同步、重写机制、启动时数据恢复】、Redis 事务【操作、乐观锁和悲观锁】

m0_74343467的博客 1592

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Redis源码解析:Redis事务能保证ACID吗?

介绍 Redis事务中有命令语法错误时,无法保证原子性,其他情况可以保证原子性 Redis可以保证一致性,隔离性,无法保证原子性能和持久性 参考博客 [1]

小识的博客 784

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【Redis】持久化(RDB和AOF)和事务

对于数据的存储而言,为保证速度快,数据得在内存中,但为了持久,数据还得存在硬盘之中,Redis 的持久化机制是其高可靠性的核心,主要用于在重启或崩溃后恢复数据。和,以及从 4.0 版本开始支持的。

2302_79806056的博客 1189

Redis事务机制是否能保证ACID属性?

Redis中事务的执行过程包含三个步骤,Redis 提供了 MULTI、EXEC 两个命令来完成这三个步骤: 第一步,客户端要使用一个命令显式地表示一个事务的开启。在 Redis 中,这个命令就是 MULTI。 第二步,客户端把事务中本身要执行的具体操作(例如增删改数据)发送给服务器端。这些操作就是 Redis 本身提供的数据读写命令,例如 GET、SET 等。不过,这些命令虽然被客户端发送到了服务器端,但 Redis 实例只是把这些命令暂存到一个命令队列中,并不会立即执行。 第三步,客户端向服

ggh0314的博客 378

Redis事务

Redis事务、Redis事务保证ACID

aofeng9的博客 691

Redis 的事务支持ACID 吗?

作者简介:大家好,我是码炫码哥,前中兴通讯、美团架构师,现任某互联网公司CTO,兼职码炫课堂主讲源码系列专题代表作:《jdk源码&多线程&高并发》,《深入tomcat源码解析》,《深入netty源码解析》,《深入dubbo源码解析》,《深入springboot源码解析》,《深入spring源码解析》,《深入redis源码解析》等联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬。

smart_an的专栏 931

Redis核心机制-特点,持久化,事务

Redis特性,持久化,事务简介

qq_74056922的博客 980

redis中有关事务的特性

文章目录事务的四个特性:redis如何实现事务redis的事务机制能否保证ACID原子性:一致性 事务的四个特性: ACID: 原子性:一个事务中的多个操作要么都完成,要么都不完成。 一致性:数据库中的数据在事务执行前后是一致的。 隔离性:要求数据库在执行一个事务时,其它操作无法存取到正在执行事务访问的数据 持久性:数据库执行事务后,数据的修改要被持久化保存下来 redis如何实现事务 1:客户端开启事务命令:multi 2:客户端把事务中本身要执行的具体操作(例如增删改数据)发送给服务器端。Redis 实

诺图的博客 1533

Redis知识点总结

AOF 持久化就是以日志的形式来记录,每个写操作,将redis所有的指令记录下来(读操作不记录),只需追加文件但不可改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将指令从前到后执行一次完成数据的恢复。Redis 提供了两种持久化机制:RDB (Redis DataBase) 和 AOF (Append Only File),这两种方式都可以将内存中的数据保存到硬盘上,以便在重启时恢复数据。-------队列 set set set ------执行。

m0_74085490的博客 2109

Redis 事务机制,不得不会

Redis事务机制解析:核心特性为批量命令执行与部分原子性保障,通过MULTI/EXEC/WATCH等命令实现。与MySQL事务不同,Redis不支持回滚和完整ACID,适用于低并发批量操作场景(如库存扣减)。阿里实践中采用WATCH实现乐观锁,高并发场景则改用分布式锁+Lua脚本。面试重点包括与MySQL事务差异、WATCH原理及阻塞问题,需注意其适用边界与优化方案。

GQ_666的博客 748
上一篇: Redis del bigkey即使开启了lazyfree,为什么还是阻塞的,但是别人又不阻塞?why
下一篇: 2021-我的年终总结不一样
stackfuture
博客等级 码龄5年 23粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值