redis - 持久化机制
redis 持久化机制
内存 同步到 磁盘。
-
RDB: 根据指定的规则,定时 将 内存中的 数据 存储到 磁盘上
-
AOF: 每次执行命令后,将 命令本身 记录下来
RDB (快照)
RDB 的持久化方式 通过 快照完成,是redis 默认的持久化方式。
配置:
save <seconds> <changes> #
save 300 100
save 60 1000
在 时间范围内,被更改的键的个数 大于 changes时, 触发 快照生成, 自动将内存中的数据生成一份副本 存储在 磁盘中。
生成快照的方式汇总:
- 1、根据 配置规则进行自动快照
- 2、用户执行 save 或 gbsave 命令
- 3、执行 flushall 命令
- 4、执行复制 时
根据配置规则 进行自动快照
-
修改 redis.conf 文件
-
修改文件存储路径
-
dir /data/program/redis
-
-
其他相关配置
-
dbfilename: 文件名称
rdbcompression: 开启压缩节省存储空间, 单会消耗 cpu。 默认开启
rdbchecksum: 使用CRC64 算法继续宁数据校验, 但会 增加 心性能消耗。
-
-
如果要关闭 RDB的持久化机制,配置如下
-
save ""
save 900 1
-
用户执行 save 或 bgsave命令
1、save命令
执行 save
命令时,会阻塞 所有来自客户端 的请求。 不建议是使用
2、bgsave 命令
后台异步 进行快照操作, 同时 服务还可以继续进行 客户端请求的响应。
在 redis-cli 终端,通过命令可以获取 最近一次成功 执行快照的时间 LASTSAVE
执行原理:
- redis 使用 fork 函数 复制 当前 进程的 副本(子进程)
- 父进程 继续接受 并处理i客户端的请求, 子进程 开始将内存中的数据 写入 磁盘的临时文件中
- 当子进程 写入玩 所有数据 后, 用临时文件 替换 旧的 RDB文件
注意 :
redis 在 进行快照的过程中 不会 修改 RDB文件;
RDB文件是经过压缩的 二进制文件,占用的空间 会 小于 内存中的数据,有利于传输。
bgsave是异步执行快照,写入的数据 就是 fork进程时 redis的数据状态 , 一旦完成fork,后续的新的客户按命令对数据产生的变更 都不会反映到 本次 快照。
执行 flushall 命令
清空 redis 在内存中的所有数据。 只要 redis中配置了 RDB 快照规则,redis就会 执行一次快照操作。
执行复制时
主从模式下,redis在 复制初始化的时候 自动 快照(不管是否配置了 快照规则)。
RDB文件的优劣势
优势
- 1 、RDB 是一个非常紧凑的文件,他保存了 redis在 某个时间点上的数据集,这种 文件非常适合 用于 进行备份和灾难 恢复
- 2、生成 RDB文件时,redis 主进程会 fork 一个子进程 进行快照的操作,主进程不需要进行任何 磁盘IO
- 3、RDB在恢复 大数据集的速度 比 AOF 的恢复速度要快
劣势
- 1、RDB 方式数据 无法做到 实时持久化/秒级持久化。
- 2、一定时间间隔做一次备份,所有会存在一段时间(最后一次备份后)的数据丢失
AOF模式
redis 默认不开启。 AOF采用日志的形式来记录 每个 写操作【??】,并 追加 到 文件中。
相关配置:
appendonly no/yes
appendfilename "appendonly.aof"
持久化到磁盘
基于操作系统的缓存机制, 写数据 是 进入到系统的 硬盘缓存。默认是基于操作系统,每 30秒 执行一次同步操作,将硬盘缓存内容真正写入到 硬盘。
redis.conf 中可以 配置 同步机制, 写入AOF文件后 主动要求系统将数据 同步到硬盘中。
AOF 持久化策略
appendfsync everysec 默认, 每秒执行 一次, 会丢失1s 的数据
其他策略:
no:不执行 fsync,由操作系统同步
always 表示每次 写入都执行 fsync, 效率低
rewrite
重写机制。 当 AOF文件的大小超过 设置的阈值时,Redis 会启动 AOF文件的内容压缩,指标六可以恢复数据的最小 指令集
bgrewriteaof 主动 触发 重写
AOF文件的重写 并表示对原文件 进行重新整理,而是直接 读取 服务器中现有的 键值对, 然后用 一条命令 代替 记录这个键值对的多条命令,生成一个 新的文件去 替换原来 AOF文件。 (当前的 内存间的键值对省生成 一条指令记录到AOF文件中)
重写触发机制
auto-aof-rewrite-percentage 默认100。 表示 当前的AO文件大小超过 上一次重写的AOF文件大小的百分之多少时 触发重写。
auto-aof-rewrite-min-size 默认64M。 限制了允许 重写的最小AOF文件大小。
重写流程:
- 主进程会 fork 一个子进程 进行 AOF 重写,这个重写过程 类似于 快照的方式,全量遍历 内存中的数据,然后 逐个写入到aof文件中
- 在 fork 子进程过程中,服务端仍然对外提供服务。再次过程中, 主进程的数据 更新操作, 会 缓存到 aof_rewrite_buf 中, 当子进程重写 完成后, 会把 缓存中的 数据 追加到 aof 文件中
- 当所有的数全部追加到新的 aof文件后, 把新的aof 文件重命名 正式的 文件名,此后所有的操作都 直接写入到 新的 aof 文件
- 如果在 rewrite过程中出现故障,不会影响原来的aof文件的正常工作。只有rewrite 完成后,才会进行 文件的切换
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!