Redis 持久化和aof
Redis 如何实现数据不丢失?
有三种方式实行持久化
- aof,将执行成功的写命令保存到aof文件中,如果aof文件过大会发生aof重写
- rdb,保存内存数据的快照
- 混合模式,同时使用aof和rdb,提高性能
为什么aof要先执行命令再保存命令
不用检查命令合法,不会阻塞当前写的命令
缺点:数据丢失,阻塞后续命令的执行
aof回写的方式有几种
三种策略
- always,每次执行完写命令之后就会将aof缓冲池的内容写入文件
- 优点:可靠性高
- 缺点:性能开销大
- everysec,每隔一秒将aof缓存池的内容写入文件
- 优点:性能适中
- 缺点:丢失1秒的数据
- no,将写入文件的时机交给操作系统
- 优点:性能好
- 缺点:可能丢失很多数据
AOF 日志过大,会触发什么机制?
会触发aof重写机制,aof重写创建一个子进程用来扫描数据库的内容,将内容保存到新的aof文件中,如果数据库新增数据,就会先这个数据保存到aof重写缓冲池中,子进程扫描结束之后就会发送信号给主进程,主进程会将aof重写缓冲池的内容追加到新的aof文件,将新文件改名覆盖旧文件。
为什么aof重写要开启子进程,为什么不是开启子线程
- 开启子进程不阻塞主进程的运行
- 子进程有父进程的内存副本,如果开启子线程,会涉及到加锁,解锁问题,会降低性能。如果父进程的内存发生变化,会拷贝一份到子进程,子进程也就没有加锁解锁问题了