Skip to content

AOF 持久化的相关命令有哪些?

BGREWRITEAOF:开始执行 AOF 后台重写。


AOF 持久化是如何实现的?

答:需要在配置文件中开启 AOF 持久化功能。当 AOF 持久化功能打开之后,服务器会将每一条写命令以一种协议格式追加到服务器状态的aof_buf缓冲区的末尾。在整个事件循环结束前(Redis服务器进程就是一个事件循环),会调用函数flushAppendOnlyFile(),考虑是否将aof_buf缓冲区中的内容写入和同步到 AOF 文件里面。具体行为由配置文件中的 appendfsync 选项的值决定。

c
struct redisServer {
	sds aof_buf;      /* AOF buffer, written before entering the event loop */
}

文件的写入和同步是什么意思?

答:在现代操作系统中,为了提高效率,会写入到文件中的数据先放到一块内存缓冲区当中,当缓冲区已满或者超过指定的上限,才真正写入到磁盘里面,也叫做同步。


appendfsync 三个选项的意思分别代表什么?

答:

  • always:每次事件循环末尾,都同步。
  • everysec:每隔一秒同步。
  • no:不同步,交由操作系统决定。

AOF 文件重写的实现原理?

答:创建一个新的AOF文件,然后一个双重 for 循环:遍历所有的数据库,遍历含有数据的数据库中的所有键。先对键进行判断,如果键已经过期,continue。如果键未过期,针对不同类型的键调用不同的键重写函数。最后,再判断这个键是否带有过期时间,如果有,那么过期时间也重写。 重写函数的大致流程就是先获取值,再用一条命令去记录。


AOF 文件重写一定是用一条命令记录吗?

答:不一定。为了避免客户端输入缓冲区溢出,在处理带有多个元素的键时,比如列表、哈希表、集合、有序集合,会先检查包含元素的数量是否超出了规定值,如果超出了,则会使用多条命令去记录。 这个值由 redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD 常量记录。

提示

在最新版 Redis 中(7.2.4),这个常量叫做AOF_REWRITE_ITEMS_PER_CMD


BGREWRITEAOF 命令的实现原理?

答:服务器进程创建一个子进程,子进程开始执行 AOF 文件重写,服务器进程继续处理命令请求。在这期间,服务器进程会将改变数据库状态的命令放到 AOF 重写缓冲区中。待接收到子进程的 AOF 文件重写完成信号后,将 AOF 重写缓冲区中的命令追加到新的 AOF 文件中,只有这一过程服务器处于阻塞状态。最后,用新的 AOF 文件替换掉旧的 AOF 文件。

提示

有一点不明,AOF 重写缓冲区中的命令要是出现了冗余命令呢?

Early Access