Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复
从配置文件中我们可以看出有两类持久化文件:

RDB持久化AOF持久化RDB 即 快照 模式(将内存数据以二进制文件形式保存起来),它是 Redis 默认的数据持久化方式,它会将数据库的快照保存在 dump.rdb 这个二进制文件中。

save命令
bgsave命令
Redis会单独创建(fork)一个子进程来进行持久化(该子进程与父进程享有相同的地址空间),会先将数据写入一个临时RDB文件,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。注意:此时的主进程仍然可以对外提供服务。

flushall命令自动触发
用户可以通过 save 选项设置多个保存条件,
但只要其中任意一个条件被满足,服务器就会执行 BGSAVE 命令。

通过CONFIG GET dir命令查看当前的工作目录

无论是使用RDB还是AOF持久化方式,持久化文件都会保存在Redis服务器的工作目录中。
通过find命令查看已经存在的dump.rdb文件

通过rm命令删除此文件

此时运行save命令,可以看到已经重新生成一个dump.rdb文件

bgsave命令测试


flushall命令测试

关掉redis服务测试是否产生文件

修改配置文件:
save 60 3 60秒3个改变进行持久化

注意:修改配置文件后一定要重启redis服务
info Persistence 
优点:
缺点:
从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。
默认是不开启AOF持久化方式,需修改配置文件 (永久)
appendonly no 默认是不开启,改为yes
appendfilename "appendonly.aof"
redis7后将会创建三个文件
# For example, if appendfilename is set to appendonly.aof, the following file
# names could be derived:
#-appendonly.aof.1.base。rdb作为基本文件。
#appendonly.aof.1.incr.aof。aof作为增量文件。
#-appendonly.aof。manifest作为清单文件。
appendfilename "appendonly.aof"
appenddirname "appendonlydir" //文件夹名
默认是不开启AOF持久化方式,通过命令暂时开启 (暂时)config set appendonly yes

redis6或者之前的版本,那么在目录下会直接在/usr/local/bin/ 目录下生成一个appendonly.aof文件
会在你的工作目录下创建一个appendonlydir目录,并创建以下三个文件:
appendonly.aof.1.incr.aof里保存的就是刚才的写入命令

该命令格式为Redis的序列化协议(RESP)。*3代表这个命令有三个参数,$3表示该参数长度为3
AOF需要记录Redis的每个写命令,步骤为:命令追加(append)、文件写入(write)和文件同步(sync)
为了提高文件的写入效率,当用户调用write函数,将一些数据写入到文件的时候,操作系统通常会将写入数据暂时保存在一个内存缓冲区里面,等到缓冲区的空间被填满、或者超过了指定的时限之后,才真正地将缓冲区中的数据写入到磁盘里面。
这种做法虽然提高了效率,但也为写入数据带来了安全问题,因为如果计算机发生停机,那么保存在内存缓冲区里面的写入数据将会丢失。为此,系统提供了fsync和fdatasync两个同步函数,它们可以强制让操作系统立即将缓冲区中的数据写入到硬盘里面,从而确保写入数据的安全性。
Redis 提供了 3 种写回硬盘的策略:
appendfsync always 每执行一个命令就保存一次,安全性最高,最多只丢失一个命令的数据,但是性能也最低(频繁的磁盘IO)
appendfsync everysec 每一秒保存一次,推荐使用,在安全性与性能之间折中,最多丢失一秒的数据
appendfsync no 依赖操作系统来执行(一般大概30s一次的样子),安全性最低,性能最高,如果系统宕机,丢失操作系统最后一次AOF文件的数据
AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多。所以Redis 新增了重写机制。当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩。
例如:
set k1 k1
set k1 k2
。。。将k1一共更改100次
如果没有重写机制,持久化文件就有100条写入的命令记录
而有重写机制,只保留最后一条,消除无效信息

手动触发
bgrewriteaof命令

重新生成了这三个文件:

可以看到appendonly.aof.2.base.rdb文件有

自动触发
auto-aof-rewrite-percentage 100 AOF文件重写的大小比例,100代表100%表示当前AOF文件比上一次大一倍才会触发重写机制
auto-aof-rewrite-min-size 64mb允许AOF重写的最小文件容量
no-appendfsync-on-rewrite=no
如果 no-appendfsync-on-rewrite=yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)
如果 no-appendfsync-on-rewrite=no, 还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)
打开aof文件,对其进行修改

重启服务,发现连接失败

通过命令修复redis-check-aof --fix appendonly.aof.1.incr.aof
会删除错误的那段数据

info Persistence 
优点:
缺点:

Redis4.0开始支持RDB和AOF的混合持久化:
通过修改配置开启
aof-use-rdb-preamble yes
其中 yes 表示已经开启混合持久化,no 表示关闭,默认值为 yes。