Redis持久化的三种方式(RDB、AOF和混合)
目录
- Redis持久化的三种方式(RDB、AOF和混合)
- 介绍
- RDB示例
- 1.配置文件
- 2.触发 RDB 快照保存
- 3.验证
- AOF示例
- 1.配置文件
- 2.校验
- 混合型持久化存储
- 配置文件
介绍
Redis数据主要存储与内存中,因此如果服务器意外重启、宕机、崩溃,那么数据就会全部丢失。而Redis持久化的意义就是为了当发生这些灾难时找回数据。
Redis 提供了两种主要的持久化方式:RDB(Redis Database)和 AOF(Append Only File)
- RDB(Redis Database):
- RDB 持久化通过创建一个名为
dump.rdb
的二进制文件来保存 Redis 数据库在某个时间点的快照。在 Redis 重启时,会加载这个文件来恢复数据。
- RDB 持久化通过创建一个名为
- AOF(Append Only File):
- AOF 持久化通过记录服务器接收到的每一个写操作命令(如 set、del 等),以追加的方式写入到一个 AOF 文件中。Redis 重启时会通过重新执行 AOF 文件中的命令来恢复数据。
RDB示例
1.配置文件
在redis.conf
中修改rdb备份文件的名称,默认为dump.rdb
dbfilename dump.rdb
save
修改触发快照条件
save 900 1 # 900 秒内至少有 1 个键被改变
save 300 10 # 300 秒内至少有 10 个键被改变
save 60 10000 # 60 秒内至少有 10000 个键被改变
dir
设置 RDB 文件的存储目录,默认为 Redis 服务器的当前工作目录
dir /data
示例:
dbfilename dump.rdb
save 900 1
dir /data
2.触发 RDB 快照保存
如果没有save
触发条件,也可以自己手动触发快照保存
linux环境:
redis-cli SAVE
python环境:
import redis
# 连接到Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)
r.bgsave() # 触发RDB快照的保存
3.验证
这里我们设置了自动保存快照,并添加两个数据
然后重启服务器,再次查询keys *
,数据还在
- RDB优势:
- 二进制存储,速度极快,磁盘空间占用小
- 在生成RDB快照时,Redis会fork出一个子进程来负责写入磁盘工作,对性能的影响小
- RDB劣势:
- 实时性低,需要等待save
- 有数据丢失风险,如果在save存储间隔期间宕机则无法存储到那期间的数据
- 数据过大时,fork过程会克隆一份数据,相当于内存中突然出现了两倍的数据,可能会影响性能
AOF示例
AOF 日志存储的是 Redis 服务器的顺序指令序列,AOF 日志只记录对内存进行修改的指令记录
1.配置文件
-
appendonly:是否开启AOF
-
appendfilename:AOF文件名。默认值为
appendonly.aof
-
appendfsync:AOF持久化策略的配置。有三个选项:
-
no
:不执行fsync,由操作系统保证数据同步到磁盘,速度最快,但不太安全。 -
always
:每次写入都执行fsync,以保证数据同步到磁盘,效率很低。 -
everysec
:每秒执行一次fsync,这是默认选项,兼顾了安全性和效率。但可能会导致最多丢失1秒的数据。
-
示例:
# 开启AOF持久化功能
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
# 配置AOF持久化的fsync策略
# 使用everysec可以实现性能和数据安全性的平衡,每秒fsync一次
appendfsync everysec
# AOF文件自动重写的触发条件
# 设置为100,表示当AOF文件大小是上一次重写后的AOF文件大小的100%时,触发重写
auto-aof-rewrite-percentage 100
# 设置触发AOF重写的最小文件大小
# 避免AOF文件很小的时候触发重写,减少不必要的重写操作
auto-aof-rewrite-min-size 64mb
# 配置在启动加载AOF文件时对不完整文件的处理
# 设置为yes,允许加载不完整的AOF文件,提高数据恢复的灵活性
aof-load-truncated yes
# 启用增量式fsync,减少磁盘I/O操作
aof-rewrite-incremental-fsync yes
# 在AOF重写期间,使用备用的子进程进行写操作,减少对主进程的影响
# 注意: 在Redis 4.0及以上版本中,这通常是默认行为
# aof-rewrite-use-rdb-preamble yes # 根据Redis版本和具体需求选择是否启用混合持久化
# 配置文件的目录,AOF文件会存储在这个目录下
dir /data
# 其他可能的配置项,根据实际需求进行配置
# 例如,关于AOF重写期间是否禁止appendfsync
# no-appendfsync-on-rewrite no
2.校验
随便搞点数据进去(set k '123'
),然后打开appendonly.aof
混合型持久化存储
混合持久化在AOF重写时,将压缩的RDB数据置于AOF文件首,后续追加AOF命令,以结合两者优势加速恢复并减少数据丢失风险
它继承了RDB和AOF优点:
- 快速恢复(RDB)
- 数据完整(AOF)
配置文件
首先启用 AOF 持久化,并设置 aof-use-rdb-preamble
为 yes
(Redis 5.0 及以上版本中默认启用)
appendonly yes
aof-use-rdb-preamble yes
当 AOF 文件增长到一定大小时,Redis 会自动触发 AOF 重写过程。在重写过程中,Redis 会首先创建一个新的 AOF 文件,并将当前的内存快照(RDB 格式)以二进制压缩形式写入到这个新文件的开头
手动触发AOF重写
redis-cli BGREWRITEAOF