[Redis] 浅谈RDB 持久化
2020-12-08 本文已影响0人
Colors_boy
Redis 是内存数据库,它将自己的数据库状态存储在内存里面,所以一旦服务器关闭或者宕机,服务器中的数据库状态也会消失不见。因此,Redis 提供了两种持久化功能,其中 RDB 持久化功能是将数据库状态保存到磁盘里面,避免数据意外丢失。
RDB 持久化
1. RDB 文件的创建和载入
生成 RDB 文件命令:SAVE 和 BGSAVE
SAVE 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕,在服务器进程阻塞期间,服务器不能处理任何命令请求。
redis> SAVE
ok
BGSAVE 命令会派生出一个子进程,然后又子进程负载创建 RDB 文件,服务器进程继续处理命令请求:
redis> BGSAVE
Background saving started
默认保存条件:
save 900 1
save 300 10
save 60 10000
意思为 满足以下任一条件:900秒内数据库至少修改1次、300秒内数据库至少修改10次、60秒内数据库至少修改10000次都会触发执行 BGSAVE 。
存放在服务器的 saveparams 数组上。
RDB 文件的载入工作是服务器启动时自动执行,没有专门的执行命令,重要 Redis 服务器启动时检测到 RDB 文件的存在,它就会自动载入 RDB 文件。
注意:因为 AOF 文件更新频率比 RDB 文件高,如果服务器开启 AOF 持久化功能,则会优先加载 AOF 文件,只有在 AOF 持久化功能处于关闭状态,服务器才会优先加载 RDB 文件。
image.png2. RDB 文件结构
image.png(全大写表示常量)
- REDIS: 长度:5 个字节。快速识别是否为 RDB 文件。
- db_Version: 长度为 4个字节。记录RDB文件的版本号,如:"0006"
- databases: 包含着 0 个或者任意多个数据库。如果数据库为空,那么这部分也为空,长度为0个字节;如果服务器的数据库状态非空,这个部分的长度也会有所不同。
- EOF: 常量的长度为1个字节,这个常量标志 RDB 文件正文内容结束,当读入的程序遇到这个值时,它知道所有数据库的所有键值对已经载入完毕。
- check_sum: 8字节长度无符号的整数,保存着一个检验和。服务器载入 RDB 文件时,会将载入数据所计算出的校验和与 check_sum 保存的检验和进行对比,来判断 RDB 文件是否出错或者损坏的情况出现。
示例:
image.pngdatabases部分
完整的 RDB 文件结构:
image.pngSELECTDB 0 表示选择0号数据库载入数据。
pairs: 保存数据库所有的键值对,如果键值对带有过期时间,那么过期时间也会和键值对保存在一起。