Redis作为一种内存型数据库,它将所有的数据都保存在服务器内存中。所以如果不想办法将存储在内存中的数据保存到磁盘里面,那么一旦服务器故障或者断电导致服务器进程推出,那么Redis中保存的数据都将消失不见。
为此,Redis 提供了数据持久化机制,它能够在 Redis 运行过程中将内存中的数据持久化到磁盘中,万一服务器故障导致进程意外退出,可以根据持久化出来的文件恢复 Redis 数据。目前 Redis 提供的持久化模式有两种:RDB模式和AOF模式。
RDB 持久化功能所生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件我们可以还原生成该 RDB 文件时数据库的状态。因为 RDB 文件是保存在磁盘中的,所以即便 Redis 服务进程退出,甚至运行 Redis 服务器的计算机宕机,只要磁盘中 RDB 文件存在,我们就能将数据恢复。
一、RDB 文件的创建与载入
有两个命令能生成 RDB 文件,一个是 SAVE,另一个是 BGSAVE。
这两者实现的功能相同,唯一的区别就是 SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件生成完毕,在此期间将无法执行新的命令。BGSAVE 命令不会阻塞服务器进程,它采用的方法是派生一个子进程,然后由子进程去生成 RDB 文件,服务器进程则可以继续执行新的命令。
如图一所示,配置文件 redis.conf 文件中说明了生成的 RDB 文件的名称以及保存路径,当然这些都是可以自定义的。保存路径采用了相对路径的方式,默认跟 redis.conf 文件保存在一个文件夹下(/etc/redis-5.0.7/etc/dump.rdb)。
生成 RDB 文件后,该文件的载入过程是在 Redis 服务器启动过程中载入的,只要 Redis 服务器在启动过程中检测到 RDB 文件的存在,他就会自动载入 RDB 文件。相较于 AOF 持久化模式生成的 AOF 文件,RDB 文件的更新频率更慢,所以:
- 如果服务器开启了 AOF 持久化功能,那么服务器会优先使用 AOF 文件来还原数据。
- 只有 AOF 持久化功能处于关闭状态,服务器才会使用 RDB 文件来还原数据
二、自动间隔性保存
除了上面提到的 SAVE 和 BGSAVE 命令可以手动生成 RDB 文件外。用户也可以在配置文件中的 save 选项设置多个保存条件,只有任何一个条件满足,服务器都会执行 BGSAVE 命令。redis 服务器设置自动间隔保存为:
对上述配置的解释是:
- 服务器在900秒之内,对数据库进行了至少1次修改
- 服务器在300秒之内,对数据库进行了至少10次修改
- 服务器在60秒之内,对数据库进行了至少100000次修改
图三是我在执行一次 set msg hello 命令后,触发了 redis 自动保存条件而进行的一个 BDGSAVE 操作。
对于生成的 RDB 文件我们可以使用 od 命令去查看文件:
三、 RDB 持久化的优缺点
1、优势
- RDB 文件保存了 Redis 在某一时刻的数据信息,恢复的时候直接加载到内存即可,不用做其他处理,这种文件适合用于做灾备处理
- RDB 在恢复大数据集的时候比 AOF 恢复速度快
2、劣势
- RDB 难以做到实时的数据持久化,发生事故时,上一次持久化时间到事故发生时的数据将无法得到持久化,恢复时造成数据丢失。
- RDB 做持久化时都是新建一个子进程去处理,如果Redis 数据量比较大,那么子进程去生成 RDB 文件的时间将会比较长