Redis数据库持久化

Redis是个内存数据库一旦服务器进程退出,服务器中的数据库状态就会丢失。为了解决这个问题Redis提供了RDB持久化和AOF持久化。

1.RDB持久化
RDB持久化可以将某个时间点上的数据库状态保存到磁盘文件。RDB持久化既可以手动执行,也可以根据服务器配置定期执行。
1.1 RDB文件的创建与载入
有两个Redis命令可以用于生成RDB文件,一个是SAVE命令,另一个是BGSAVE命令。SAVE命令会阻塞Redis服务器进程,知道RDB文件创建完毕。BGSAVE命令会派生出一个子进程,子进程负责创建RDB文件,服务器进程继续处理命令。
Redis在启动的时候,优先启用AOF文件还原数据库,如果AOF关闭则载入RDB文件还原数据库。在载入RDB文件期间会一直处于阻塞状态直到载入完成。
用户可以通过设置服务器save选项,让服务器定期执行一次BGSAVE命令。用户可以实则多个save选项,只要其中任意一个条件被满足就会执行BGSAVE命令。
例子
save 900 1
save 300 10
save 60 1000
只要以下三个条件中的任意一个被满足,BGSAVE命令就会被执行。
* 服务器在900秒内,对数据库进行了至少1次修改。
* 服务器在300秒内,对数据库进行了至少10次修改。
* 服务器在60秒内,对数据库进行了至少1000次修改。

1.2 RDB文件实现

struct saveparam {
//秒杀
time_t seconds;
//修改数
int changes;
};

struct redisServer {
//记录保存条件的数组
struct saveparam *saveparams;
//上一次执行保存时间
time_t lastsave;
//修改计数器
long long dirty;
}

  • saveparams属性是一个数组,数组中每个元素是一个saveparam结构。每个saveparam记录save参数设置。
  • dirty计数器记录距离上次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库进行多少次修改(写入,删除,更新等)。
  • lastsave属性是一个UNIX时间戳,记录了服务器上一次成功执行SAVE命令或BGSAVE命令的时间。

Redis服务器周期性操作函数serverCron默认每隔100毫秒执行一次。他其中一项工作就是检查save选项所设置的save参数条件是否满足。
程序遍历检查saveparams数组所有条件,只要任意一个条件被满足,那么服务器就会执行BGSAVE命令。

1.3 RDB文件结构

RDB文件的开头是REDIS部分,这个部分长度5字节。程序在载入文件时可以快速检查文件是否RDB文件。
db_version长度4字节,它的值时一个字符串表示的整数,整数记录了RDB文件的版本号。
database部分包含着零个或任意多个数据库,以及各个数据库的键值对数据。
EOF常量的长度1字节,标志RDB文件正文内容的结束。
check_sum时一个8字节无符号整数,保存着一个校验和,当载入文件的时候验证这个校验和判断文件是否损坏。

posted @ 2021-02-28 23:13  wenlongliu  阅读(62)  评论(0编辑  收藏  举报