看完你才知道什么是Redis的持久化机制

Redis持久化机制 Redis持久化是一种重要的机制,用于将内存中的数据保存到磁盘上,以防止数据在服务器宕机或重启时丢失。Redis提供了两种主要的持久化方法:RDB(Redis DataBase)和AOF(Append Only File)。下面我将详细介绍这两种方法。RDB持久化会在指定的时间间隔内创建数据集的快照,并将其保存为一个单一的压缩文件。这个过程可以通过配置文件中的save指令来自动触发,也可以通过执行SAVE或BGSAVE命令来手动触发。 阅读详情

​

2022年6月的某一天,办公区的气氛格外的压抑,此时的小编吹着空调双眼微眯的站在同事胖虎身后,看着他满头大汗的将数据库的数据导入到Redis。

经过小编的一番询问才知道,原来是他们生产Redis今天莫名其妙的挂了,而且因为是新项目,一会要给领导演示用,生产环境Redis就只部署了一个节点,这一挂不要紧,缓存进去的数据怎么办...

恰巧这个时候,小编听见老板办公室里传出了一声大喊,“胖虎,来给我演示一下项目”,五分钟后,满脸通红的胖虎从老板办公室里出来了。

这时小编突然想到,Redis不是有持久化机制吗? 在和胖虎的交谈中发现,他竟然不知道Redis的持久化机制,小编就默默地装了个13。

Redis持久化

Redis 的持久化机制有两种,一种是快照(RDB),另一种是 AOF 日志。RDB是一次全量备份,AOF 日志是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本。

​

RDB快照

RDB快照持久化是Redis默认开启的,它会根据配置策略将内存数据保存在一个名为dmp.rdb的二进制文件中。

在redis.conf配置文件中,可以配置RDB的持久化策略,系统默认是有三个保存策略(三个同时生效),如下:

  • save 900 1 900秒内有1个键发生改变

  • save 300 10 30秒内有10个键发生改变

  • save 60 10000 60秒内有10000个键发生改变

我们也可以根据我们自己生产环境的具体情况进行配置。如果我们要关闭RDB快照,直接将配置文件中上述三个save注释掉即可。

写时复制机制(COW)

Redis提供了save命令进行快照生成,但是save命令要阻塞主进程(执行客户端命令的线程),当需要生成快照的内存特别大时(几百个G),需要的时间也会很长,甚至十几秒,所以这个时候如果阻塞主进程,会导致整个服务不可用,就得不偿失了。

针对这种情况,Redis借助操作系统提供的写时复制技术,提供了bgsave命令,basave命令可以在主进程的基础上,fork一个子进程,子进程会共享主进程的代码段和数据段,相当于是在后台生成快照。

在bgsave子进程写入RDB数据时,如果主进程对这些数据也都是读操作,那么,主进程和 bgsave 子进程相互不影响。但是,如果主进程要修改一块数据,这块数据就会被复制一份,生成该数据的副本。然后,bgsave 子进程会把这个副本数据写入RDB,而在这个过程中,主进程仍然可以直接修改原来的数据。

演示

​

bgsave会进行后台操作,不阻塞流程。 保存后会生成一个dump.rdb文件。因为二进制文件打开也是乱码,所以我们就不打开了。

​

优点

  • Redis宕机后数据恢复快

  • 二进制文件体积小

缺点

  • 持久化策略可能会导致在宕机时数据丢失量较多

AOF(append-only file)

​AOF持久化可以通过redis.conf文件中的appendonly参数控制是否开启。

  • appendonly no 默认情况下是no, 将no改为yes即可开启AOF持久化方式,Redis会将修改的每一条指令先记录到系统缓存,默认每隔一秒钟就把缓存刷新到appendonly.aof磁盘文件中 当 Redis 重新启动时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。

演示

小编直接修改redis.conf文件中的appendonly参数,然后重启redis,set了几个键值对,等了好几秒,发现当前目录下并没有生成appendonly.aof文件。

后来通过直接在redis-cli执行config set appendonly yes命令,当前目录下才生成appendonly.aof文件。

​接下来我们打开appendonly.aof文件就能看到我们之前写入的键值对。

