Redis 如何生成和解读rdb文件
RDB文件创建的入口函数和机制
- rdbSave函数 :save命令,会阻塞Redis服务器,直到RDB文件生成完毕为止。
- rdbSaveBackground 函数:bgSave命令,会调用fork函数创建子进程,后台异步地生成RDB文件,不会阻塞Redis服务器的正常操作。
- rdbSaveToSlavesSockets :以不落盘方式进行主从复制时创建rdb文件,也会调用fork创建子进程后台异步生成RDB文件。与rdbSaveBackground相比,都以后台异步方式生成RDB文件,不会阻塞主io,但是rdbSaveToSlavesSockets是通过网络以字节流的形式传输rdb数据至从节点。
RDB文件结构
- 文件头 : 包括Redis 的魔数、RDB 版本、Redis 版本、RDB 文件创建时间、键值对占用的内存大小等信息。
- 文件数据 : Redis 数据库实际的所有键值对。
- 文件尾 :结束标识符、校验值。校验值用来检查RDB文件是否被篡改过。
RDB文件如何生成
- 第一步 :调用rdbSaveType写入操作码,作用是在 RDB 文件中标识接下来的内容是什么。
- 第二步 :写入属性信息的键,比如记录字符串的长度等。
- 第三步 :写入入属性信息的值。
- 第四步 :循环遍历每个库,将每个库的编码写入RDB文件的同时也将其中所有的数据写入值RDB文件。这个过程中,除了会记录键值对的类型、键值对的key和value外,键值对的过期时间、LRU 空闲时间或是 LFU 访问频率也会记录。
- 第五步 :写入结束标识和检验值。