RDB 持久化
- 在 BGSAVE 命令执行期间,SAVE、BGSAVE 命令会被拒绝,防止产生竞态条件。
- 如果正在执行 BGSAVE,BGREWRITEAOF 命令会被延迟到 BGSAVE 执行完毕之后。
- 如果正在执行 BGREWRITEAOF,BGSAVE 会被拒绝。,考虑到性能问题。
RDB 文件结构
databases 结构
key_value_pairs 结构
TYPE 的值
value 的编码——字符串对象
-
TYPE 的值为 REDIS_RDB_TYPE_STRING
-
value 的编码可以是 :
- REDIS_ENCODING_INT8
- REDIS_ENCODING_INT16
- REDIS_ENCODING_INT32
- REDIS_ENCODING_RAW
-
如果编码是 REDIS_ENCODING_RAW:
- 如果字符串长度小于等于 20 字节,直接保存字符串
- 如果字符串长度大于 20 字节,字符串被压缩后再保存(redis.conf rdbcompression 打开 RDB 文件压缩功能)
-
无压缩字符串的保存结构
-
压缩后字符串的保存结构
AOF 持久化
实现步骤
- 命令追加
- 文件写入
- 文件同步
服务器配置的 appendfsync 决定文件写入行为(默认为 everysec)
AOF 文件重写
- AOF 文件重写并不需要对现有的 AOF 文件进行任何读取、分析或者写入操作,而是通过读取服务器当前的数据库状态来实现的。
- 为了避免在执行命令时造成客户端输入缓冲区溢出,重写程序在处理列表、哈希表、集合、有序集合这四种可能会带有多个元素的键时,会先检查键包含的元素数量,如果超过了 redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD 常量值,则分为多条命令写入。