第10章 RDB持久化
Redis是内存数据库, 如果不进行持久化, 一旦服务器进程退出, 服务器中的数据库状态也会消失不见
RDB持久化既可以手动执行, 也可以根据配置定期执行.
RDB持久化所生成的RDB文件时一个经过压缩的二进制文件.
10.1 RDB文件的创建与载入
SAVE命令: 会阻塞Redis服务器进程, 直到RDB文件创建完毕.
BGSAVE命令: 派生出一个子进程, 由子进程负责创建RDB文件.
BGSAVE执行期间, 另外的SAVE和BGSAVE命令会被拒绝, 避免竞争条件;
BGREWRITEAOF不能和BGSAVE同时执行, 若正在执行BGSAVE, BGREWRITEAOF会延迟执行, 若正在执行BGREWRITEAOF, BGSAVE会被拒绝执行.
载入工作在服务器启动时自动执行, 没有专门的命令, 载入期间处于阻塞状态.
- 另外, 因为AOF文件的更新频率通常比RDB文件高, 所以如果开启了AOF持久化, 会优先使用AOF文件来还原数据库
10.2 自动间隔性保存
因为BGSAVE命令可以在不阻塞服务器进程的情况下执行, 所以可以配置save选项来定期执行BGSAVE命令.
save选项支持多个条件, 只要满足其一就会自动保存
- save
: 只要在interval时间间隔内, 发生了changes次修改, 就自动保存
- save
- saveparams表示save选项的多个条件
- dirty统计修改次数
- lastsave记录上次保存的时间戳
10.3 RDB文件结构
- SELECTDB常量长1字节, 表示一个数据库数据的开始.
- db_number表示数据库号码
- key_value_pairs保存了数据库中所有的键值对数据, 如果键值对带有过期时间, 过期时间也会保存在一起.
[//]: # (column is not supported)
![Untitled](ec30893b_Untitled.png)
[//]: # (column is not supported)
![Untitled](51c0ac93_Untitled.png)
value的编码
TYPE==REDIS_RDB_TYPE_STRING, 字符串对象. 具体方式与ENCODING有关:
REDIS_ENCODING_INT: 有ENCODING和interger两部分, 前者表示整型所占的位数
REDIS_ENCODING_RAW: 如果字符串长度小于等于20字节, value包含len和string两部分, 否则会使用LZF算法进行压缩.
TYPE==REDIS_RDB_TYPE_LIST, 列表对象, 包括列表长度(元素个数)list_length以及列表元素, 每个列表元素包括元素长度以及元素的值
TYPE==REDIS_RDB_TYPE_SET, 集合对象, 与列表对象类似, 包括set_size和集合元素.
TYPE==REDIS_RDB_TYPE_HASH, 哈希表对象,
TYPE==REDIS_RDB_TYPE_ZSET, 有序集合对象,
TYPE==REDIS_RDB_TYPE_INTSET, 整数集合对象, 先将整数集合转换为字符串对象, 然后将这个字符串对象保存到RDB文件中.
TYPE==REDIS_RDB_TYPE_LIST_ZIPLIST | REDIS_RDB_TYPE_HASH_ZIPLIST | REDIS_RDB_TYPE_ZSET_ZIPLIST, 压缩列表对象, 会将压缩列表转换成一个字符串对象, 再进行保存.
- Title: 第10章 RDB持久化
- Author: Huan Lee
- Created at : 2023-08-25 19:50:49
- Updated at : 2024-02-26 04:53:15
- Link: https://www.mirthfullee.com/2023/08/25/notion-第10章 RDB持久化-f4952a77/
- License: This work is licensed under CC BY-NC-SA 4.0.