Redis是一种内存数据库,所有的数据都是存储在内存中的,一旦Redis服务器需要重启或者停机的时候,需要将内存中的数据持久化到磁盘中,避免数据丢失,也方便Redis服务器重启后恢复到之前的状态。Redis提供了两种持久化的方式:RDB和AOF。这篇笔记主要是讲RDB方式的持久化。
什么是RDB持久化
RDB持久化是Redis的持久化方式之一,也被称为快照持久化,是将某一个时间节点的Redis内存中数据保存到磁盘上,生成一个RDB文件。之后,用户可以将这份文件进行备份,复制到其他的服务器上创建具有相同状态的Redis服务器副本,也可以用于服务器重启恢复到原来的状态。
Redis中RDB持久化配置
在Redis中,可以配置RDB文件保存的目录、RDB文件的名称,还有同步的时机。配置文件为redis.conf,主要的RDB配置如下:
#保存rdb文件的名称,默认为dump.rdb
dbfilename dump.rdb
# 保存RDB文件的目录
dir .
#如果指定的秒数和数据库写操作次数都满足了就将数据库保存,默认就是如下配置,需要设置为其他的配置,修改下面配置即可。
# 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化)
# 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化)
# 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
save 900 1
save 300 10
save 60 10000
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文件高。