目录
一、RDB是什么?
二、 RDB触发机制
2.1 手动触发
2.2 自动触发
2.3 RDB执行流程
三、RDB的文件处理
四、RDB的优缺点
一、RDB是什么?
RDB是Redis DataBase,是Redis实现数据持久化的一种方式。因为Redis的数据是存储在内存中的,所以就会有数据丢失的风险,那么为了解决这样的问题,Redis采取将数据写入硬盘中进行持久化的保存。
二、 RDB触发机制
RDB进行持久化是将当前进程的数据生成快照保存到硬盘中的过程,触发RDB持久化的过程也分为手动触发和自动触发
2.1 手动触发
这里手动使用两个命令就可以触发RDB的持久化
- save命令
阻塞当前的Redis,只到RDB过程完成为止,但是这个命令对于会将对内存造成很大的开销,基本不采用
- bgsave命令(background save后台保存)
Redis执行fork操作创建出子线程,RDB的过程全部由子线程负责,完成后自动结束。阻塞只发生在fork阶段,时间很短(Redis内部的RDB操作都是采取类似bgsave的方式)
2.2 自动触发
除了手动触发的机制,Redis还提供了自动触发RDB的机制,同时这个机制也是实战中运用较多的(毕竟不能总是手动输入命令),自动触发也提供了3种方式
- 使用save配置。如“save m n”表示在m秒修改了n次,自动RDB持久化,查看Redis的配置文件,我们可以发现默认的有900秒后修改了1次自动执行....这个并不是固定的,是可以手动修改的
- 从节点进⾏全量复制操作时,主节点⾃动进⾏ RDB 持久化,随后将 RDB⽂件内容发送给从结点。
- 使用shutdown命令关闭Redis时,自动RDB持久化
2.3 RDB执行流程
RDB手动执行和自动执行流程是一样的,这里以手动bgsave命令来演示
- 当执行basave命令的时候,首先会判断是否存在该命令相同的进程,如果有与该命令相同的进程就直接返回
- 没有正在执行的类似进程,父进程就会阻塞等待(很快单位以微秒记)执行fork,创建出子进程
- 当子进程创建完成之后,bgsave命令返回“Background saving started”信息通知父进程不再阻塞等待,使得父进程可以继续响应其他命令
- 子进程创建RDB文件,根据父进程内存中生成的快照文件,将原有文件进行原子替换,进而生成持久化的数据文件
- 子进程发送信号通知父进程已经完成,父进程更新统计信息
三、RDB的文件处理
打开redis的配置文件,发现rdb的默认文件是dump.rdb(这里可以修改),文件的存储路径是我已经修改过了的,是rdb文件的默认存储路径
Redis默认采⽤ LZF 算法对⽣成的 RDB ⽂件做压缩处理,压缩后的⽂件远远⼩于内存⼤⼩,默认开启,可以 将rdbcompression {yes|no} 动态修改(这里建议修改成yes,可以大幅度降低文件内存)
如果Redis在启动的过程中加载到损坏的RDB文件会拒绝启动。这里可以使用Redis提供的redis-check-dump工具检测RDB文件并获取相应的错误报告
四、RDB的优缺点
- RDB是一个紧凑压缩的二进制文件,代表 Redis 在某个时间点上的数据快照。⾮常适⽤于备份,全量复制等场景。⽐如每 6 ⼩时执⾏ bgsave 备份,并把 RDB ⽂件复制到远程机器或者⽂件系统中(如hdfs)⽤于灾备
- Redis加载RDB文件的速度远远快于AOF的方式
- RDB⽅式数据没办法做到 实时持久化 / 秒级持久化。因为 bgsave 每次运⾏都要执⾏fork创建⼦进程,属于重量级操作,频繁执⾏成本过⾼(由于不是实时备份,这里就会有内存数据丢失的风险。aof能够有效的解决这个问题)
- RDB⽂件使⽤特定⼆进制格式保存,Redis版本演进过程中有多个 RDB 版本,兼容性可能有⻛险