- RDB持久化
因为Redis是内存数据库,他将自己的数据库数据存储在内存里面,所以如果不想办法将存储内存中的数据库数据保存到磁盘里面,那么服务器进程一旦结束,数据库中的数据也会消失不见。为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将内存中的数据保存到硬盘中,避免数据意外丢失。
RDB存储的流程如下
RDB持久化功能将数据存储到磁盘中,RDB是一个二进制文件,通过这个文件可以还原生成RDB文件时候的数据内容。
自动间隔保存
有两个命令可以生成RDB文件,一个是SAVE,一个是BGSAVE
区别是SAVE命令会阻塞服务器进程,直到RDB文件创建为止,BGSAVE和SAVE命令的不同点在于它是在后台创建了一个子进程,用来处理创建RDB文件,服务器进程不受影响。
接下来验证RDB功能
要开启RDB,需要修改配置文件,redis.conf配置内容
port 6379 #Redis进程运行在6379端口
save 5 1 #5秒内至少有1个对数据库的修改
save 30 10 #30秒内至少有10个对数据库的修改
save 60 1000 #60秒内至少有1000个对数据库的修改
dbfilename rdb6379.rdb #RDB文件的文件名
dir ./ #RDB文件的存储路径
首先启动redis服务端
尝试存储一个键并查询数据库状态:
rdb文件在资源管理器的情况:
已经被创建,大小为1kb
此时用文本编辑器打开:
虽然是二进制文件,但是仍能看出来有name,zhangsan等字眼
此时结束Redis服务重新起动,可以发现刚才保存的数据库状态已经恢复
尝试保存多个键值对测试间隔保存功能
以下命令是服务器在5秒内,对数据库进行了10次以上的修改
再看一下redis的后台日志
/usr/local/redis-5/redis.log文件内容:
时可以看到Redis刚刚启动的时候,会从RDB文件还原数据库状态
服务器启动时载入RDB文件的流程
因为AOF持久化功能的更新频率要比RDB存储方式频率要快,所以优先从AOF文件中载入数据库状态,AOF持久化是通过保存服务器执行的命令来记录数据库状态。
因为我们设置的自动间隔保存的内容为 save 5 1 #5秒内至少有1个对数据库的修改
,表示Redis允许用户通过修改配置,让服务器定期去执行一次BGSAVE去保存数据库状态到RDB文件。
save 5 1 #5秒内至少有1个对数据库的修改
save 30 10 #30秒内至少有10个对数据库的修改
save 60 1000 #60秒内至少有1000个对数据库的修改
所以redis打印了保存键值对的日志到日志文件当中
这句就是表示Redis打开了一个新的子进程来处理键值对的存储
演示完整个RDB持久化的过程
RDB保存条件
Redis使用了一个C结构体来记录保存条件
struct redisServer {
struct saveparam *saveparams; //记录了保存条件
}
每个保存条件的结构
strcuct saveparam {
long seconds; //间隔的时间
ing changes; //时间时间内数据库修改次数
}
比如说配置文件内容为:
save 900 1
save 300 10
save 60 10000
那么数据结构的内容就是
dirty计数器和lastsave属性
服务器每成功执行一次数据库修改,就会对dirty计数器进行更新,dirty计数器的数值=对数据库成功修改的次数。
Redis服务器会周期地检测save选项设置的保存条件是否满足,如果满足,则执行BGSAVE命令
以下伪代码展示了检测和保存的流程
配置:
save 900 1
save 300 10
save 60 10000
程序会遍历整个配置项,首先save 900 1程序会判断服务器的dirty计数器的数值是否大于等于1,如果成立,则继续判断距离上一次执行BGSAVE命令的秒数save_interval是否大于900,都成立的话,则执行BGSAVE。