*2 $6 SELECT $1 0 *3 $3 SET $1 1 $1 2 *3 $3 SET $4 key1 $4 val1 *3 $3 SET $4 3124 $3 124 *3 $3 SET $5 key14 $4 key2 复制代码

这是一种resp协议格式数据,星号后面的数字代表命令有多少个参数,$号后面的数字代表这个参数有几个字符。

AOF持久化策略

  • appendfsync always:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全,不建议用,本身Redis就是借助的内存快的优势,要是每次操作都访问磁盘这个优势就没了。

  • appendfsync everysec:每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据,AOF默认会走在这个配置。

  • appendfsync no:从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择,发生宕机时,丢失的数据最多。

AOF重写

假设我们执行了两个命令 set key1 1 与 set key1 2,在开启AOF持久化的情况下,这两个命令都会被记录到AOF文件中,但是我们在宕机后重启恢复数据的时候是不是就只需要执行set key1 2就可以了,之前的set key1 1在恢复数据的时候忽略掉也没有任何影响,并且因为AOF文件随着时间的推移,体积会越来越大,重写AOF就显得尤为重要。

手动触发后台重写,redis客户端执行命令:bgrewriteaof

Redis提供了两个配置参数控制AOF自动重写频率(redis.conf)。

  • auto‐aof‐rewrite‐min‐size 64mb //aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就 很快

  • auto‐aof‐rewrite‐percentage 100 //aof文件自上一次重写后文件大小增长了100%则再次触发重写

触发重写时 Redis 会通过fork主进程,生成一个子进程去做,这么做的原因是因为重写一般意味着要有大量的I/O操作,非常耗时,如果用主进程去重写会导致主进程长时间的阻塞,影响Redis执行客户端命令,甚至导致服务长时间不可用,但是子进程去重写就意味着主进程仍然可以接收、处理客户端指令,就会导致重写后的AOF文件和服务器当前的数据库状态不一致。

例如:子进程fork主进程时,内存中只有key1这个键,但是当开始重写后,客户端又多set了key2、key3,这就导致了重写的AOF文件和数据库不一致。

所以Redis在AOF重写时加了一个AOF重写缓冲区,当有新命令执行的时候,Redis会将命令发送到AOF缓冲区和AOF重写缓冲区。

​

执行完重写任务后,子进程会向主进程发送一个信号,主进程收到信号后会执行下面两个操作(以下两个操作会阻塞主进程):

  • 将 AOF 重写缓冲区中的所有内容写入到新的 AOF 文件中,保证新 AOF 文件保存的数据库状态和服务器当前状态一致。

  • 对新的 AOF 文件进行改名,原子的覆盖现有 AOF 文件,完成新旧文件的替换

虽然只有上面两个操作会阻塞Redis主进程,但是很显然它已经将重写对性能的影响降到了最低。但是如果你想再对其进行优化,这里有两个解决方案。

  1. 服务低峰期定时重写

  2. 使用ssd,提升持久化效率

注意:AOF在重写时,为了避免执行命令时造成的客户端缓冲区溢出,重写程序在处理列表、哈希表、集合、有序集合这四种可能会有多个元素的键时,会先检查键所包含的元素数量,如果元素的数量超过了redis.h/REDIS_AOF_REWRITe_ITeMS_PER_CMD常量的值(默认64个元素),那么重写程序将会使用多条命令来记录键的值,而不是单单只用一条命令。

优点

  • 数据完整性要高于RDB,默认情况下,最多丢失1秒钟的数据。

缺点

  • Redis宕机后数据恢复慢

  • 文件体积大

混合持久化(sence redis4.0)

Redis宕机恢复时,为了提高数据的完整程度,我们通常使用 AOF 日志进行恢复,但是使用 AOF 日志性能相对 RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。 Redis4.0 为了解决这个问题,推出了混合持久化,说白了,混合持久化就是结合了RDB与AOF两种持久化方式的优势。

启混合模式后,AOF在重写时会将AOF文件中的数据以RDB文件的二进制格式写入当前AOF文件中,之后的新的写操作继续以AOF文件的格式进行追加。当redis宕机重启的时候,加载 AOF 文件进行恢复数据:先加载 RDB 的部分再加载剩余的 AOF内容,因此重启效率大幅得到提升。

通过修改redis.conf文件中的以下配置开启混合持久化(必须先开启AOF持久化):

  • aof‐use‐rdb‐preamble yes

