Redis设计与实现要点(7)--RDB持久化

RDB持久化是一种类似于快照的持久化方式,RDB持久化既可以通过手动触发,有可以通过配置选项定期执行。RDB持久化的结果是一个经过压缩的二进制文件,只要RDB文件存在,Redis服务器就可以用它来还原数据库。

1.RDB文件的创建和载入

RDB文件的创建主要分为手动触发和配置文件触发。

  1. 手动触发主要依靠SAVE命令和BGSAVE命令。SAVE命令会阻塞服务器,BGSAVE命令会创建一个子进程,由子进程创建RDB文件,因此没有阻塞服务器的问题(但BGSAVE命令执行期间,客户端发送的SAVE和BGSAVE命令会被服务器拒绝,而BGREWRITEAOF命令(异步执行一个AOF文件重写操作)会被延迟到BGSAVE完成之后执行)。
  2. 配置文件触发RDB的创建主要是依靠配置文件的save选项,当满足save选项的时候,会触发一次BGSAVE命令
    eg:save 900 1
    save 300 10
    save 60 10000

    服务器在900秒之内,对数据库进行了至少1次修改,
    服务器在300秒之内,对数据库进行了至少10次修改,
    服务器在60秒之内,对数据库进行了至少10000次修改,
    )只要满足以上三个条件任何一个,就会触发BGSAVE命令

Redis会根据save选项设置服务器状态的redisServer结构的saveParams属性,saveParams属性是一个数组,数组中的每一个元素都是一个saveparam结构:

  • time_t seconds: 秒数
  • int changes:修改数
    Redis的服务器周期性函数serverCron每隔100毫秒就会执行一次,它的其中一项工作就是检查save参数是否满足,满足则会执行BGSAVE命令。
    除此之外,服务器状态还维持着一个dirty计数器和lastsave属性:
  • dirty计数器记录距离上次执行SAVE或者BGSAVE命令,服务器对数据库状态进行了多少次修改
  • lastsave是一个unix时间戳,记录上次成功执行SAVE,BGSAVE命令时间

RDB文件的载入:
RDB文件的载入是在服务器启动时自动执行的。(注意:AOF文件的优先级大于RDB,当由AOF文件存在时,服务器会优先使用AOF文件来还原服务器),载入RDB文件时,系统会一直阻塞。

2.RDB文件结构

RDB文件的结构主要分为5个部分:

  1. REDIS:5字节,保存着"REDIS"五个字符,用于快速检验文件是否为RDB文件。
  2. db_version:4字节,记录RDB文件版本号
  3. databases: 包含0或任意多个数据库,以及各个数据库中的键值对数据。
  4. EOF常量,标志RDB正文结束
  5. check_sum:8字节长无符号整数,检验和

Databases部分:

  1. SELECTDB: 一字节常量,标明下面将要读入的值为一个数据库号码
  2. db_number:数据库号码,可以为一字节,两字节或五字节。
  3. key_value_pairs部分:保留数据库的所有的键值对数据。

key_value_pairs部分:
key_value_pairs部分保存一个或以上的键值对。存储键值对的方式依据键值对是否包含过期时间分为两类。
不带过期时间的键值对:

  1. type:存储value的类型,是类型常量(字符串,列表,集合,有序集合,hash,压缩列表,整数集合,压缩列表组成的有序集合,压缩列表组成的hash中的一个)
  2. key:保存键,一个字符串对象。
  3. value:保存值,根据type的不同,存储方式也不同。

包含过期时间的键值对:
除了type,key,value三个字段外,还另外有EXPIRETIME_MS ms两个字段

  • EXPIRETIME_MS: 一字节常量,标识接下来读入的是一个以毫秒为单位的过期时间。
  • ms:8字节长带符号整数,记录着一个以毫秒为单位的UNIX时间戳。这个时间戳就是过期时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值