radis 持久化之 AOF
2种方式
-
AOF (append only file) 指令日志
-
RDB 数据快照
AOF
写入时机
AOF 的写入是先执行指令,再记录日志
-
区别于 WAL : write ahead log:先记录日志,再执行写操作
-
因为 redis 没有单独的逻辑验证命令是否合法,先执行再记录日志,可以保证非法的命令不会被记录
-
而对于关系型数据库,比如 mysql ,在 server层 会有专门的分析器进行词法分析和语法分析
-
落盘时机
可配置项 appendfsync
-
Always 每个写命令执行后,立即将日志写入磁盘
-
Everysec 每秒写入磁盘
-
No 由操作系统决定何时将日志写入磁盘
AOF重写机制
为什么需要重写日志?
因为AOF文件过大,会存在以下问题:
-
文件系统无法支持大尺寸的文件
-
对大文件的写入操作效率低
-
当需要重放AOF时,过大的AOF文件会使恢复消耗更多的时间
为什么可以重写
因为操作记录存在冗余
-
在一段时间内,可能对一个key执行多次写操作,可以进行合并
-
在某个时间点后,某个key可能会过期,对于这个key之前的操作,可以丢弃
怎么重写
主进程 fork 一个子进程 bgrewriteaof,bgrewriteaof 进程得到主进程的内存拷贝
主线程继续处理到来的操作,并将写操作记录到旧的AOF
bgrewriteaof 新建一个 AOF,在后台执行重写任务,利用内存中数据的最新状态,直接生成相应的最新指令
重写完成之后,主进程才会切换到新的AOF, 保证不会丢失新的写操作。