1、rdb 解决了什么问题?
rdb 是 redis 长久化其中的一种计划,通过快照的形式,可将内存的数据 dump 到磁盘上。
2、如何应用 rdb
2.1、save 与 bgsave
当客户端执行 save
or bgsave
时, 服务端会将以后内存中的数据 dump 到文件上。
save 会回绝客户端所有的命令,直到服务端执行完 save 后,能力响应客户端命令。
bgsave 命令不会阻塞客户端的读写命令。
2.2、主动触发 bgsave
2.2.1、开启主动触发 bgsave
在 redis 中默认是开启 rdb。例如上面的 redis 配置文件,格局如下:save <second> <changes>
save 900 1
save 300 10
save 60 10000
以上配置文件的意思为:900s 内有一次批改、300s 内有 10 次 批改、60s 内有 10000 次批改就会触发 bgsave
命令,将内存数据写入 dump.rdb 文件
2.2.1、敞开主动触发 bgsave
配置文件中保留 save ""
即可敞开该性能
2.3、配置文件中 rdb 相干配置
# rdb 文件寄存目录
dir ./
# rdb 文件名称
dbfilename dump.rdb
# 备份时,是否压缩 rdb 文件
rdbcompression yes
# 重启 redis 时从 rdb 导入到内存中时检测 rdb 是否实现,文件有没有被损坏,版本兼容性等
rdbchecksum yes
#长久化失败后, 是否持续工作
stop-writes-on-bgsave-error yes
#rdb 文件是否删除同步锁
rdb-del-sync-files no
3、bgsave 原理
绝大部分状况下,咱们不可能手动去执行 save
or bgsave
,个别会依赖配置文件主动触发的 bgsave
进行数据快照。因而这里次要说 bgsave
的原理
3.1、根本概述
bgsave 会 fork 出一个子过程,由子过程执行数据快照。其中 fork 动作会阻塞父过程,子过程执行数据快照时,不会阻塞父过程的读写操作。
3.2、子过程执行快照时,redis 如何做到不会阻塞父过程读写操作的?
fork 进去的 子过程与父过程共享同一份内存数据 。
当客户端要批改某一个 key 时,父过程会将以后要批改的 key 数据备份一份,而后在执行命令。子过程在执行快照时,读取的是 备份的数据。
以上简称为 写时复制技术(实际上 java 中的 CopyOnWriteArrayList 实现思路也是相似)
图片起源:极客工夫《Redis 核心技术与实战》专栏
4、rdb 的弊病
假如在 T0 时刻执行了一次快照,在 T0 时刻后,redis 挂掉了,那么 T0 时刻后批改的数据就会失落。
即:失落最近一次快照后批改的数据。
5、灵魂拷问
5.1、bgsave 是不是真的不会阻塞父过程?
上文有说到,bgsave 会触发 fork 动作,fork 这个动作会阻塞父过程,且父过程的内存越大,阻塞就越久。子过程在创立后,就不会再阻塞父过程了。