Redis有什么持久化策略?

883 阅读2分钟

Redis有什么持久化策略?

了解过 Redis 的持久化策略吗?介绍一下?


好的,面试官 Redis 的持久化策略分为三种,分别是 AOF 持久化、RDB快照持久化、以及这两种的一个混合模式。

下面我详细介绍一下这三种策略的异同吧。


首先是 AOF 持久化

这个持久化方式在 Redis 中是默认不开启的,所以需要使用的时候要在配置文件中配置一下 AOF 持久化其实就是 Redis 主进程根据写操作生成日志并写到 aof 文件的过程。 这里的 aof 文件可以理解为 Redis 的一个日志文件,只要是写操作都会生成对应的日志并需要写入 aof 文件中; 在 Redis 中是先执行操作(写操作),后生成日志的;

在日志真正写进 aof 文件之前,会经过 aof 缓冲区,是用来提高写入性能的; aof 缓冲区的落盘策略有三种 Always、Everysec、No, 这三种策略的数据安全性和性能都有所不同,我们可以根据实际的业务需求来选择;

aof 是追加写的,为了避免 aof 文件过于巨大,Redis 中提供了 aof 重写机制, 为了避免阻塞主进程处理客户请求,所以 aof 的重写是交由 fork 出来的子进程处理的。

接着介绍一下 RDB 快照持久化

这种方式是 Redis 中默认使用,在性能上会比 AOF 要好一些, 因为 AOF 在恢复数据的时候是需要重新执行命令的,而 RDB 只需要将快照数据重新加载进内存即可。 RDB 快照可以由主进程或者子进程生成, 取决于执行什么样的命令(save 是主进程,bgsave 是 fork 出来的子进程执行)

最后讲讲混合持久化

混合持久化是工作在 AOF 重写的过程中的 先是将 RDB 快照数据写进新的 aof 文件,接着将这过程中新增的日志以 aof 的形式追加在新的 aof 文件后面, 最后将新的 aof 文件取代旧的 混合持久化就充分利用了 RDB 的快速和 AOF 的安全性,前面的 RDB 数据只需要加载进内存即可,而增量的 aof 日志是很少量的。


其实 Redis 的这整个设计看起来可以说是一个标准的复制状态机的应用,日志 + 快照,我们可以看到 MySQL 也有类似的设计,redo log 是它的日志,而 bing log 是它的快照。