这里写目录标题
15.1 RDB持久化
RDB持久化是Redis默认使用的持久化功能,该功能可以创建出一个经过压缩的二进制文件,其中包含了服务器在各个数据库中存储的键值对数据等信息。RDB持久化产生的文件都以.rdb后缀结尾,其中rdb代表 Redis DataBase(Redis数据库)。
Redis提供了多种创建RDB文件的方法,用户既可以使用SAVE命令或者 BGSAVE命令手动创建RDB文件,也可以通过设置save配置选项让服务 器在满足指定条件时自动执行BGSAVE命令。本节接下来将分别介绍这 3种RDB文件的创建方法。
15.1.1 SAVE:阻塞服务器并创建RDB文件
用户可以通过执行SAVE命令,要求Redis服务器以同步方式创建出一个记录了服务器当前所有数据库数据的RDB文件。SAVE命令是一个无参数命令,它在创建RDB文件成功时将返回OK作为结果:
接收到SAVE命令的Redis服务器将遍历数据库包含的所有数据库,并将各个数据库包含的键值对全部记录到RDB文件中。在SAVE命令执行期间,Redis服务器将阻塞,直到RDB文件创建完毕为止。如果Redis服务器在执行SAVE命令时已经拥有了相应的RDB文件,那么服务器将使用新创建的RDB文件代替已有的RDB文件,这个过程如图15-1所示。
其他信息
复杂度:O(N),其中N为Redis服务器所有数据库包含的键值对总数量。
版本要求:SAVE命令从Redis 1.0.0版本开始可用。
15.1.2 BGSAVE:以非阻塞方式创建RDB文件
因为SAVE命令在执行时会阻塞整个服务器,所以用户在使用该命令创 建RDB文件期间将无法为其他客户端提供服务。为了解决这个问题, Redis提供了SAVE命令的异步版本BGSAVE命令:这个命令与SAVE命令一样都是无参数命令,它与SAVE命令的不同之处在于,BGSAVE不会直接使用Redis服务器进程创建RDB文件,而是使用子进程创建RDB文件。
当Redis服务器接收到用户发送的BGSAVE命令时,将执行以下操作:
1)创建一个子进程。
2)子进程执行SAVE命令,创建新的RDB文件。
3)RDB文件创建完毕之后,子进程退出并通知Redis服务器进程(父进程)新RDB文件已经完成。
4)Redis服务器进程使用新RDB文件替换已有的RDB文件。
图15-2展示了这一执行过程。
因为BGSAVE命令创建RDB文件的操作是由子进程以异步方式执行的, 所以当用户在客户端执行这个命令时,服务器将立即向客户端返回 OK,然后才会在后台开始具体的RDB文件创建操作:
因为BGSAVE命令是以异步方式执行的,所以Redis服务器在BGSAVE 命令执行期间仍然可以继续处理其他客户端发送的命令请求。不过需要注意的是,虽然BGSAVE命令不会像SAVE命令那样一直阻塞Redis服务 器,但由于执行BGSAVE命令需要创建子进程,所以父进程占用的内存 数量越大,创建子进程这一操作耗费的时间也会越长,因此Redis服务器在执行BGSAVE命令时,仍然可能会由于创建子进程而被短暂地阻塞。
其他信息
&n