乐趣区

关于redis:Redis-持久化之-rdb

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 这个动作会阻塞父过程,且父过程的内存越大,阻塞就越久。子过程在创立后,就不会再阻塞父过程了。

退出移动版