redis数据是保存在内存中,如果redis关闭数据就会丢失,为了避免这种情况,所以需要把redis数据进行持久化到磁盘。这样下次启动就可以使用持久化的数据文件将进行恢复了。
RDB
全量持久化
备份命令:
# 同步全量持久化
save
# 异步全量持久化
bgsave
save:同步执行,方法调用后会立即执行持久化方法,由于redis是单线程模型,主线程会阻塞,所以备份过程中是无法为其他客户端提供服务的。
bgsave:持久化过程会fork出一个子进程执行,只有fork时会阻塞主线程,真正的持久化任务是在子进程中进行执行的,所以并不会阻塞主进程执行其他任务,是异步的。
RDB方式的持久化是必然离不开了这两个命令的,不过触发方式可以分为手动触发和自动触发
手动触发:客户端手动执行命令
自动触发:设定相关的策略,在redis的配置文件redis.conf
save 900 1
save 300 10
save 60 10000
save 900 1表示:如果距离上一次创建RDB文件已经过去的900秒时间内,Redis中的数据发生了1次改动,则自动执行BGSAVE命令
save 300 10表示:如果距离上一次创建RDB文件已经过去的300秒时间内,Redis中的数据发生了10次改动,则自动执行BGSAVE命令
save 60 10000表示:如果距离上一次创建RDB文件已经过去了60秒时间内,Redis中的数据发生了10000次改动,则自动执行BGSAVE命令
当三个条件中的任意一个条件被满足时,Redis就会自动执行BGSAVE命令
RDB执行流程
- 执行save、basave、shutdowm命令时触发
- fork持久化子进程开始执行持久化任务。
- 遍历hashtable,利用copy on write,把整个内存dump下来。
rdb中有两个核心概念 fork 和copy-on-write ,执行数据备份的流程如下:
在执行basave的时候,redis首先会fork一个子进程得到一个新的子进程。子进程是共享主进程内存数据的,会将数据写入到磁盘上一个临时的rdb文件中,当子进程写完临时文件后,会将原来的.rdb文件替换掉,这个就是fork的概念。fork时主进程不进行