Hi,大家好,我是Mic
一个工作了5年的粉丝私信我。他说他在简历里面写精通Redis,
结果面试官一直围绕Redis来问,后来越问越深,面试官后面回了一句话:“也没有想象中那么深嘛”
今天给大家分享一道年薪50W的面试题,“请描述一下Redis里面AOF的重写过程”
下面看看普通人和高手对这个问题的回答
需要高手面试文档(附赠阿里内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以后台私信【Mic】或者评论区留言。
AOF的重写过程,我记得好像是说AOF它的 就是Redis为了避免AOF文件过大去做重写。
重写过程就是应该是说把原来那个文件压缩吧,具体的细节这块我没有去看 嗯。。。。
好的。
AOF是Redis里面的一种数据持久化方式,它采用了指令追加的方式。
近乎实时的去实现数据指令的持久化,因为AOF,会把每个数据更改的操作指令,追加存储到aof文件里面。
所以很容易导致AOF文件出现过大,造成IO性能问题。

Redis为了解决这个问题,设计了AOF重写机制,也就是说把AOF文件里面相同的指令进行压缩,只保留最新的数据指令。
简单来说,如果aof文件里面存储了某个key的多次变更记录,但是实际上,最终在做数据恢复的时候,只需要执行最新的指令操作就行了,历史的数据就没必要存在这个文件里面占空间。

AOF文件重写的具体过程分为几步:
首先,根据当前Redis内存里面的数据,重新构建一个新的AOF文件
然后,读取当前Redis里面的数据,写入到新的AOF文件里面
最后,重写完成以后,用新的AOF文件覆盖现有的AOF文件
另外,因为AOF在重写的过程中需要读取当前内存里面所有的键值数据,再生成对应的一条指令进行保存。
而这个过程是比较耗时的,对业务会产生影响。
所以Redis把重写的过程放在一个后台子进程里面来完成,
这样一来,子进程在做重写的时候,主进程依然可以继续处理客户端请求。
最后,为了避免子进程在重写过程中,主进程的数据发生变化,
导致AOF文件和Redis内存中的数据不一致的问题,Redis还做了一层优化。
就是子进程在重写的过程中,主进程的数据变更需要追加到AOF重写缓冲区里面。
等到AOF文件重写完成以后,再把AOF重写缓冲区里面的内容追加到新的AOF文件里面。
以上就是我对这个问题的理解。
这个问题背后涉及到的技术知识还是很有意思的。
在实现数据持久化和重写的过程中,如何避免对客户端产生影响,
还需要保证数据的一致性,从这些大神的解决思路中可以学到很多有价值的思想。
喜欢我的作品的朋友,记得点赞收藏加关注
需要高手面试文档(附赠大厂内部十万字面试文档)或者有不懂的技术面试题想咨询的小伙伴可以扫描下方二维码
↓↓↓↓↓↓↓↓↓↓↓↓↓↓