面试题答案
一键面试Redis的RDB持久化策略原理
RDB(Redis Database)持久化策略是将Redis在内存中的数据以快照的形式保存到磁盘上。具体工作流程如下:
- 触发机制:
- 手动触发:通过执行SAVE或BGSAVE命令。SAVE命令会阻塞Redis服务器,直到RDB文件生成完毕;BGSAVE命令则会fork一个子进程,由子进程负责生成RDB文件,主进程继续处理客户端请求。
- 自动触发:根据配置文件中的save参数设置,例如“save 900 1”表示900秒内如果有1个键被修改,则触发BGSAVE操作;“save 300 10”表示300秒内如果有10个键被修改,则触发BGSAVE操作。
- 生成RDB文件:
- 当触发BGSAVE时,Redis主进程fork出一个子进程。
- 子进程将当前内存数据以二进制的格式写入到一个临时RDB文件中。
- 子进程写完临时RDB文件后,将其原子性地重命名为正式的RDB文件(覆盖旧的RDB文件)。
优点
- 性能高效:BGSAVE操作采用fork子进程的方式,主进程不需要进行磁盘I/O操作,因此对Redis服务器的性能影响较小,在数据量较大时优势明显。
- 恢复速度快:由于RDB文件是内存数据的二进制快照,在恢复数据时,直接将RDB文件读入内存即可,相比其他持久化方式(如AOF),恢复速度更快,适合大规模数据的恢复场景。
- 文件紧凑:RDB文件经过压缩处理,占用磁盘空间相对较小,便于数据的备份和传输。
缺点
- 数据可能丢失:RDB持久化是基于快照的方式,两次快照之间的数据变化不会被记录。如果Redis发生故障停机,可能会丢失从上次快照之后到故障发生时的数据。
- fork开销:在执行BGSAVE时,fork子进程会消耗一定的系统资源,包括内存(子进程和父进程共享内存,但写时复制机制可能导致内存使用量瞬间增加)和CPU时间,在大数据量情况下,fork操作可能会对系统性能产生一定影响。
- 版本兼容性:不同版本的Redis生成的RDB文件格式可能略有不同,在版本升级或降级时,可能会存在兼容性问题。