什么是RDB持久化
RDB持久化是Redis的持久化方式之一,也被称为快照持久化,是将某一个时间节点的Redis内存中数据保存到磁盘上,生成一个RDB文件。之后,用户可以将这份文件进行备份,复制到其他的服务器上创建具有相同状态的Redis服务器副本,也可以用于服务器重启恢复到原来的状态。
Redis中RDB持久化配置
在Redis中,可以配置RDB文件保存的目录、RDB文件的名称,还有同步的时机。配置文件为redis.conf,主要的RDB配置如下:
1 | #保存rdb文件的名称,默认为dump.rdb |
Redis生成RDB文件的方式
Redis有如下几种方式,可以让服务器生成RDB文件:
- 客户端向Redis服务器发送BGSAVE命令,Redis服务器会调用fork创建一个子进程,子进程负责将快照写到磁盘上,父进程会继续处理客户端的请求。
- 客户端向Redis服务器发送SAVE命令,Redis服务器在接到SAVE命令的时候,会将数据同步到RDB文件中,在此之间,服务器处于阻塞状态,不会处理其他的请求。
- 当用户配置了save选项的时候,一旦save选项满足,则会自动调用BGSAVE命令进行持久化操作。
- Redis通过SHUTDOWN命令关闭服务器或者收到标准的TERM信号时,会执行SAVE命令进行持久化。
- 当一个Redis服务器连接另一个Redis服务器,并向对方发送SYNC命令来进行一次复制的时候,如果主服务器没有执行BGSAVE操作,或者主服务器不是刚刚执行完BGSAVE操作,那么主服务器就会执行BGSAVE操作。
需要注意的是:
- 如果在BGSAVE命令执行期间,客户端向服务器发送SAVE命令,服务器会拒绝执行SAVE命令,防止产生竞争条件。
- 如果在SAVE命令执行期间,客户端向服务器发送BGSAVE命令,服务器会拒绝执行BGSAVE命令,防止产生竞争条件。
- BGSAVE和GBREWRITEAOF不能同时执行,如果BGSAVE正在执行,客户端发送的BGREWRITEAOF命令将延迟在BGSAVE命令执行完毕再执行。如果是GBREWRITEAOF正在执行,客户端发送的BGSAVE将会被拒绝执行。
关于Redis载入RDB文件
当Redis需要读取RDB文件恢复到之前的状态时,在读取RDB文件的整个过程中,Redis都是处于阻塞状态。需要注意的是,如果Redis开启了AOF,服务器会优先读取AOF文件来还原数据库的状态,因为AOF文件的更新频率通常比RDB文件高。