概述
- RDB持久化功能可以将服务器包含的所有数据库数据以二进制文件的形式保存到硬盘里面
- 通过在服务器启动时载入 RDB 文件,服务器可以根据 RDB 文件的内容,还原服务器原有的数据库数据
缺点:
将所有数据库的数据都保存起来,比较耗费资源和时间,所以需要服务器隔一段时间才创建一个新的RDB文件;如果在等待下一次RDB文件创建的过程中,服务器意外停机,用户将丢失最后一次创建RDB文件之后的数据
创建RDB文件
常见方式:
- 服务器执行客户端发送的SAVE命令
- 服务器执行客户端发送的BGSAVE 命令
- 使用save配置选项设置的自动保存条件被满足,服务器自动执行BGSAVE
命令
-
SAVE命令
通过客户端向服务器端发送SAVE命令,服务器会创建一个新的RDB文件
在执行SAVE命令的过程中,Redis服务器会被阻塞,无法处理客户发送的命令请求,只有在SAVE命令执行完成后,服务器才会重新开始处理客户端发送的命令请求
如果RDB文件已经存在,服务器会自动使用新的REB文件去代替旧的RDB文件127.0.0.1:6379> save OK
-
BGSAVE 命令
执行BGSAVE命令也会创建一个新的RDB文件,和SAVE的命令区别:BGSAVE不会造成Redis服务器阻塞,在执行BGSAVE命令过程中,Redis服务器仍然可以正常护理其他客户端发送的命令请求
一个异步命令,发送命令的客户端会立即的到回复127.0.0.1:6379> bgsave Background saving started
不会阻塞原因:
1. 当 Redis 服务器接收到 BGSAVE 命令的时候,它不会自己来创建 RDB 文件,而是通过 fork() 来生成一个子进程,然后由子进程负责创建 RDB 文件,而自己则继续处理客户端的命令请求;
2. 当子进程创建好 RDB 文件并退出时,它会向父进程(也即是负责处理命令请求的 Redis 服务器)发送一个信号,告知RDB 文件已经创建完毕;
3. 最后 Redis 服务器(父进程)接收子进程创建的 RDB 文件,BGSAVE 执行完毕
-
SAVE和BGSAVE区别
命令 | SAVE | BGSAVE |
---|---|---|
类型 | 同步 | 异步 |
是否服务器阻塞 | 是 | 否 |
复杂度 | O(N) | O(N) |
优点 | 不需要创建子进程,不会消耗额外的内存,可以集中资源来创建RDB 文件,所以 SAVE 创建RDB 文件的速度会比 BGSAVE快 | Redis 服务器可以在创建 RDB 文件的过程中,仍然正常地处理客户端的命令请求 |
缺点 | 执行期间会阻塞服务器 | 需要创建子进程,会耗费额外的内存 |
- 自动创建RDB文件
通过save配置选项,格式为:
如果距离上一次创建 RDB 文件已经过去了 seconds 秒,并且服务器的所有数据库总共已经发生了不少于 changes 次修改(包括添加、删除和更新),那么执行 BGSAVEsave <seconds> <changes>
样例:
当其中一个条件被满足时,服务器就会执行BGSAVEsave 900 1 save 300 10 save 60 10000