1、RDB简介
Redis有两种持久化形式,一种是RDB快照模式(snapshot),另一种是AOF(Append-Only-file)。
RDB是将当前的数据集快照写入磁盘, Redis 重启动时, 可以通过载入 RDB 文件来还原数据库的状态。假如Redis没有持久化机制,可不可以,可以!当成纯内存使用,禁止所有持久化机制,追求高性能。
RDB 功能最核心的是 rdbSave
和 rdbLoad
两个函数, rdbSave
用于生成 RDB 文件到磁盘, 而rdbLoad
则用于将 RDB 文件中的数据重新载入到内存中。
在rdbsave
将快照写入RDB文件的时候,如果文件已经存在,则新的RDB文件会将已有的文件覆盖。
2、如何触发
RDB是怎么工作的?只要安装好resdis可以了么?当然不是!!!
RDB有两种方式可以触发RDB持久化,这里说的RDB持久化,指的是一次将当前的数据集快照写入磁盘的操作。分别是通过执行命令手动触发
和通过配置redis.conf文件自动触发
。
2.1 手动触发
手动触发redis有两个指令,分别是save
和bgsave
。
save
: 该线程会阻塞当前redis服务器,执行save指令期间,redis不能处理其他的命令,直到RDB持久化完成。如果RDB文件较大,会产生比较大的影响,生产上谨慎使用。bgsave
:为了解决save
命令存在的痛点,bgsave
会异步执行RDB持久化操作,不会影响redis处理其他的请求。Redis服务器会通过fork
操作来创建一个子进程,专门处理此次的RDB持久化操作,完成后自动结束。Redis只会在fork
过程中发生阻塞,而且时间较短,当然,fork
时间也会随着数据量变大而变长,需要占用的内存也会加倍。
save
和bgsave
命令都会调用上面说的rdbsave
方法,只是方式不一样。
2.2 自动触发
需要配置redis.conf
文件:
save 900 1 # 如果900 秒内至少有 1 个 key 的值变化,则触发RDB
save 300 10 # 如果300 秒内至少有 10 个 key 的值变化,则触发RDB
save 60 10000 # 如果60 秒内至少有 10000 个 key 的值变化,则触发RDB
如何关闭自动触发?
只需要注释掉上面的代码,或者直接用空字符串即可。
save ""
如果使用命令行操作就是
redis-cli config set save " "
2.2.1 自动保存的原理
为什么配置了就可以了?底层的机制是什么?
redis有一个周期操作函数serverCron
,默认是每100毫秒就会执行一次,只要服务器在运行,这个函数也就一直在工作,检查save设置的条件是否有被满足,这个是serverCron
函数的其中一个功能,如果满足,就会执行bgsave
。基本所有的RDB操作都是默认使用bgsave
,而不是save
。
除了上面说的save参数之外,我们来看看其他的和RDB相关的配置
save 900 1
- 配置触发RDB持久化的条件
stop-writes-on-bgsave-error yes
- 默认是yes,这个配置意思是如果启动RDB持久化,那么如果后台保存数据失败,redis是否会停止接受数据。这蛮好的,能起到告警的作用,如果redis持久化有问题了,能够反映到redis本身的读写上来。