redis 持久化策略主要包括两种:rdb(Redis DataBase),AOF(Append-only file)
以下是个人理解:
- rdb
在指定的时间间隔内将内存的数据集快照写入到磁盘,恢复时直接将文件读到内存
默认配置:
save 900 1 900 秒 1 个修改
save 300 10 300 秒 10 个修改
save 60 10000 60秒 10000个修改
优点:速度快,适合大规模的数据恢复,对数据完整性和一致性要求不高
缺点:最后一次保存时,数据丢失风险很大。需要经常 fork 子进程来保存数据集到硬盘上,当数据集很大时,那么十分耗时
- AOF
以日志形式来记录每个 写 操作,下次恢复时执行这个 写 文件。
有三种模式来写
# appendfsync always 一有写动作就追加
appendfsync everysec 间隔 1 秒就追加,默认
# appendfsync no 暂缓文件同步
#aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,
auto-aof-rewrite-min-size 64mb
#相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比
auto-aof-rewrite-percentage 100
优点:保持更高的数据完整性,如果设置追加的时间是 1s ,那么最多损失 1s 的数据。
缺点:AOF 文件很大时,恢复速度较慢。
AOF 有重写机制,采用文件追加方式,当 AOF 文件大小超过设定的阈值时,会启动 AOF 文件的内容压缩,只保留可以恢复数据的最小指令集。这时也是 fork 一个子进程来完成操作
- 两者比较
同时开启的话,那么会先加载 AOF 文件,当 AOF 文件有错误的时候,redis 不会启动。可以使用
redis-check-aof --fix appendonly.aof
来恢复 aof 文件,同理也可以恢复 rdb 文件