随笔分类
对 Redis持久化的些许思考
# *AOF重写为什么不去复用 AOF本身的日志
- *AOF重写是主线程 Fork出一个子进程进行日志的重写,父子进程对同一个文件进行写操作势必会发生竞争,那么为了控制竞争必定会带来些开销,这会影响到主线程的性能
其次,任何文件系统都是不推荐去并发修改文件的,Redis也是这样,这也能够避免重写发生故障时对原有的 AOF文件造成污染;因此,Redis AOF重写一个新文件,这样的话就算是重写失败了,那直接删除就行了,这也不会影响到
# *AOF日志文件过大可能会带来哪些性能上问题:
- *a.文件系统本身对文件大小有限制,无法保存过大的文件
- b. 如果文件本身过大,在之后往文件中追加命令记录的话,效率也会变低
- c. 如果发生了宕机,AOF日志中记录的命令会被逐条执行,用于故障恢复,如果日志文件很大的话,整个恢复过程就会非常缓慢,这便会影响到 Redis的正常使用(因为这一步是由 Redis主线程去干的)
# *如何理解 RDB避免阻塞与正常处理数据的区别?
- *Redis默认配置 bgsave方式,让主线程 fork出的子进程去执行 RDB文件的生成操作,这是我们所说的 RDB避免阻塞
- 为了保证 RDB内存快照的完整性,我们希望在 t时刻获取的快照完完全全是 t时刻的数据,即不希望在 RDB文件生成期间,有数据发生了修改,因此如果没有别的机制进行处理的话,那么便会阻塞主线程的写操作,这会影响 Redis的性能 - 好在Redis引入了 "写时复制"