AOF持久化
RDB快照功能可能造成数据丢失,如: 在 50秒内发生了5000次修改,然后服务器宕机了,刚刚执行的5000次修改数据就会丢失。
从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方 式: AOF 持久化,将修改的每一条指令记录进文件appendonly.aof中 你可以通过修改配置文件来打开 AOF 功能:
# appendonly yes
从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文 件的末尾。
这样的话, 当 Redis 重新启动时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目 的。你可以配置 Redis 多久才将数据 fsync 到磁盘一次。
有三个选项:
- appendfsync always:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非 常安全。
- appendfsync everysec:每秒 fsync 一次,足够快(和使用 RDB 持久化差不多),并且在 故障时只会丢失 1 秒钟的数据。
- appendfsync no:从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择。 推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。
建议使用第二种策略
AOF重写
AOF重写是针对AOF文件中没用的指令进行优化重写
如: 执行incr readcount 连续5次,如果不进行重写,恢复数据时,这条指令也会被执行5次。
进行重写后AOF文件里会变成
*3 是指有三个参数(set , readcount , 5)
$3 指set 的长度为3
$9 指readcount的长度为9
$1 指5的长度为1
合起来的命令就是 set readcount 5.
如下两个配置可以控制AOF自动重写频率
# auto-aof-rewrite-min-size 64mb //aof文件至少要达到64M才会自动重写,文件太小恢复速度本 来就很快,重写的意义不大 .
# auto-aof-rewrite-percentage 100 //aof文件自上一次重写后文件大小增长了100%则再次触发重写
当然AOF还可以手动重写,进入redis客户端执行命令bgrewriteaof
重写AOF 注意,AOF重写redis会fork出一个子进程去做,不会对redis正常命令处理有太多影响