概述
RDB(Redis Database)方式的持久化默认开启
这种方式把当前 Redis 进程的数据按照一定的时间周期生成时间点快照( point-in-time snapshots ) 保存到磁盘中,不关心是否发生故障。
RDB 的使用
RDB 的两种触发机制:使用指令手动触发 和 redis.conf 配置自动触发。
手动触发
两个指令:save 和 bgsave
- save ,阻塞式持久化。该指令会阻塞当前 Redis 服务器,执行 save 指令期间,Redis 不能处理其他命令,直到 RDB 过程完成为止。
- bgsave,异步方式持久化。执行该命令时,Redis 会在后台异步执行快照操作,此时 Redis 仍然可以执行客户端请求。具体操作是 Redis 进程执行
fork
操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。Redis 只会在fork
期间发生阻塞,但是一般时间都很短。但是如果 Redis 数据量特别大,fork
时间就会变长,而且占用内存会加倍,这一点需要特别注意。
自动触发
redis.conf文件常用配置参数
# 这里表示每隔60s,如果有超过1000个key发生了变更,就执行一次数据持久化。
# 这个操作也被称之为snapshotting(快照)。
save 60 1000
# 持久化 rdb文件遇到问题时,主进程是否接受写入,yes 表示停止写入,
# 如果是no 表示redis继续提供服务。
stop-writes-on-bgsave-error yes
# 在进行快照镜像时,是否进行压缩。yes:压缩,
# 但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间。
rdbcompression yes
# 一个CRC64的校验就被放在了文件末尾,当存储或者加载rbd文件的时候
# 会有一个10%左右的性能下降,为了达到性能的最大化,你可以关掉这个配置项。
rdbchecksum yes
# 快照的文件名
dbfilename dump.rdb
# 存放快照的目录
dir /var/lib/redis
说明:Redis 服务器周期操作函数 serverCron
默认每隔 100 毫秒就会执行一次,该函数用于对正在运行的服务器进行维护,它的一项工作就是检查 save 选项所设置的条件是否有一项被满足,如果满足的话,就执行 bgsave 指令。
RDB 整体流程图
详细流程及代码实现,参考:Redis RDB 持久化详解 - 知乎
RDB 总结
触发redis中rdb的时机
RDB文件创建的三个时机:
- save命令执行
- bgsave命令执行(手动触发、自动触发)
- 主从复制
RDB持久化机制的优势
-
RDB创建的每一个文件都表明某一时刻Redis中的数据,很适合作冷备。
-
RDB持久化操作性能高。执行bgsave命令时,是通过Redis主进程fork的子进程执行磁盘IO操作,基本不会影响Redis同时对外提供读写服务。
-
相对AOF持久化机制来讲,由于RDB文件中存储的是数据,所以直接基于RDB文件来重启和恢复Redis数据,更加的快速。
RDB持久化机制的缺点
-
若是想要丢失的数据尽量的少,RDB没有AOF好。由于RDB是经过备份Redis全量数据,所以备份频率通常都是每隔5分钟,或者是更长的时间,那么一旦Redis异常,可能会丢失最近5分钟的数据。
-
RDB每次在fork子进程来执行RDB快照数据文件的时候,若是数据文件特别大,可能会致使对客户端提供的服务暂停数毫秒,或者几秒。