1. RDB持久化

因为Redis是内存数据库,他将自己的数据库数据存储在内存里面,所以如果不想办法将存储内存中的数据库数据保存到磁盘里面,那么服务器进程一旦结束,数据库中的数据也会消失不见。为了解决这个问题,Redis提供了RDB持久化功能,这个功能可以将内存中的数据保存到硬盘中,避免数据意外丢失。

RDB存储的流程如下

redis的rdb缺点是什么 redis rdb_开发语言

RDB持久化功能将数据存储到磁盘中,RDB是一个二进制文件,通过这个文件可以还原生成RDB文件时候的数据内容。

自动间隔保存

有两个命令可以生成RDB文件,一个是SAVE,一个是BGSAVE

区别是SAVE命令会阻塞服务器进程,直到RDB文件创建为止,BGSAVE和SAVE命令的不同点在于它是在后台创建了一个子进程,用来处理创建RDB文件,服务器进程不受影响。

redis的rdb缺点是什么 redis rdb_redis_02

接下来验证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服务端

redis的rdb缺点是什么 redis rdb_redis_03

尝试存储一个键并查询数据库状态:

redis的rdb缺点是什么 redis rdb_redis的rdb缺点是什么_04

rdb文件在资源管理器的情况:

redis的rdb缺点是什么 redis rdb_redis_05

已经被创建,大小为1kb

此时用文本编辑器打开:

redis的rdb缺点是什么 redis rdb_开发语言_06

虽然是二进制文件,但是仍能看出来有name,zhangsan等字眼

此时结束Redis服务重新起动,可以发现刚才保存的数据库状态已经恢复

redis的rdb缺点是什么 redis rdb_网络编程_07

尝试保存多个键值对测试间隔保存功能

以下命令是服务器在5秒内,对数据库进行了10次以上的修改

redis的rdb缺点是什么 redis rdb_redis的rdb缺点是什么_08

再看一下redis的后台日志

/usr/local/redis-5/redis.log文件内容:

redis的rdb缺点是什么 redis rdb_redis_09

时可以看到Redis刚刚启动的时候,会从RDB文件还原数据库状态

redis的rdb缺点是什么 redis rdb_linux_10

服务器启动时载入RDB文件的流程

redis的rdb缺点是什么 redis rdb_网络编程_11

因为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缺点是什么 redis rdb_linux_12

这句就是表示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

那么数据结构的内容就是

redis的rdb缺点是什么 redis rdb_网络编程_13

dirty计数器和lastsave属性

服务器每成功执行一次数据库修改,就会对dirty计数器进行更新,dirty计数器的数值=对数据库成功修改的次数。

Redis服务器会周期地检测save选项设置的保存条件是否满足,如果满足,则执行BGSAVE命令

以下伪代码展示了检测和保存的流程

配置:

save 900 1
save 300 10
save 60 10000

redis的rdb缺点是什么 redis rdb_开发语言_14

程序会遍历整个配置项,首先save 900 1程序会判断服务器的dirty计数器的数值是否大于等于1,如果成立,则继续判断距离上一次执行BGSAVE命令的秒数save_interval是否大于900,都成立的话,则执行BGSAVE。