redis持久化原理
1. RDB
RDB是redis持久化的其中一种方式,redis通过将数据保存在RDB文件中避免数据意外丢失,关于RDB,需要知道:
- 如何创建与载入RDB文件?
- 自动保存功能如何实现?
- RDB文件结构
- RDB实际使用
1.1 RDB文件的创建与加载
两个命令生成RDB文件,sava和bgsave,前者阻塞服务器进程,也可以设置自动保存,而后通过后者真正创建RDB文件,后者通过一个服务器进程的子进程创建RDB文件,不会阻塞服务器进程
载入RDB文件是在服务器启动的时候自动执行的,只要检测的RDB文件,就会自动执行。
如果先执行了BGsave,再执行save就会被拒绝,这样做是为了防止父进程和子进程之间产生竞争。
2.2 自动间隔保存
redis可以通过命令实现一种自动间隔时间内保存数据的功能,具体是使用save命令:
1. save 900 1(表示如果900秒之内,至少出现了一次修改就保存)
2. save 300 10(表示如果300秒之内,至少出现了10次修改保存)
3. save 60 10000(表示如果60秒之内,至少出现了10000次修改保存)
数据结构
服务器状态结构:RedisServer
redisServer保存了服务器状态,里面有一个saveparam数组,表示save命令设置的保存条件。1
2
3
4
5
6
7
8struct redisServer{
//记录了保存条件的数组
struct saveparam * saveparam;
//dirty计数器
long long dirty;
//上一次执行保存的时间
time_t lastsave;
};1
2
3
4
5
6struct saveparam{
//秒数
time_t seconds;
//修改数
int changes;
};
- 修改计数器:dirty计数器
dirty:记录距离上一次成功执行save命令或者bgsave命令之后,服务器对数据库状态进行了多少次修改。 - 时间记录:lastsave
lastsave:记录了服务器上一次执行save或者bgsave命令的时间。