1、什么是RDB
RDB(redis database)是redis默认的持久化方案。在指定的时间内,执行了指定的次数的写操作(或者超过指定时间执行了指定的操作次数),则将内存中的数据写入磁盘,作持久化存储。在指定目录下生成dump.rdb
文件,redis重启后可通过加载dump.rdb
文件恢复数据。
2、RDB持久化触发方式
1.save命令
save命令触发RDB持久化是一个同步阻塞的过程。在执行save指令期间,redis不能处理其他请求,直到持久化完成。
2.bgsave命令
bgsave命令触发RDB持久化是一个异步的过程。它会fork
出一个子进程来做持久化操作,完成后自动结束。redis只有在fork
期间会发生阻塞,其他时间仍然可以正常处理请求。
3.shutdown命令
shutdown命令能触发持久化。
4.flushall命令
flushall命令能触发持久化,但是没有什么意义。
5.自动化配置
查看标题4
3、RDB持久化原理
RDB持久化是redis进程fork出一个子进程,该子进程拷贝一份原有的dump.rdb
文件,将要持久化的数据集写入临时文件中,最后用临时文件将原有的dump.rdb
文件覆盖。
4、RDB自动触发配置
打开redis.conf配置文件,找到快照(SNAPSHOTTING)部分。核心配置
save "" 不需要持久化操作
save 900 1 每900秒内至少有1个key被改变
save 300 10 每300秒内至少有10个key被改变
save 60 10000 每60秒内至少有10000个key被改变
image.png
解释一下
save <seconds> <changes>
配置的含义。它指在指定的时间内,执行了多少次更新操作,就会触发RDB持久化操作。
例子:save 100 10
在100秒内,如果redis执行了10次更新操作,就触发一次RDB持久化操作。如果超过了100秒了,redis执行更新操作次数小于10,则不会触发RDB持久化操作。但是当从上次持久化操作后redis只要执行更新操作大于等于10次就会触发RDB持久化,不管时间是否到100秒或者超过100秒。(50秒时,redis一共执行了10次更新操作,触发RDB持久化。)(100秒时,redis一共执行了9次更新操作,105秒时,redis做了一次更新操作,则在105秒时触发RDB持久化)
在SNAPSHOTTING模块中还有下面三个配置
默认值为yes。当启用了RDB且最后一次后台保存数据失败,Redis是否停止接收数据。
stop-writes-on-bgsave-error
存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes
rdbcompression yes
本地持久化数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
持久化文件存储的路径
dir ./
image.png
5、数据恢复
将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可,redis就会自动加载文件数据至内存了。Redis 服务器在载入 RDB 文件期间,会一直处于阻塞状态,直到载入工作完成为止。
6、RDB的优缺点
优点:
- 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作。
- RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
缺点:
- RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运行都要执行fork操作创建子进程,属于重量级操作(内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑),频繁执行成本过高(影响性能)
- 在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改(数据有丢失)
网友评论