一、aof(append only file)
概念
aof日志存储的是Redis服务器的顺序指令序列,aof日志只记录对内存修改的指令记录。按照redis的协议存储,例如:命令set key val 存为*3\r\n$3\r\nset\r\n$3\r\nkey\r\n$3\r\nval\r\n
配置
配置如下:
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
aof-load-truncated yes
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble no
save ""
恢复
通过重放aof日志中指令序列来恢复Redis当前实例的内存数据结构的状态
缺点
1.随着时间越长,aof日志量越来越大 2.如果redis重启,重放整个aof日志会非常耗时,导致redis长时间无法对外提供服务
二、aof rewrite(aof复写)
概念
- aof rewrite在aof的基础上,满足一定策略则fork进程,根据当前内存状态,转换成一系列的redis命令, 序列化成一个新的aof日志文件中,序列化完毕后再将操作期间发送的增量aof日志追加到新的aof日志中,追加完毕后替换旧的aof日志文件,以此达到对aof日志瘦身的目的。
- 命令:BGREWRITEAOF
配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
save ""
流程图
恢复&缺点
与aof一致
三.rdb
概念
- 是一种快照持久化,它通过fork主进程,在子进程中将内存当中的数据键值对按照存储方式持久化到rdb文件中;rdb存储的是经过压缩的二进制数据;
- 命令:BGSAVE
配置
appendonly no
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 64mb
aof-use-rdb-preamble no
流程图
缺点
一旦redis宕机,redis将丢失一段时间的数据;RDB需要经常fork子进程来保存数据集到硬盘,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求,如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续1秒,AOF也需要fork,但是你可以调节重写日志文件的频率来提高数据集的耐久度。
四、混合持久化
概念
混合持久化是吸取rdb和aof两者优点的一种持久化方案;aofrewrite的时候实际持久化的内容是rdb,等持久化后,持久化期间修改的数据以aof的形式附加到文件的尾部,实际上是对aof rewrite的优化。
配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
save ""
流程
五、总结
- mysql缓存方案中,redis不开启持久化,redis只存储热点数据,数据的依据来源于mysql;若某些数据经常访问需要开启持久化,此时可以选择rdb持久化,此时可以选择rdb持久化方案,也就是允许丢失一段时间数据;
- 对数据可靠性要求高,在机器性能,内存也安全(fork写时复制 最差的情况下)的情况下,可以让redis同时开启aof和rdb,注意此时不是混合持久化;redis重启优先从aof加载数据(停服时使用shutdown save安全关闭,将内存重新生成一遍rdb,如果shutdown失败则使用aof重启redis),理论上aof包含更多最新数据;如果只开启一种,那么使用混合持久化;
|