AOF持久化
redis支持两种持久化方案,一种是RDB,RDB直接保存的是数据。另一种是AOF方案,保存下来的是用户的操作过程,可以简单理解为把用户对数据库操作的命令保存下来了,通过回放,可以恢复数据的一种持久化方案。
正常AOF逻辑
为了满足效率要求,主进程对用户的每一次请求,会把请求写到AOF的缓冲区,然后再按一定的策略把AOF缓冲区的用户操作刷新的AOF磁盘文件中。
AOF日志膨胀问题
正常来说,如果只是记录用户的操作命令,那么AOF文件将会一直膨胀,而且对于同一个数据来说,会记录非常多的冗余信息。例如一个list,可能增加节点10000次,删除节点9999次,最后剩下一个节点的情况下,那如果正常来说使用AOF,则需要记录19999条数据。这种情况下,有效信息是非常少,绝大部分成了冗余信息。
膨胀问题解决方案
redis采用一种叫AOF重写机制,直接根据数据中存在什么来记录日志。例如当前只有一条数据,AOF不会关注之前使用了多少条命令,直接就保存下这一条数据需要的命令即可。这样即可大量减少冗余信息,达到精简数据的目的
AOF重写方案
假如你作为redis的AOF重写机制的设计者,如何设计重写逻辑。
方案1:正常来说,主进程中直接阻塞,把当前的内存数据保存好,生成新的AOF重写文件,再把AOF文件进行原子替换即可。
存在问题:这个方案可以满足需求,但性能极差