JAVAredisJava

Redis 中的持久化技术《Redis设计与实现》

2022-01-25  本文已影响0人  马小莫QAQ

本篇将介绍 Redis 中的持久化技术,主要有两种: RDB持久化AOF持久化

1、RDB 持久化

1.1 RDB 文件的创建与载入

Redis使用 SAVEBGSAVE 命令生成 RDB 文件;
SAVE :会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,阻塞期间服务器不能处理任何命令请求;
BGSAVE :会派生一个子进程,由子进程负责创建 RDB 文件,父进程继续处理命令请求。BGSAVE 执行期间,会发生以下特殊情况:

创建 RDB 文件由 rdb.c/rdbSave 函数完成;
载入 RDB 文件由 rdb.c/rdbLoad 函数完成;
RDB 文件的载入工作是在服务器启动时自动执行,只要 Redis 服务器在启动时检测到 RDB 文件存在,就会自动载入 RDB 文件;

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

1.2 自动间隔性保存

1.2.1 设置保存条件
1.2.2 dirty 计数器和 lastsave 属性
1.2.3 检查保存条件是否满足

1.3 RDB 文件

1.3.1 RDB 的文件结构
Redis 中的持久化技术《Redis设计与实现》
1.3.2 database 的文件结构

各字段含义:

1.3.3 key_value_pairs 的文件结构

各字段含义:

1.3.4 value 的编码

列表与集合对象的格式:

哈希表对象的格式:

有序集合对象的格式:

1.4 RDB 文件的示例

不包含任何键值对的 RDB 文件:

2、AOF 持久化与 RDB 持久化的区别

3、 AOF 持久化

3.1 AOF 持久化的实现

3.2 AOF 文件的载入与数据还原

服务器创建一个不带网络连接的伪客户(fake client),为客户端读入并执行 AOF 文件即可;

3.3 AOF 重写

3.4 AOF 后台重写

AOF 重写需要解决2个问题:

Redis 将 AOF 重写程序放到 子进程 里执行:子进程进行 AOF 重写期间,服务器进程(父进程)可以继续处理命令请求;子进程带有服务器进程的数据副本,使用子进程而不是线程,避免使用锁的情况下保证数据安全;

Redis 服务器设置一个 AOF 重写缓冲区 ,以保证:AOF 缓冲区的内容会定期被写入和同步到 AOF 文件,对现有 AOF 文件的处理工作如常进行;从创建子进程开始,服务器执行的所有命令都会被记录到 AOF 重写缓冲区里;

完成 AOF 重写工作后,向父进程发送一个信号,父进程接到信号后调用信号处理函数,执行以下工作:

将 AOF 重写缓冲区中的所有内容写入到新 AOF 文件,此时新 AOF 文件保存的数据库状态将与服务器当前的数据库状态一致;对新的 AOF 文件进行改名,原子地覆盖现有的 AOF 文件,完成新旧两个任务 AOF 文件的替换;

只有号处理函数执行时会对服务器进程(父进程)造成阻塞;

上一篇 下一篇

猜你喜欢

热点阅读