Redis | Redis 持久化机制

一、简介

在指定的时间间隔内,将内存中的数据集快照写入磁盘,恢复时是将快照文件写入内存。持久化的类型有 3 种,分别是 RDB 持久化(默认),AOF 持久化,还有就是两种混合持久化。

二、原理

1、RDB 持久化

在默认的 RDB 模式中,Redis 会单独 fork 一个与当前进程一模一样的子进程来进行持久化,这个子进程的所有数据(变量,环境变量,程序程序计数器等)都和原进程一模一样,会先将数据写入到一个临时文件中,待持久化结束了,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何的 IO 操作,这就确保了极高的性能.

2、AOP 持久化

原理是将 Reids 的操作日志以追加的方式写入文件,不记录读操作,默认不开启。

3、混合持久化

混合持久化是通过 BGREWRITEAOF 完成的,从 Redis 2.4 开始, AOF 重写由 Redis 自行触发。当开启混合持久化时,fork 出的进程先将全量共享内存副本以 RDB 的方式写入 AOF 文件然后再将缓冲区的增量命令以 AOF 方式写入文件,写入完成后将含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的 AOF 文件。所以,新的 AOF 文件前半段是 RDB 格式的全量数据,后半段是 AOF 格式的增量数据。

混合持久化结合了RDB持久化 和 AOF 持久化的优点, 由于绝大部分都是RDB格式,加载速度快,同时结合AOF,增量的数据以AOF方式保存了,数据更少的丢失。

三、触发机制

1、RDB 持久化
  • shutdown, 执行shutdown命令时,会在启动Redis服务的文件夹下生成dump文件。
  • save,save是只管保存,其他不管,全部阻塞。
  • bgsave,redis会在后台异步进行快照操作,同时可以响应客户端的请求。
  • 配置文件进行配置,配置参数如下:

save 900 1
save 300 10
save 60 10000

这里表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

2、AOF 持久化

开启 AOF 模式需要修改配置文件 redis.config 参数如下

appendonly yes

持久化机制的配置如下

# appendfsync always
appendfsync everysec
# appendfsync no

always 表示等操作系统进行数据缓存同步到磁盘(快,持久化没保证)
everysec 同步持久化,每次发生数据变更时,立即记录到磁盘(慢,安全)
no 表示每秒同步一次(默认值,很快,但可能会丢失一秒以内的数据)

其余配置项如下:

auto-aof-rewrite-percentage 100

当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写 。当AOF文件大小的增长率大于该配置项时自动开启重写。

auto-aof-rewrite-min-size 64mb

当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写 。当AOF文件大小大于该配置项时自动开启重写。

3、混合持久化

修改配置文件

aof-use-rdb-preamble yes

4.0版本的混合持久化默认关闭的,通过aof-use-rdb-preamble配置参数控制,yes则表示开启,no表示禁用,5.0之后默认开启。

四、小结

相对于两种持久化方式,aof 数据丢失少,性能慢 不适合大量数据导入,rdb 丢失数据多 性能高 适合大量数据导入。在进行优化时,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小,可以设到5G以上。RDB文件只用作后备用途,只要15分钟备份一次就够了,只保留save 900 1这条规则。

ABOUT

我的 Github:Github
CSDN: CSDN
个人网站: sirius blog
E-mail: [email protected]

推荐阅读
史上最全,最完美的 JAVA 技术体系思维导图总结,没有之一!
全站导航 | 我为什么要写这些博客?

发布了81 篇原创文章 · 获赞 373 · 访问量 27万+

猜你喜欢

转载自blog.csdn.net/Sirius_hly/article/details/104683407