1.基本概述
办到持久化其实就是Redis将数据写入磁盘内。
主要有四种:
- RDB (Redis Database):RDB持久化以指定的时间间隔执行数据集的时间点快照。
- AOF(Append Only File):AOF持久性记录服务器接收到的每个写操作。然后,这些操作可以在服务器启动时再次重播,重建原始数据集。命令使用与Redis协议本身相同的格式进行记录。
- RDB+ AOF:混合使用AOF和RDB。
- 禁用持久性:禁用持久性。这有时在缓存时使用。
大致如下:

2.RDB
RDB (Redis Database):RDB持久化以指定的时间间隔执行数据集的时间点快照。
类似vm虚拟机拍摄的快照(snapshots)。将快照文件就称为RDB文件(dump.rdb),存储进磁盘。恢复时再将硬盘快照文件直接读回到内存里。
默认情况
redis6.0.16以下
目录结构如下:

编辑配置文件
vim redis.conf
其对RDB配置如下:

在Redis.conf配置文件中的SNAPSHOTTING下配置save参数。
“save m n” :表示m秒内数据集存在n次修改时, 自动触发bg
- save 900 1:每隔900s,超过1个key变化,就生成RDB文件。
- save 300 10: 每隔 300s,超过 10个key 变化,就生成RDB文件。
- save 60 10000:每隔60s,超过10000个key变化,就生成RDB文件。
redis6.2以上
目录结构如下:

编辑配置文件
vim redis.conf
其对RDB配置如下:

默认情况下Redis将保存DB情况如下:
- 如果至少执行了一次更改,则在3600秒(一小时)后保存;
- 如果至少执行了100次更改,则在300秒(5分钟)后保存;
- 如果至少执行了10000次更改,则在60秒后保存
使用方法
自动触发
格式:
save <seconds> <changes> [<seconds> <changes> ...]
编辑配置文件
vim redis.conf
10秒改动两次触发

默认dump文件保存路径

修改如下,注意目录应事先存在,否则会报找不到该目录错误:

默认dump文件保存名字

考虑到多台实例,建议后加端口号命名

bgsave命令执行失败了,是否要停止写入。如果配置成no,在快照写入失败时,也能确保redis继续接受新的写请求,默认为yes最好。

对于存储到磁盘中的快照,是否进行压缩存储。采用LZF算法进行压缩。默认开启

redis使用CRC64算法来进行数据校验,但会增加大约10%的性能消耗。默认开启

在没有持久性的情况下删除复制中使用的RDB文件启用。默认禁用。

改完后,重启,redis-server后接的是我的配置文件所在,默认redis目录下的redis.conf
redis-server /myredis/redis7.conf
登入
redis-cli -a 123456 -p 6379
10秒内设置以下键值

切换到dump文件保存路径
cd /myredis/dumpfiles/

redis每次启动时,会自动读取dump文件保存路径下的dump文件保存名字,如这里就是读取dump6379.rdb。
所以当你需要对其备份是将该文件复制一份到其他地方即可,以防被覆盖。
手动触发
每当Redis需要将数据集转储到磁盘时,会发生以下情况:
- 就有了一个子进程和一个父进程。
- 子进程开始将数据集写入临时RDB文件。
- 当子进程写完新的RDB文件后,它会替换旧的RDB文件。
手动触发可以使用SAVE或BGSAVE命令。
save

save执行会阻塞当前redis服务器,直到持久化工作完成,所以一般使用bgsave.
使用bgsave命令,Redis会在后台异步进行快照操作,不阻塞快照同时还可以响应客户端请求,该触发方式会fork一个子进程由子进程复制持久化过程。
bgsave

查看上一次成功执行快照的时间,返回一个时间戳
lastsave

在linux使用date命令@后接时间戳,可以查看具体时间
date -d @1700637292

触发条件
- 配置文件中默认的快照配置
- 执行save/bgsave命令
- 执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义
- 执行shutdown且没有设置开启AOF持久化
- 主从复制时,主节点自动触发
修复dump文件
如果正在备份时,突然非正常退出,那么可能会导致dump文件破损
修复命令,后接的是dump文件地址

redis-check-rdb /myredis/dumpfiles/dump6379.rdb

禁用RDB
修改在配置文件redis.conf,用一个空字符串参数完全禁用,
将注释删掉即可

优缺点
- 定时备份
- RDB 文件在内存中的加载速度要比 AOF 快得多
- 依赖主进程的fork,可能会导致服务请求的瞬间延迟。
- 非正常关闭,可能会丢失。
3.AOF
基本概述
AOF(Append Only File):AOF持久性记录服务器接收到的每个写操作。然后,这些操作可以在服务器启动时再次重播,重建原始数据集。命令使用与Redis协议本身相同的格式进行记录。
AOF会以日志的形式来记录每一次写操作。当然读操作不记录。而redis启动时,会根据这些文件重新执行来恢复数据。
AOF保存的文件是appendonly.aof文件
工作流程如下:

