美文网首页
[Redis] 浅谈RDB 持久化

[Redis] 浅谈RDB 持久化

作者: Colors_boy | 来源:发表于2020-12-08 12:23 被阅读0次

    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.png

    2. 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.png

    databases部分

    完整的 RDB 文件结构:

    image.png

    SELECTDB 0 表示选择0号数据库载入数据。

    pairs: 保存数据库所有的键值对,如果键值对带有过期时间,那么过期时间也会和键值对保存在一起。


    回顾:

    image.png

    相关文章

      网友评论

          本文标题:[Redis] 浅谈RDB 持久化

          本文链接:https://www.haomeiwen.com/subject/vmmfgktx.html