一、为什么需要持久化
Redis是内存数据库,数据默认只存在内存中。一旦进程崩溃或机器宕机,内存数据全部丢失。持久化的作用就是把内存数据存储到磁盘中,让Redis在故障重启后能从磁盘恢复数据
Redis提供的两种持久化方案:
RDB :数据快照
AOF:命令日志
二、RDB持久化
RDB全称Redis Database Backup file,也叫Redis数据快照。就是把内存中的所有数据记录到磁盘中,生成一个二进制文件(默认dump.rdb,保存在当前运行目录)。当Redis实例故障重启后,从磁盘读取快照文件恢复数据。
2.1 执行时机
RDB持久化在四种情况下会执行
- 执行save命令
save 会让主进程同步执行 RDB,这个过程中其它所有命令都会被阻塞。因为阻塞严重,生产环境基本不用,只在数据迁移等特殊场景可能用到。
执行下面的命令,可以立即执行一次RDB:

可以看到,save 命令返回 OK,说明快照执行成功。
执行完成后,RDB 快照文件会保存到 Redis 配置的 dir 目录下(默认是启动时的工作目录),文件名由 dbfilename 指定(默认 dump.rdb)

- 执行bgsave命令
bgsave会fork一个子进程异步完成RDB,主进程继续处理用户请求,不收影响。这是最重用的手动触发方式。

- Redis停机时
Redis停机时会执行一次save命令。实现RDB持久化。 - 触发RDB条件时
Redis内部有自动触发机制,配置在redis.conf中:
properyies
# 900秒内,如果至少有1个key被修改,则执行bgsave
# 如果是 save "" 则表示禁用RDB
save 900 1
save 300 10
save 60 10000
以 save 60 10000 为例:60 秒内至少有 10000 个 key 被修改,就自动执行 bgsave。
其他相关配置:
properties
# 是否压缩,建议不开启,压缩会消耗CPU,磁盘不值钱
rdbcompression yes
# RDB文件名称
dbfilename dump.rdb
# 文件保存的路径目录
dir ./
2.2 RDB原理
bgsave开始时,会fork主进程得到一个子进程,子进程共享主进程的内存数据。完成fork后,子进程读取内存数据并写入RDB文件。
fork采用的是copy-on-write(写时复制)技术:
- fork后,父子进程的页表各自独立,但都指向同一批物理内存也,这些页被标记为只读;
- 当主进程读某页时,直接访问共享内存;
- 当主进程写某页时,触发写保存缺页异常,内核复制该物理页并让主进程指向新页,然后完成写操作;
- 未被写的页继续共享

三、AOF持久化
AOF全场 Append Only file(追加文件)。Redis处理的每一个写命令都会记录在aof文件中,可以看做是命令日志文件。恢复时逐条重放命令来重建数据。
3.1 AOF配置
AOF 默认关闭,需要修改 redis.conf 开启:
properties
#是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
AOF的命令记录的频率也可以通过redis.conf文件来配:
properties
#表示每执行一次写命令,立即记录到AOF文件
appendfsync always
#写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
三种策略对比:

3.2 AOF文件重写
因为记录的是命令,AOF文件会比RDB文件大得多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。
如 AOF 原本有三条命令:
xml
set num 123
set num 666
set name jack
前两条都是对 num 的操作,第二次覆盖第一次,第一条没有意义。执行重写后,AOF 内容可以简化为:
xml
mset name jack num 666
通过执行 bgrewriteaof命令,可以让AOF文件执行重写功能,用最少得命令达到相同效果。重写也是fork子进程完成,不会阻塞主进程。
Redis 也会在触发阈值时自动重写 AOF,阈值可在 redis.conf 配置:
xml
#AOF文件比上次增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
#AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
四、RDB与AOF对比

redis-6.2.4版本,需要的请下载:
链接: https://pan.baidu.com/s/1_eOjFsPYWxlGILFF3cH8HA?pwd=8888