总结

  • RDB文件会保存Redis中所有的键值对数据

  • save生成RDB文件会阻塞主进程

  • bgsave命令后台生成RDB,不会阻塞主进程

  • RDB文件体积小,保存的是二进制数据

  • RDB通过配置策略执行,可能会丢失部分数据

  • RDB文件在Redis宕机后恢复快


  • AOF文件保存的是客户端执行的命令

  • AOF文件体积大,恢复慢,但是默认配置下数据比RDB要全很多

  • Redis宕机重启后默认是用AOF方式进行恢复

  • AOF文件中的命令是以Resp协议格式保存的

  • 命令会先保存到缓冲区,再定期同步到AOF文件

  • AOF会根据配置策略自动的对AOF文件进行重写,以降低文件体积

  • AOF重写时会fork一个子进程去执行,同时会有一个重写缓冲区,用来保存重写时主进程修改的键

  • AOF重写时,最后会生成一个新的AOF文件,覆盖原有的文件

  • 将重写缓冲区的内容写入到AOF与替换新旧AOF文件时会阻塞主进程


  • 混合持久化是RDB与AOF的优势结合所产生的

  • 混合持久化本质还是用的AOF文件

  • 混合持久化使用的前提是开启AOF持久化

  • 混合持久化在重写AOF文件时会将数据直接写成RDB的二进制格式,之后新的命令还是以AOF文件Resp协议格式进行保存

附

fsync

为了提高文件的写入效率,linux系统在做持久化时,会调用write函数,先将要写入文件的数据保存在一个内存缓冲区里就会直接返回,等到缓冲区被填满,或者超过了指定的时限(一般是30秒)后,才会将缓冲区的数据写入到磁盘。

这种做法虽然提高了写入效率,但是如果发生宕机,就有可能会导致缓冲区中还未写入磁盘的数据丢失。

为此,linux提供了fsync函数,它会强制并阻塞等待系统将数据写入到磁盘,从而保证数据的安全性

子进程

为什么Redis会fork一个子进程而不用子线程,是因为子进程可以携带主进程的数据副本,可以避免在不使用锁的情况下,保证数据安全。

注:子进程在重写期间,主进程还是会接收并处理客户端命令,会导致子进程与主进程数据不一致。

参考资料

Redis的设计与实现

【ComfyUI】Animate 保留原视频背景角色替换视频生成 本文介绍了智能创作与视频生成的工作流设计,强调其作为围绕业务目标、数据流转和模型能力的有机整体。工作流由数据输入、模型处理、结果合成和输出展示构成,通过节点化连接实现高效复用与扩展。文章重点解析了核心模型(如CLIP Vision、WanVideo等)的功能和协作方式,以及各类节点(输入、处理、控制、输出)的作用。最后展示了工作流在视频角色替换、虚拟试衣等场景的应用价值,并提供了相关开发资源链接。该设计通过模块化实现了灵活适配不同业务需求的能力。 阅读详情

相关推荐

基于PyTorch的BP神经网络PID控制器动态调参实战

本文详细介绍了基于PyTorch的BP神经网络PID控制器动态调参实战,结合BP神经网络的自适应能力和PID控制算法的经典优势,实现工业控制中的高效参数调整。通过PyTorch实现BP-PID融合架构,包括网络设计、损失函数优化及动态调参技巧,显著提升控制性能,适用于温度控制、电机控制等场景。

weixin_29094775的博客 523

redis运行中,使用Redis Config rewrite修改appendonly值

redis运行中,使用Redis Config rewrite修改appendonly值

yanglechen1的博客 771

一觉醒后ChatGPT 被淘汰了

近日,AI 界貌似出现了一种新的趋势:自主人工智能。这不是空穴来风,最近一个名为 AutoGPT 的研究开始走进大众视野。特斯拉前 AI 总监、刚刚回归 OpenAI 的 Andrej Karpathy 也为其大力宣传,并在推特赞扬:「AutoGPT 是 prompt 工程的下一个前沿。」

Rocky006的博客 13万+

持久化之RDB

1. 是什么 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里 Redis默认是开启的 2. 工作原理 Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB

qq_36517313的博客 1683

ENSP:小型企业网络拓扑设计

