AOF 持久化的相关命令有哪些?
BGREWRITEAOF:开始执行 AOF 后台重写。
AOF 持久化是如何实现的?
答:需要在配置文件中开启 AOF 持久化功能。当 AOF 持久化功能打开之后,服务器会将每一条写命令以一种协议格式追加到服务器状态的aof_buf
缓冲区的末尾。在整个事件循环结束前(Redis服务器进程就是一个事件循环),会调用函数flushAppendOnlyFile()
,考虑是否将aof_buf
缓冲区中的内容写入和同步到 AOF 文件里面。具体行为由配置文件中的 appendfsync 选项的值决定。
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 重写缓冲区中的命令要是出现了冗余命令呢?