本系列帖子为鼠鼠复习八股巩固记忆和个人理解所写,如有错误纯属本人实力不佳,欢迎各位大佬阅读指正
1.RDB 是什么?原理、触发方式、优缺点?
RDB是Redis的内存快照持久化机制,会把某一时刻内存中的全部数据生成一个压缩的二进制快照文件保存到磁盘。
原理:
通过 fork子进程,利用写时复制COW技术后台写入RDB文件,主线程可以继续处理请求。
触发方式:
手动触发,bgsave后台异步执行,save会阻塞,线上不用。
自动触发,按配置save规则自动生成、主从全量复制,执行shutdown时都会自动触发RDB。
优点:
文件体积小,数据恢复速度快,适合备份和灾备。
缺点:
两次快照之间宕机会丢失数据,fork大内存实例时可能出现短暂卡顿。
2.AOF 是什么?日志刷写策略三种?
AOF是Redis的日志追加式持久化机制,他不记录数据快照,而是把每一条写命令以文本形式追加到对应的日志文件中,重启时,Redis会重新执行一遍AOF里面所有命令来恢复数据。
优点:数据安全性远高于RDB,可做到秒级丢失甚至不丢失。
缺点:AOF文件通常比RDB大,数据恢复速度比RDB慢。
三种策略:
always:每次写命令都立即同步刷盘,数据最安全,基本不丢失,性能最差。
everysec:每秒异步刷盘一次,性能较好,最多丢失1秒数据,是推荐默认配置。
no:由操作系统决定何时刷盘,性能最高,但丢失数据的风险最大。
3.AOF 重写机制原理、为什么要重写?
原理:
Redis主线程fork一个子进程
子进程根据当前内存里的最新数据,直接生成一套最小化的写命令,写入新的AOF文件。
主线程在重写期间,新的写命令会同时写到,原AOF文件和AOF重写缓存区。
子进程写完新AOF后,主线程会把缓存区里的新命令追加到新文件末尾。
原子替换旧AOF文件,完成重写,整个过程不阻塞主线程,也不会丢失重写期间的新命令。
为什么要重写:
随着运行时间变长,AOF日志文件会越来越大,重复无效命令过多,文件过大恢复速度慢占用空间,影响Redis性能。
4.RDB 和 AOF 对比区别、各自适用场景?
RDB:是快照,某一时刻全量数据二进制文件,恢复快,文件小。
AOF:是日志,逐条记录命令,数据更安全,文件更大,恢复慢。
丢数据:RDB可能丢一整段数据,AOF最多丢1秒数据。
性能:RDB主线程压力小,AOF每秒刷盘有轻微开销。
恢复速度:RDB远快于AOF。
适用场景:
RDB:数据冷备,灾备,大数据量快速恢复,对性能要求极高,允许少量数据丢失。
AOF:数据不能丢,核心业务,数据安全性优先,写多读少场景。
5.混合持久化原理(RDB+AOF 混合)?
Redis混合持久化就是重启时先用RDB快照恢复数据,再用AOF增量日志补全。
原理:
AOF重写时,直接以RDB全量数据作为文件前半部分,重写之后的增量命令以AOF日志形式写在后半部分。
重启恢复时:
先加载RDB内容,快速恢复大部分数据,再执行后面的AOF日志,补全最新数据。
优点:
恢复速度接近RDB,数据安全性和AOF一样高,兼顾速度与安全是现在默认推荐方案。
6.Redis 宕机后数据恢复流程?
先判断是否开启AOF,优先使用AOF恢复。
如果没有AOF则再使用RDB快照文件恢复。
开启混合持久化时,先加载文件中的RDB全量数据,再执行后续的AOF增量命令,完成恢复。