Redis 是一款内存数据库,也就是说它把数据都存储在内存中,持久化就是把内存中的数据存储到电脑的磁盘上。
由于Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。
对于Redis而言,持久化机制是指把内存中的数据存为硬盘文件, 这样当Redis重启或服务器故障时能根据持久化后的硬盘文件恢复数据。
redis持久化的意义,在于故障恢复。比如部署了一个redis,作为cache缓存,同时也可以保存一些比较重要的数据。
1. RDB(Redis DataBase): 持久化方式能够在指定的时间间隔能对你的数据进行快照存储。
2. AOF(Append Only File) :持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据。
RDB 是 Redis 持久化到磁盘上的数据文件的格式,重点内容默认的文件名是 dump.rdb。
Redis 会在指定的时间间隔内将内存中的数据集快照写入磁盘,它恢复时是将快照文件直接读到内存里。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
注意:
- 这种格式是经过压缩的二进制文件。
简要概况:
fork的作用是复制一个与当前进程一样的进程,新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。
RDB保存的文件,在redis.conf中配置文件名称,默认为dump.rdb。
rdb文件的保存位置,也可以修改。默认在Redis启动时命令行所在的目录下。
rdb文件的保存路径,也可以修改。默认为Redis启动时命令行所在的目录下
快照默认配置:
- save 3600 1:表示3600秒内(一小时)如果至少有1个key的值变化,则保存。
- save 300 100:表示300秒内(五分钟)如果至少有100个 key 的值变化,则保存。
- save 60 10000:表示60秒内如果至少有 10000个key的值变化,则保存。
给redis.conf添加新的快照策略,30秒内如果有5次key的变化,则触发快照。配置修改后,需要重启Redis服务。
save 3600 1
save 300 100
save 60 10000
save 30 5
使用 save 命令,或者 bgsave 命令。
Redis 在启动的时候会自动加载 redis-server 所在的目录下的 dump.rdb 文件(如果存在的话),如果在启动 redis-server 服务的时候指定了别的配置文件,那就读取那个指定的配置文件目录下的 dump.rdb。
只需要将rdb文件放在Redis的启动目录,Redis启动时会自动加载dump.rdb并恢复数据。
例如:
redis-server /myconf/redis.conf 命令执行之后就会去加载 /myconf 目录下的 dump.rdb 文件来初始化 redis。
stop-writes-on-bgsave-error: 默认值是yes。当Redis无法写入磁盘的话,直接关闭Redis的写操作。
rdbcompression:默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照会比较大。
rdbchecksum:默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
AOF 是 Append Only File 的意思,它是指 Redis 在持久化数据到硬盘的时候是以日志的形式来记录每个写操作,并保存到磁盘的一个文件中,这个文件的名字默认叫 appendonly.aof。
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来。
简单概述:
AOF默认不开启,修改 redis.conf 中的 appendonly 的值为 yes。可以在redis.conf中配置文件名称,默认为appendonly.aof。
这样在 redis 启动的时候,就会自动执行 appendonly.aof 文件中的写操作来将数据加载到内存。
注意:
- AOF文件的保存路径,同RDB的路径一致,如果AOF和RDB同时启动,Redis默认读取AOF的数据。
- 修改完需要重启redis服务。
如果 appendonly.aof 文件被破坏了(文件的内容被篡改了),怎么修复?
执行:redis-check-aof --fix appendonly.aof 就可以修复,然后重启 redis 即可。
ps:这个命令会把发生错误的命令之后的部分清掉。但是,这个修复命令不是万能的,如果文件被改的太惨,修复其实就是清空整个文件(比如,在文件头部进行修改)。
修改配置文件:
如果同时启用 RDB 和 AOF 这两种策略,那么 Redis 会加载哪个文件?
会优先加载 appendonly.aof 文件中的数据,就算只有 dump.rdb 文件,没有 appendonly.aof 文件,redis 也不会加载 dump.rdb 文件中的数据。
那要不要只使用 AOF 呢?
建议不要,因为 RDB 更适合于备份数据库,快速重启,AOF 启动慢,执行效率也慢(因为要经常存盘)。
不要仅仅使用RDB:RDB数据快照文件,都是每隔5分钟,或者更长时间生成一次,这个时候就得接受一旦redis进程宕机,那么会丢失最近5分钟的数据。
也不要仅仅使用AOF:1通过AOF做冷备,没有RDB做冷备,来的恢复速度更快;RDB每次简单粗暴生成数据快照,更加健壮,可以避免AOF这种复杂的备份和恢复机制的bug。
综合使用AOF和RDB两种持久化机制:用AOF来保证数据不丢失,作为数据恢复的第一选择,用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。