一.Redis的持久化机制
Redis 是基于内存型的 NoSQL,和 MySQL 是不同的,使用内存存储进行数据缓存。
如果想要实现数据的持久化,Redis 也可支持将内存数据保存到硬盘文件中。
Redis 支持两种数据持久化保存方法:
- RDB: Redis DataBase
- AOF: Append Only File
以MySQL 做类比RDB类似MySQL dump,AOF类似 MySQL binlog。

二.RDB
RDB(Redis DataBase):是基于某个时间点的快照,注意 RDB 只保留当前最新版本的一个快照。
相当于 MySQL 中的完全备份。
RDB 持久化功能生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成该 RDB 文件时数据存储的状态。因为 RDB 文件是保存在磁盘中的,所以即使 Redis 服务器进程甚至服务器崩机,只要配置 RDB 文件存在,就能将数据恢复。
RDB 支持
save
和bgsave
两种命令实现数据文件的持久化。
- SAVE命令用于执行同步保存操作,它会将当前Redis实例的所有数据快照以RDB文件的形式保存到硬盘上。这个命令会阻塞所有其他客户端,直到保存操作完成,因此在生产环境中不推荐使用。
- BGSAVE 命令用于在后台异步保存当前数据库的数据到磁盘。执行 BGSAVE 命令后,Redis 会立即返回 OK,然后 fork 出一个新子进程。原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出

save 会阻止其它指令的执行,有可能会造成阻塞,bgsave
通过以下命令查看 BGSAVE
是否成功
redis-cli INFO persistence
开启RDB
通过 redis.conf
配置文件开启 RDB,找到 save
配置项,并确保以下内容未被注释(没有 #
号)

例如:
save 900 1 # 900秒(15分钟)内至少有1次写操作
save 300 10 # 300秒(5分钟)内至少有10次写操作
save 60 10000 # 60秒(1分钟)内至少有10000次写操作
修改RDB文件路径

如图,配置文件中dir和dbfilename 组成了RDB文件的存放路径。
三.AOF
AOF (Append-Only File) 是 Redis 提供的一种 持久化机制 ,它通过 将每一个写入命令追加到日志文件 来确保数据不会丢失。相比于 RDB (Redis Database File),AOF 提供了更高的数据安全性,但相应地也会增加磁盘 I/O 负担。
AOF 即 AppendOnlyFile ,AOF 和 RDB 都遵守 COW 机制,AOF 可以决定不同的保存策略,默认为每秒钟执行一次fsync
,按照操作的顺序将修改命令追加至指定的 AOF 日志文件尾部。在第一次启用 AOF 功能时,会做一次完全备份,后续将持续性备份,相当于完整数据备份 + 增量变化。
如果同时启用 RDB 和 AOF,进行恢复时,默认以 AOF 文件优先级高于 RDB 文件,因此会使用 AOF 文件进行恢复。
在第一次开启 AOF 功能时,会自动备份所有状态到 AOF 文件中,后续只会记录数据的更新指令。
注意:AOF 模式默认是关闭的,第一次开启 AOF 并在服务器发生故障后,会因为 AOF 的优先级高于 RDB,而 AOF 默认没有数据文件存在,从而导致所有数据丢失。
AOF的开启
直接修改配置文件(不推荐,会丢数据)
把此项设置为yes
设置AOF文件路径和文件名

动态修改(推荐)

动态修改之后再修改配置文件
修改AOF增量日志 恢复误删除数据

如图,误删除数据,下面通过修改AOF增量数据恢复误删除数据。
把误删除的指令删除重新启动服务。

恢复成功
AOF rewrite重写
将一些重复的,可以合并的,过期的数据重新写入一个新的AOF文件,从而节约AOF备份占用的硬盘空间,也能加速恢复
可以手动执行bgrewriteaof触发AOF,第一次开启AOF功能,或定义自动rewrite策略
AOF rewrite过程
父进程生成一个新的子进程负责生成新的AOF文件,同时父进程将新的数据更新同时写入两个缓冲区aof_buff和aof_rewrite_buf

实现AOF rewrite
在 Redis CLI 执行
bgrewriteaof
动态修改
CONFIG SET auto-aof-rewrite-percentage 100
CONFIG SET auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage 100
:表示 AOF 文件比上次重写后的大小 增长 100%(即翻倍)时,触发 AOF 重写。auto-aof-rewrite-min-size 64mb
:只有当 AOF 文件达到 64MB 以上时才会触发重写。
如果要使该配置永久生效,需要修改 redis.conf,然后重启
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
rewrite相关配置
#同时在执行bgrewriteaof操作和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞 的情形,以下参数实现控制
no-appendfsync-on-rewrite no #在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘1O开支和请求阻塞时间。 #默认为no,表示"不暂缓",新的aof记录仍然会被立即同步到磁盘,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题
#为yes,相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就 会丢失数据。丢失多少数据呢?Linux的默认fsync策略是30秒,最多会丢失30s的数据,但由于yes性能较好而且会避免出现阻塞因此比较推荐
#rewrite 即对aof文件进行整理,将空闲空间回收,从而可以减少恢复数据时间
auto-aof-rewite-percentage 100 #当Aof log增长超过指定百分比例时,重写AOF文件,设置为0表示不自动重写Aof日志,重写是为了使aof体积保持最小,但是还可 以确保保存最完整的数据
auto-aof-rewrite-min-size 64mb #触aof rewrite的最小文件大小
aof-load-truncated yes#是否加载由于某些原因导致的未尾异常的AOF文件(主进程被kill/断电等),建议yes