Redis持久化:RDB与AOF

目录

[一、RDB(Redis DataBase)持久化机制](#一、RDB(Redis DataBase)持久化机制)

1.1、RDB持久化(定期备份):

1.2、触发机制

1、手动触发:

2、自动触发:

1.3、bgsave执行流程

1.4、RDB文件处理

1.5、RDB优缺点

[二、AOF(Append Only File)持久化](#二、AOF(Append Only File)持久化)

2.1、工作原理:

[2.2 、开启AOF配置:](#2.2 、开启AOF配置:)

2.3、工作流程如下:

2.4、缓冲区文件同步策略对比

2.5、重写机制

1、重写的原因:

2、触发条件:

3、重写流程:

2.6、数据恢复

三、RDB与AOF对比


一、RDB(Redis DataBase)持久化机制

1.1、RDB持久化(定期备份):

通过生成数据快照的方式,将当前进程中的数据保存到硬盘中,当Redis重启时,可以通过加载RDB文件来恢复数据

1.2、触发机制
1、手动触发:

save:执行save的时候,Redis会进行"快照生成"操作,此时就会阻塞Redis的其他客户端命令(不适合生产环境使用)

bssave:不会影响Redis服务器处理其他客户端的请求和命令 ,此处使用的是多进程来完成的并发编程,实现bgsave(通过fork子进程执行持久化,主进程继续响应命令)

2、自动触发:

配置文件规则触发:配置save m n ,表示m秒内发生n次修改时触发

主从复制:从节点进行全量复制时,主节点自动进行RDB持久化,随后将RDB文件内容发给从节点

关闭Redis:执行shutdown命令时会触发RDB

1.3、bgsave执行流程

(1)执行bgsave,父进程判断当前是否存在其他子进程,如果存在bgsave命令直接返回

(2)父进程执行fork创建子进程,fork过程中父进程会阻塞

(3)父进程fork完成之后,bgsave不在阻塞父进程,继续响应其他命令

(4)子进程创建RDB文件,使用原子操作替换旧RDB文件

(5)进程发送消息给父进程表示完成

1.4、RDB文件处理

文件位置和命名

java 复制代码
# 配置文件示例
dir /var/lib/redis/      # 保存目录
dbfilename dump.rdb      # 文件名

# 运行时动态修改
CONFIG SET dir /new/path
CONFIG SET dbfilename newdump.rdb

压缩:默认使用LZF算法压缩(默认开启),

java 复制代码
#可以动态修改
config set rdbcompression {yes|no}

虽然压缩RDB会消耗CPU,但可以大幅降低文件体积,方便保存在硬盘或者通过网络发送到从节点。

校验:Redis启动时加载到损坏文件会拒绝启动,可以通过redis-check-dump工具检测RDB文件并获取对应错误报告

1.5、RDB优缺点

优点:

RDB是紧凑的二进制文件,适合备份和传输;

恢复数据块

适合灾难恢复场景

缺点:

无法做到实时/秒级持久化(bgsave每次运行都要执行fork创建子进程)

版本兼容问题

二、AOF(Append Only File)持久化

2.1、工作原理:

AOF通过记录所写操作命令来持久化数据,重启时重新执行这些命令恢复数据

2.2 、开启AOF配置:
复制代码
# redis.conf配置
appendonly yes                    # 开启AOF
appendfilename "appendonly.aof"   # AOF文件名
appendfsync everysec              # 同步策略
dir /var/lib/redis/               # 保存目录
2.3、工作流程如下:

命令写入:所有写命令追加到aof_buf缓冲区(内容直接是文本协议格式,实现简答具备可读性)

文件同步:根据策略将缓冲区内容同步到硬盘

文件重写:定期压缩AOF文件

重启加载:启动时重新执行AOF文件中的命令

2.4、缓冲区文件同步策略对比

|----------|------------|---------|------------|
| 策略 | 说明 | 优点 | 缺点 |
| always | 每次写入后立即同步 | 数据最安全 | 性能差(几百TPS) |
| everysec | 每秒同步一次(默认) | 兼顾性能和安全 | 可能丢失1秒数据 |
| no | 由操作系统决定 | 性能最好 | 数据安全性低 |

总的来说,频率越高,数据可靠性最高,性能最差

2.5、重写机制
1、重写的原因:

删除无效命令(如已经过期的数据);合并多条命令为一条;减小文件体积、提高恢复速度

2、触发条件:

手动触发:调用bgrewriteaof命令

自动触发:

复制代码
# 配置文件参数
auto-aof-rewrite-percentage 100   # 当前AOF文件比上次重写后大小增长100%时触发
auto-aof-rewrite-min-size 64mb    # AOF文件最小达到64MB
3、重写流程:

父进程执行fork创建子进程(父进程任然负责接受请求,子进程负责针对AOF文件进行重写,在创建子进程的一瞬间,子进程继承父进程的内存状态)

子进程基于当前内存数据生成新AOF文件(重写的时候不关心AOF文件中原来有什么,只关心内存中最终数据状态),同时父进程不停接受新的请求,将新请求产生的数据先写入缓冲区在刷新到原有AOF文件中

父进程将重写期间的写命令存入重写缓冲区,子进程完成后,父进程追加缓冲区内容到新文件

原子替换旧AOF文件

2.6、数据恢复

当Redis启动时,会根据RDB和AOF文件的内容,进行数据恢复

三、RDB与AOF对比

特性 RDB AOF
数据安全 可能丢失较多数据 最多丢失1秒数据
恢复速度 慢(需要重放命令)
文件大小 小(压缩) 大(可重写压缩)
对性能影响 fork时可能阻塞 写AOF文件影响IO
适用场景 灾难恢复、全量备份 实时持久化、主从复制

混合持久化:Redis4.0引入混合持久化,结合RDB和AOF优点:

复制代码
# AOF文件结构
[ RDB二进制数据 ] + [ AOF增量命令 ]
相关推荐
Mr1ght1 小时前
高并发场景下 JSQLParser 性能瓶颈及替代方案实践
java·数据库·sql
CV_J8 小时前
安装kibana
java·elasticsearch·spring cloud·docker·容器
码农水水10 小时前
国家电网Java面试被问:TCP的BBR拥塞控制算法原理
java·开发语言·网络·分布式·面试·wpf
木风小助理11 小时前
PostgreSQL基础知识——DDL深度解析
数据库·postgresql
hanqunfeng11 小时前
(四十四)Redis8 新增的数据类型 -- Vector Set
数据库·redis·缓存
qq_3363139311 小时前
java基础-网络编程-TCP
java·网络·tcp/ip
咕噜咕噜啦啦11 小时前
Java期末习题速通
java·开发语言
盐真卿11 小时前
python2
java·前端·javascript
梦梦代码精12 小时前
BuildingAI vs Dify vs 扣子:三大开源智能体平台架构风格对比
开发语言·前端·数据库·后端·架构·开源·推荐算法