包含的技术:ospf、dhcp中继、ac+ap、vrrp+mstp、acl、浮动路由、静态路由、vlan划分

weixin_45921302的博客 1万+

毕设-YOLOv8-OBB 实现自有数据集缺陷旋转检测全过程记录

这次项目让我深入理解了 YOLOv8-OBB 的原理和使用流程。步骤内容工具数据标注制作倾斜缺陷样本格式转换从 HBB 转换为 OBB模型训练使用 Ultralytics YOLOv8 OBBCLI 命令模型测试推理与结果可视化通过 OBB 模型,我的缺陷检测系统获得了更高的精度和鲁棒性。未来我打算继续优化数据增强方式,比如引入随机旋转、仿射变换等,让模型更适应不同角度的样本。

FJN110的博客 447

你真的了解Redis的持久化机制吗?

经过小编的一番询问才知道,原来是他们生产Redis今天莫名其妙的挂了,而且因为是新项目,一会要给领导演示用,生产环境Redis就只部署了一个节点,这一挂不要紧,缓存进去的数据怎么办...恰巧这个时候,小编听见老板办公室里传出了一声大喊,“胖虎,来给我演示一下项目”,五分钟后,满脸通红的胖虎从老板办公室里出来了。这时小编突然想到,Redis不是有持久化机制吗? 在和胖虎的交谈中发现,他竟然不知道Redis的持久化机制,小编就默默地装了个13。Redis 的持久化机制有两种,一种是快照(RDB),另一种是 AO

m0_72533993的博客 338

基于STM32、HAL库的MICRF112YMM-TR 无线收发器驱动程序设计

内部集成了 VCO、PLL、PA、LNA、混频器、滤波器等射频功能单元,极大减少了外部元件数量,降低了设计和布线难度。: 具有多种工作模式(睡眠、待机、接收、发射),待机电流极低,非常适合电池供电的物联网(IoT)设备。是 Microchip 公司生产的一款高性能、低功耗的单片 UHF ASK/FSK 收发器芯片。: 支持 ASK (幅移键控) 和 FSK (频移键控) 调制,适应不同应用需求。// 可以添加其他配置参数,如中心频率、数据速率等。智能家居(安防、遥控、传感)远程钥匙进入系统 (RKE)

corlin6688的博客 418

Redis(4) ——数据持久化

Redis(3) ——数据持久化 为什么要持久化? 因为redis的是基于计算机内存存储的,在多数情况之下,服务关闭,电脑关机,断电等行为会导致数据的丢失,持久化就是把redis存到内存的数据提前写到物理硬盘当中,当内存数据丢失的时候呢,能够从硬盘当中恢复 Redis的两种持久化方式 redis自身提供了两种持久化方式,RDB,AOF RDB:原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化(类似于快照一样) AOF:持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不

dawei.tu的博客 431

Python经典编程习题100例:第25例:求各个阶乘的和

不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 本人初学Python,只为熟悉语法编写,大神请勿理会 点击下面链接 Python经典编程100例习题汇总 题目描述: 求1+2!+3!+…+20!的和。 解题思路: > 调用math模块中的factorial函数 代码: import math sum=0 for i in range(1,21): sum+=math.factorial(i) print(sum) ..

优快云 精品推荐 2736

YOLOv11的对比学习预训练改进-(通过SimCLR预训练增强特征提取)

本文介绍了将SimCLR对比学习预训练与YOLOv11目标检测模型相结合的创新方法。文章首先概述了目标检测领域的发展现状和YOLOv11的架构优化,包括主干网络、特征金字塔和检测头的改进设计。其次详细解析了SimCLR对比学习的核心原理,涵盖数据增强、投影头设计和NT-Xent损失函数。最后探讨了如何将对比学习与目标检测有效结合,通过特征空间对齐和渐进式微调策略提升模型性能。该方法显著增强了特征提取能力,提高了检测精度和训练效率,特别是在小目标和遮挡目标的检测上表现突出。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 687

Redis持久化机制详解

Redis是一款高性能的键值存储和缓存数据库,而持久化机制是Redis的重要特性之一。本文将深入探讨Redis的两种持久化方式:快照(RDB)和追加日志文件(AOF),并详细介绍它们的工作原理、优缺点以及配置和使用方法。持久化是指将数据从内存中保存到磁盘上,以实现数据的持久性。Redis提供了两种持久化机制:快照(RDB)和追加日志文件(AOF)。这两种机制的目的都是在Redis重启后能够恢复数据,并提供数据持久化的保证。