- AOF缓冲区在内存中,达到一定量以后再写入磁盘,避免频繁的磁盘IO操作。
- AOF内容的增多会导致文件膨胀,AOF重写起到AOF文件压缩的目的。
写回策略:
- Always:同步写回,立刻同步将日志写入磁盘。但对性能影响较大。
- everysec :每秒写回,每个写命令执行完,先把日志写到AOF文件的内存缓冲区,每隔1秒把缓冲区中的内容写入磁盘。可能丢失一秒数据。
- no :操作系统控制的写回,每个写命令执行完,先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。可能丢失较多数据。
在配置文件如redis.conf中配置

配置方法
AOF配置开启,在配置文件如redis.conf中配置
默认是no即关闭AOF

写回策略。默认每秒写回

redis7默认保存路径配置,如下配置:
- redis6中:RDB会保存为/myredis/dirfiles/dump.rdb,AOF保存为/myredis/dirfiles/appendonly.aof
- redis7中:RDB会保存为/myredis/dirfiles/dump.rdb,AOF保存为/myredis/dirfiles/appendonlydir/appendonly.aof


AOF保存文件命名:
redis6中:直接叫appendfilename中配置的值默认appendonly.aof
redis7中采用Multi Part AOF(多部分)实现:
- base(基本):表示基础AOF,它一般由子进程通过重写产生,该文件最多只有一个。
- incr(增量):表示增量AOF,它一般会在AOFRW开始执行时被创建,该文件可能存在多个。(写操作一般记录在incr)
- manifest (清单):跟踪、管理这些AOF。
如下图所示:


写操作命令一般记录在incr增量文件,大致结构如下:
vim appendonly.aof.1.incr.aof

此外还有HISTORY文件表示历史AOF,每次AOFRW成功完成时,本次AOFRW之前对应的BASE和INCR AOF都将变为HISTORY, HISTORY类型的AOF会被Redis自动删除。
以上所有文件会保存到

大致如下:

redis启动会重新加载AOF文件,将写操作命令重新执行,以达到持久化。
如果误执行了清空操作,要恢复时,只要将appendonly.aof.1.incr.aof中错误执行的命令删除即可。

AOF重写期间是否同步

重写机制
写命令不断记录,当AOF文件的大小超过所设定的峰值时, Redis就会自动启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。
比如:
set k1 v1 set k1 v2 set k1 v3
本来最后一条指令就会覆盖前面,所以就只会保存最后一条指令。
自动触发
在配置文件如redis.conf中配置

默认配置是上次重写后的aof大小,增长了100%,且要大于64M才会自动触发。
我们把改成1k,同时将混合使用RDB和AOF的配置关闭,避免干扰


当文件小于1k时,如图存在许多重复命令
appendonly.aof.1.incr.aof

当文件大于1k时,来看效果:

注意看数据从incr文件迁移到base文件,同时incr文件和base文件序号加一。

可以看到重复命令也没了。
vim appendonly.aof.2.base.aof

手动触发
如果不满足配置文件的条件

也可以手动触发,执行以下命令
bgrewriteaof

修复文件
如果正在备份时,突然非正常退出,那么可能会导致AOF文件破损

修复命令,后接的是AOF文件地址
redis-check-aof --fix /myredis/dirfiles/appendonlydir/appendonly.aof.1.incr.aof

优缺点
- 更好保证数据不丢失,配置everysec最差保证只丢失一秒数据
- RDB效率会高于AOF
- 相同数据,AOF文件体积会大于RDB文件
4.混合使用RDB和AOF
默认开启混合

如果混合使用RDB和AOF配置关闭。
AOF是默认关闭的。如果开启,AOF优先级高于RDB.
注意:
在同时开启RDB和AOF持久化时,重启时只会加载AOF文件,不会加载RDB文件。如果没有开启AOF就使用RDB文件。
所以一般RDB文件用于备份数据库。
如果混合使用RDB和AOF配置开启
先使用RDB存储一个快照文件,然后使用AOF文件记录所有的写操作,当重写策略满足或手动触发重写的时候,再记录一次新的RDB记录。而重启redis服务时,会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。
混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式。
AOF包括了RDB头部+AOF混写

5.纯缓存模式
要达到最高性能,就采用纯缓存模式。使用纯缓存模式只要关闭RDB和AOF即可。
修改在配置文件redis.conf,用一个空字符串参数完全禁用,
将注释删掉即可

在配置文件如redis.conf中配置no即关闭AOF

注意:
AOF和RDB关闭后,save命令和bgsave命令以及bgrewriteaof依旧可以使用,即只是关闭了自动触发。


