Redis设计与实现 第 10 章 RDB 持久化

时间:2021-06-23 16:26:57   收藏:0   阅读:0

第 10 章 RDB 持久化

数据库状态:服务器中的非空数据库以及它们的键值对统称为数据库状态

技术图片

Redis 提供 RDB 持久化功能,将内存中的数据库状态保存到磁盘中,避免数据意外丢失

RDB 文件是一个经过压缩的二进制文件,还可以通过该文件还原生成 RDB 文件时的数据库状态

技术图片

10.1 RDB 文件的创建与载入

SAVE、BGSAVE命令生成 RDB 文件

SAVE 命令会阻塞 Redis 服务器进程,直到文件创建完毕,阻塞期间无法处理任何请求

BGSAVE 命令会派生子进程,由子进程负责创建 RDB 文件,服务器父进程继续处理命令请求

创建 RDB 文件的实际工作由 rdb.c/rdbSave 完成,两个命令会以不同的方式调用此函数

技术图片

RDB 文件的载入工作在服务器启动时自动执行的,只要检测到 RDB 文件存在,自动载入 RDB 文件

AOF文件更新频率通常比 RDB 文件的更新频率高,所以:

技术图片

10.1.1 SAVE 命令执行时的服务器状态

阻塞,只有命令执行完成后客户端的命令才会被处理

10.1.2 BGSAVE 命令执行时的服务器状态

服务器可以继续处理命令请求,但有些区别

10.1.3 RDB 文件载入时服务器的状态

阻塞

10.2 自动间隔性保存

设置服务器配置 save 选项,让服务器妹隔一段时间自动执行一次BGSAVE 选项

save 900 1
save 300 10
save 60 10000

在 900 s 内,对数据库进行了至少一次修改

同理

三个条件满足一个,BGSAVE 命令就会执行

10.2.1 设置保存条件

save 900 1
save 300 10
save 60 10000

以上为默认设置,如果没有指定配置参数或者传入启动参数方式

服务器会根据 save 选项设置 redisServer.saveparams 属性

技术图片

技术图片

默认情况如下:

技术图片

10.2.2 dirty 计数器和 lastsave 属性

技术图片

服务器成功执行一次数据库修改命令之后就对 dirty 计数器进行更新

10.2.3 检查保存条件是否满足

serverCron 默认每隔 100 ms 执行一次,对运行的服务器维护,其中一项工作就是检查设置的保存条件是否满足,是则执行 BGSAVE 命令

技术图片

10.3 RDB 文件结构

完整的 RDB 文件结构如下:

技术图片

常量:全大写单词

变量和数据:全小写单词

RDB 为二进制数据,“REDIS” 保存的不是 c 字符串

10.3.1 database 部分

database 可以保存任意多个非空数据库

假设 0 号、3 号数据库非空, RDB 文件如图,database 代表 0 号数据库中的所有键值对

技术图片

database 0 又可以再细分

技术图片

10.3.2 key_value_pairs 部分

不带过期时间的键值对

TYPE KEY VALUE

技术图片

带过期时间的键值对

EXPIRETIME_MS MS TYPE KEY VALUE

10.3.3 value 编码

1.字符串对象:REDIS_RDB_TYPE_STRING

value 保存的为字符串对象,编码有 REDIS_ENCODING_INT 或者 REDIS_ENCODING_RAW

2.列表对象:REDIS_RDB_TYPE_LIST

value 保存的是 REDIS_ENCODING_LINKEDLIST 编码的列表对象

技术图片

3.集合对象:REDIS_RDB_TYPE_SET

REDIS_ENCODING_HT

技术图片

4.哈希表对象:REDIS_RDB_TYPE_HASH

REDIS_ENCODING_HT

技术图片

键与值相邻排列

5.有序集合对象:REDIS_RDB_TYPE_ZSET

REDIS_ENCODING_SKIPLIST

技术图片

成员与分值紧挨,分值为 double 浮点数,在 double、字符串中互相转换

6.INTSET 编码集合:REDIS_RDB_TYPE_INTSET

整数集合与字符串互相转换

7.ZIPLIST 编码的列表、哈希表或者有序集合

REDIS_RDB_TYPE_LIST_ZIPLIST

REDIS_RDB_TYPE_HASH_ZIPLIST

REDIS_RDB_TYPE_ZSET_ZIPLIST

压缩列表

  1. 压缩列表转换字符串

  2. 字符串保存到 RDB

  3. 字符串转换压缩列表

  4. 根据 TYPE 设置类型

    • REDIS_RDB_TYPE_LIST_ZIPLIST:列表
    • REDIS_RDB_TYPE_HASH_ZIPLIST:哈希表
    • REDIS_RDB_TYPE_ZSET_ZIPLIST:有序集合
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!