q58829的博客 883

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【Redis】持久化机制

Redis持久化

chaodddddd的博客 2584

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

你不知道的redis三-Redis的持久化机制

一、持久化 我们前两章已经讲了,redis是内存型的数据库,他之所以快是因为数据存储在内存。那么数据存储在内存会有什么问题呢?当然就是当服务重启或者服务器宕机内存数据就被清除,我们就无法访问之前存储的数据了。那么怎么解决这个问题呢?当然就是使用持久化技术 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化是将程序数据在持久状态和瞬时状态间转换的机制。比如JDBC就是一种持久化机制。文件IO也是一种持久化机制。 redis也是一个支持持久化的内存数

b379685397的博客 4万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Redis的持久化机制

Redis是一个基于内存的数据库,所有的数据都存放在内存中,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。 Redis的持久化机制有两种,第一种是RDB快照,第二种是AOF日志。RDB快照是一次全量备份,AOF是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本。 一、RDB机制: RDB快照就是把数据以快照的形式保存在磁盘上,是某个..

张维鹏的博客 1万+

【Redis】—— Redis的RDB持久化机制

💧RDB持久化是Redis提供的一种将数据从内存写入磁盘的方式。它通过将当前内存中的数据快照保存到磁盘上的二进制文件中来实现数据的持久性。这个快照包含了所有键值对的数据,可以在Redis服务器重启时使用。💧RDB持久化的主要优点是它可以非常高效地进行数据恢复。由于数据是以二进制格式保存的,重启时可以快速加载整个数据集,因此适用于大规模数据的持久化。

仰望天空,妳我亦是行人. 2314

Redis的持久化机制(必须知道)

Redis提供了RDB和AOF两种持久化机制。RDB通过定时快照保存数据,恢复快但可能丢失数据;AOF记录所有写命令,安全性高但文件较大。最佳实践是4.0+版本的混合持久化(RDB-AOF),结合了两者优点:快速恢复和数据安全。生产环境建议根据业务需求选择,核心数据推荐混合持久化+定时备份,同时监控fork耗时以确保稳定性。

GQ_666的博客 998

Redis的两种持久化机制

两种持久化方案既可以同时使用,又可以单独使用,在某种情况下也可以都不使用,具体使用那种持久化方案取决于用户的数据和应用决定。无论使用AOF还是快照机制持久化,将数据持久化到硬盘都是有必要的,除了持久化外,用户还应该对持久化的文件进行备份(最好备份在多个不同地方)。

weixin_74412978的博客 1623

【Redis】Redis持久化机制

Redis提供了两种主要的持久化机制:RDB持久化和AOF持久化。此外,还可以采用混合持久化(RDB + AOF)的方式,将这两种持久化方式结合在一起。下面我们简要概述这些持久化机制。RDB持久化、AOF持久化和混合持久化。RDB持久化通过定期生成数据快照实现持久化,具有快速恢复和更小的存储空间等优点,但可能存在数据丢失和子进程占用内存等缺点。AOF持久化通过记录所有写操作命令实现持久化,具有更高的数据安全性和更好的容错性等优点,但可能存在较大的存储空间和数据加载速度较慢等缺点。

DreamSun的博客 3114

Redis 持久化机制

Redis持久化机制详解:RDB、AOF与混合模式 Redis提供了三种持久化方式保障数据安全:RDB快照、AOF日志和混合持久化。RDB通过定时全量备份内存数据,适合备份场景,但可能丢失最新数据;AOF记录每条写命令,数据更完整但性能开销较大;混合模式(Redis 4.0+默认)结合了两者优势,在AOF文件中嵌入RDB快照,既保证恢复速度又保持数据完整性。实际应用中,小型系统可单独使用RDB,高可靠系统推荐AOF,多数场景建议开启混合模式。持久化机制可根据业务需求在redis.conf中灵活配置。

笑衬人心的博客 1159
上一篇: 五分钟看完知道什么是MySQL慢查询
下一篇: 用高并发技巧解决redis热key问题
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值