AOF的持久化
AOF日志:每执行一条写操作,以追加的方式写入到一个文件中,然后重启redis的时候,先去读取这个文件里的命令,并且执行它;注意只会记录写操作命令,读操作命令是不会被记录的
只记录写命令的好处:
- 避免额外的检查开销
- 不会阻塞当前写操作命令的执行
redis写入aof日志的过程:
三种写回aof策略,也就是上图中的第三步系统调用的过程
- always:写操作执行完,同步将aof日志写入磁盘
- everysec:写操作执行完,将命令写入aof文件的内核缓存区,然后每隔一秒将缓冲区内容写回磁盘
- no:不由redis控制写回磁盘的时机,交给操作系统决定
AOF的重写机制
为了避免aof文件越写越大,提供了aof重写机制
在重写时,读取当前数据库中的所有键值对,将每一条键值对用命令记录到新的aof文件中,等所有记录完后,将新的aof文件替换掉现有的aof文件,其实就是减少反复修改的记录。
redis的重写aof过程是由后台子程序bgrewriteaof来完成,
AOF太大
因为aof会按一定频率(no,always,every seconds)写入到日志文件中 ,随着aof文件越来越大,里面会有大部分是重复命令或者可以合并的命令,我们需要对aof日志进行重写,减少aof日志的尺寸。
redis-cli BGREWRITEAOF
从以下方面对减少aof日志
- 过期的数据不写入
- 重复设置的不写入,删除的不写入
- 可以合并的进行合并,比如sadd
在重写的过程中,并不会对之前的aof文件进行任意的读取,写入,分析等,这个功能是通过读取服务器当前数据库状态来实现的
RDB快照
rdb快照记录某一瞬间的内存数据
redis提供两个命令来生成rdb文件,save和bgsave,
- save,会在主线程里生成rdb文件,由于和执行操作命令在同一个线程,写入时间长会阻塞主线程
- bgsave:创建子进程来生成rdb文件,避免主线程的阻塞
redis的快照是全量快照,也就是每次执行快照,就是把内存中的所有数据记录到磁盘中
大key对日志的影响
aof和rdb过程中,都会fork一个子进程,其中负责一份页表给子进程指向同一个内存空间,当页表很大,fork就会发生阻塞。
当父进程或者子进程向内存发起写操作,cpu触发写保护中断,将进程权限设置为可读写,然后进行写操作,这个过程称为写时复制。会将物理内存复制一份,进行修改,如果key较大,复制过程就会阻塞。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。