redis持久化两种方式:RDB和AOF。默认开启的是RDB。
RDB是快照形式,是把内存的当前状态直接保存在RDB中,保存策略是隔一段时间保存一下。
AOF是命令行形式,执行一条命令,直接把命令存到一个aof文件中,保存策略默认一秒钟保存一下命令,安全性也好,性能差些。
RDB
刷到磁盘三种策略:
- save命令(手动):同步;在Redis主线程中工作,因此会阻塞其他请求操作,应该避免使用。
- bgsave命令(手动):异步;调用Fork,产生子进程,父进程继续处理请求。子进程将数据写入临时文件,并在写完后,替换原有的.rdb文件。Fork发生时,父子进程内存共享,所以为了不影响子进程做数据快照,在这期间修改的数据,将会被复制一份,而不进共享内存。所以说,RDB所持久化的数据,是Fork发生时的数据。
- 配置文件(自动):实际上它和bgsave命令持久化原理是相同的。
RDB过期键的处理:
- RDB生成时,过期键会被过滤
- RDB载入时,以主服务器运行,则过滤过期键;以从服务器运行,则忽略过期键,不做处理
AOF
配置文件中打开AOF:
appendonly yes
刷到磁盘三种策略:
- appendfsnyc always:不丢失数据;IO开销大,一般SATA磁盘只有几百TPS
- appendfsnyc everysec:每秒进行与fsync,最多丢失1秒数据;可能丢失1秒数据
- appendfsnyc no:不用管;不可控
RDB过期键的处理:
- AOF生成时,如果过期键还没被删除,则忽略,当被删除以后,会追加记录一条DEL命令
- AOF载入时,过期键会被过滤
参考
https://segmentfault.com/a/1190000016021217