Redis持久化
由于Redis的数据都存放在内存中,如果没有配置持久化,Redis重启后数据就全丢失了,于是需要开启 Redis的持久化功能,将数据保存到磁盘上,当Redis重启后,可以从磁盘中恢复数据。
Redis提供了两个不同形式的持久化方式:
- RDB(Redis DataBase)
- AOF(Append Only File)
持久化操作-RDB
RDB是什么?
在指定的时间间隔内将内存的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照 文件直接读到内存里。
备份过程
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程 都结束了,再用这个临时文件替换上次持久化好的文件。
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢 复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后 一次持久化后的数据可能丢失。
dump.rdb文件
-
RDB保存的文件,在redis.conf中配置文件名称,默认为dump.rdb。
-
rdb文件的保存位置,也可以修改。默认在Redis启动时命令行所在的目录下。
redis.conf中配置文件路径
如何触发快照?
配置文件中默认的快照配置
-
快照默认配置
save 3600 1:表示3600秒内(一小时)如果至少有1个key的值变化,则保存 300 100:表示300秒内(五分钟)如果至少有100个 key 的值变化,则保存 60 10000:表示60秒内如果至少有 10000个key的值变化,则保存
可以自己配置新的保存规则。
-
例:给redis.conf添加新的快照策略,30秒内如果有5次key的变化,则触发快照。配置修改后,需 要重启Redis服务。
dump.rdb默认大小是89字节,里面会有一些基本信息。
30秒内设置5个以上的值。
set k1 v1 set k2 v2 set k3 v3 set k4 v4 set k5 v5 set k6 v6 set k7 v7
dump.rdb大小已经改变。
flushall
执行flushall命令,也会触发rdb规则。
save与bgsave
手动触发Redis进行RDB持久化的命令有两种:
-
save
该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成 为止,不建议使用。
save命令是同步命令,会占用Redis的主进程。若Redis数据非常多时,save命令会执行速度非常慢,阻塞所有客户端的请求
-
bgsave (推荐)
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。 这两个命令是在Redis客户端中执行,并不是redis.conf中修改
命令 save bgsave IO类型 同步 异步 阻塞 是 是(阻塞发生在fock(),通常非常快) 复杂度 O(n) O(n) 优点 不会消耗额外的内存 不阻塞客户端命令 缺点 阻塞客户端命令 需要fock子进程,消耗内存
stop-writes-on-bgsave-error
默认值是yes。当Redis无法写入磁盘的话,直接关闭Redis的写操作。
rdbcompression
默认值是yes。对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算 法进行压缩。如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能,但是存储在磁盘上的快照 会比较大。
rdbchecksum
默认值是yes。在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加 大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能。
恢复数据
只需要将rdb文件放在Redis的启动目录,Redis启动时会自动加载dump.rdb并恢复数据