RDB
-
重点
1. RDB 是经过压缩的二进制文件用于保存和还原 Redis 服务器所有数据库中的所有键值对数据。 2. SAVE 命令会阻塞服务器,执行过程中客户端命令请求会被拒绝。 3. BGSAVE 命令由子进程执行保存操作,不会阻塞服务器,可以继续处理客户端命令。 4. 服务器为避免父进程及子进程同时执行 rdbSave 调用,防止竞争条件,所以禁止 SAVE 和 BGSAVE 同时执行, 5. 服务器状态中会保存所有用 save 选项设置的保存条件( save <秒> <次数>),当任意一个条件被满足时,服务器会自动执行 BGSAVE 命令,服务器默认每隔 100 毫秒执行一次,执行函数为 serverCron。 6. RDB 文件保存地址可以在 redis-cli 中通过 `config get dir` 命令获取。 7. 如果服务器启动了 AOF 功能,那么服务器会优先使用 AOF 文件来还原数据库状态。 只有在 AOF 持久化功能处于关闭状态时,服务器才会使用 RDB 文件来还原数据库状态。
-
服务器载入文件时的流程判断
-
dirty 计数器和 lastsave 属性
1. dirty 计数器用于保存服务器上一次成功执行 SAVE 或 BGSAVE 之后,服务器对所有的数据库状态执行了多少次修改(包括写入、删除、更新等)。
2. lastsave 属性 UNIX 时间戳,记录了服务器上一次成功执行 SAVE 或 BGSAVE 的时间。
AOF(Append Only File)
-
重点
1. AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态的(追加), 2. AOF 文件中的所有命令都已 Redis 命令请求协议的格式保存,命令请求会先保存到 AOF 缓冲区,然后再定期写入并同步到 AOF 文件中。 3. AOF 实现过程:命令追加、文件写入、文件同步三个步骤。 4. AOF 重写并不需要对现有的 AOF 文件进行任何读取、分析或者写入操作。 5. 在执行 BGREWRITEAOF 命令时,Redis 服务器会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新的 AOF 文件期间,记录服务器执行的所有写命令。当子进程完成创建新的 AOF 文件工作后,服务器会将重写缓冲区中的所有内容追加到新的 AOF 文件的末尾,使新旧 AOF 文件保存的数据库状态完全一致。最后,服务器用新的 AOF 文件替换旧的 AOF 文件,完成 AOF 重写操作。 6. AOF 重写过程中,客户端请求的新的命令会分别保存到 AOF 缓冲区 和 AOF 重写缓冲区。 7. 重写时为避免执行命令时造成客户端输入缓冲区溢出,重写程序处理 列表、哈希表、集合、有序集合 这四种可能会带有多个元素的键时,会先检查键所包含的元素数量,如果超出 redis.h/AOF_REWRITE_ITEMS_PER_CMD(64) 常亮的值,那么重写程序将使用多条命令来记录键的值。
-
AOF 实现过程
- 命令追加:Redis 先将写命令追加到缓冲区 (aof_buf),而不是直接写入文件,主要是为了避免每次有写命令都直接写入硬盘,导致硬盘 IO 成为 Redis 负载的瓶颈。
- 文件写入:通过 flushAppendOnlyFile 函数来判断,是否需要将 aof_buf 缓冲区中的内容写入并保存到 AOF 文件中。其中 flushAppendOnlyFile 函数的行为由服务器配置的 appendfsync 选项的值来决定。
always:将 aof_buf 缓冲区中所有内容写入并同步到 AOF 文件,(性能最低,安全性最高);
everysec: 将 aof_buf 缓冲区中所有内容写入到 AOF 文件,如果上次同步 AOF 文件的时间距离现在已超过 1 秒,则再次对 AOF 文件进行同步(性能、安全性平衡,最多丢失 1 秒的命令数据);
no: 将 aof_buf 缓冲区中所有内容写入到 AOF 文件,不进行同步,由操作系统来决定何时同步,通常同步周期为 30 秒(性能最高,有数据安全性问题);
-
AOF 文件载入和数据还原