【redis】redis持久化

1、简介

两种持久化方式

(1)RDB(Redis DataBase):内存中数据直接写入文件中

(2)AOF(Append Of File):以追加的行为把内容写入文件中

2、RDB

(1)概念:

指定的时间间隔内讲内存中的数据集快照写入磁盘,它恢复时可以将快照文件直接读到内存里

(2)RDB持久化流程:

Redis会单独创建fork一个子进程来进行持久化,先将数据写入一个临时文件中,待持久化过程结束后,再用这个临时文件替换上次持久化的文件,RDB方式比AOF文件更加高效,缺点是最后一次持久化的数据可能丢失。

image.png

image.png

(3)Fork:

写时复制技术:新进程的所有数据(变量、环境变量、程序计数器等)数值都有原进程一致。

Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。

具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。

阻塞只发生在fork阶段,一般时间很短。

RDB依赖于主进程fork,在更大的数据集中,这可能会导致服务请求的瞬间延迟。

fork的时候,内存中的数据备克隆了一份,大致2倍的膨胀性,需要考虑。

(4)redis.conf配置内RDB相关配置(SNAPSHOTTING内配置)

rdb文件名:dbfilename dump.rdb

文件产生的路径,默认值(启动程序的位置):dir ./

image.png

image.png

快照的时间间隔:

复制代码
# save 3600 1
# save 300 100
# save 60 10000


image.png

image.png

image.png

3、AOF

(1)概念:

以日志形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数。

优点:备份机制更稳健,丢失数据概率更低,通过操作AOF文件可以处理误操作

缺点:比RDB占用更多磁盘,恢复备份速度慢,每次读写都同步的话有性能压力

(2)AOF持久化流程

客户端在请求写命令时会被append追加到AOF缓冲区内

AOF缓冲区根据AOF持久化策略always,everysec,no将操作sync同步到磁盘的AOF文件中

AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量

Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的

(2)AOF持久化流程

客户端在请求写命令时会被append追加到AOF缓冲区内

AOF缓冲区根据AOF持久化策略always,everysec,no将操作sync同步到磁盘的AOF文件中

AOF文件大小超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量

Redis服务重启时,会重新load加载AOF文件中的写操作达到数据恢复的目的

image.png

image.png

AOF文件rewrite重写

AOF(Append Only File)是 Redis 中一种持久化数据的方式。

当 Redis 将数据写入内存后,会将数据写入 AOF 文件中,以便在 Redis 重启时恢复数据。

AOF 文件包含了一系列 Redis 命令,这些命令记录了 Redis 服务器所执行的所有操作。

由于 AOF 文件会不断增长,所以 Redis 提供了 AOF 重写(rewrite)机制来优化 AOF 文件,减少文件大小。

AOF 重写是通过读取内存中的数据并将其写入新的 AOF 文件来实现的。

重写过程中,Redis 会将一些命令合并成一个命令,以减少 AOF 文件的大小。

AOF 重写的触发条件有两个:

  1. 手动触发:可以通过执行 BGREWRITEAOF 命令手动触发 AOF 重写。

  2. 自动触发:当 AOF 文件的大小超过了配置文件中指定的阈值时,Redis 会自动触发 AOF 重写。

AOF 重写的过程如下:

  1. Redis 在后台创建一个子进程。

  2. 子进程开始遍历 Redis 的所有键值对,并将其转换为一系列命令。

  3. 子进程将这些命令写入新的 AOF 文件中。

  4. 子进程完成后,将新的 AOF 文件重命名为原来的 AOF 文件,覆盖原来的 AOF 文件。

  5. Redis 继续将新的命令写入新的 AOF 文件中。

需要注意的是,AOF 重写是一个耗时的操作,可能会占用大量的 CPU 和内存资源。

为了避免影响 Redis 的性能,可以通过配置 AOF 重写的触发条件和间隔时间来控制 AOF 重写的频率。

总之,AOF 重写是 Redis 中一种优化 AOF 文件的机制,可以减少 AOF 文件的大小,提高 Redis 的性能和稳定性。

(3) redis.conf关于AOF相关配置:

开启AOF默认:,默认不开启no,开启需要修改为yes

复制代码
appendonly no


image.png

AOF生成文件名:默认为appendonly.aof,生成的路径同RDB

复制代码
appendfilename "appendonly.aof"


image.png

保存文件生成,同时开启AOF与RDB时,系统会使用AOF保存数据:


image.png

当AOF文件损坏,可通过如下命令执行文件修复:

复制代码
redis-check-aof --fix   appendonly.aof


image.png

AOF同步频率设置

设置始终同步:appendfsync always,性能较差,但是数据完整性好

每秒同步:appendfsync everysec

把同步时机交给操作系统:appendfsync no

复制代码
# appendfsync always
appendfsync everysec
# appendfsync no


image.png

image.png

rewrite压缩

当AOF文件大小超过所设定的阈值时(>=64M*2),Redis会启动AOF的内容压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof开启此功能。

使用fork子进程将原来文件重写,把rdb的快照已二进制形式附在新的aof头部,作为已有的历史数据据,替换原有的流水账操作。

复制代码
no-appendfsync-on-rewrite no


image.png

image.png

参考

Redis持久化:RDB和AOF
https://mp.weixin.qq.com/s/IaJrBwUuJt_DFjIynIzF5g

Redis 持久化方式介绍 RDB+AOF,混合持久化
https://mp.weixin.qq.com/s/oKXR5-iLJcEqBYj8P36LyA

redis6.x使用指导完整版
https://www.cnblogs.com/mrwhite2020/p/14727548.html
最后编辑于:2025-02-24 20:47:10
© 著作权归作者所有,转载或内容合作请联系作者

喜欢的朋友记得点赞、收藏、关注哦!!!

相关推荐
_Evan_Yao7 分钟前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd33 分钟前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼34 分钟前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122661 小时前
TCP 1
java·1024程序员节
程序员塔塔喵3 小时前
【MySQL篇|第一篇】索引失效的情况
数据库·mysql·索引失效
paopaokaka_luck3 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
金銀銅鐵4 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手4 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
再__努力1点5 小时前
RK3576/RV1126B多路视频 AI 开源引擎 CosmoEdge:从模型到交付,轻松搞定!
人工智能·opencv·计算机视觉·架构·课程设计
paopaokaka_luck6 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节