Redis持久化是什么?
Redis是内存数据库,宕机以后内存数据会全部丢失,当Redis数据用作DB时,为了保证数据完整性,需要一个完整的数据文件,在系统重新启动时,从这个数据文件中将数据加载进Redis中,从而保证数据完整性。
Redis如何进行持久化?
官方文档上Redis对持久化存储的支持明确的就只有两种方案:RDB和AOF。
RDBRBD(Redis DataBase)
指定的时间间隔,记录数据集的时间点快照。
实现方式:
在指定的时间间隔内将内存中的数据集快照(Snapshot)写入磁盘(dump.rdb文件),恢复时,再将硬盘的快照文件直接读回内存中。
触发条件:
可以手动触发和自动触发
自动触发:
redis.conf文件中配置,save seconds changes
多少秒内数据变了多少则执行Save,可以配置多个条件,满足其中一个条件就会触发生成快照dump.rdb文件。
手动触发:
Redis提供2个命令生成RDB文件,分别是save和bgsave。
save:会阻塞当前Redis服务器,直到持久化完成,redis不能处理其他命令。
bgsave:后台异步进行快照操作,不阻塞客户端请求,会fork一个子进程,由子进程进行持久化。
bgsave执行流程:
- 客户端接收或自动触发bgsave命令
- 主进程判断是否存在正在执行的子进程,存在直接返回
- 不存在子进程, 则fork一个新的子进程持久化数据,fork命令执行时是阻塞的,fork完成后,主线程可以执行其他操作
- 子进程将数据写入临时rdb文件
- 快照数据写入完成,替换旧的rdb文件
- 子进程发送信号给主线程,通知rdb持久化完成,主进程更新相关的统计信息
bgsave数据一致性问题:
主线程fork出一个子线程后(fork时间点),在子线程执行数据写入rdb文件的时候,父线程接收到了数据修改命令(修改时间点),修改了数据后,子线程持久化到了这个key,那么子线程持久化的数据是fork时间点还是持久化时间点?
-- 答案是fork时间点。RDB中的核心思路是Copy-on-Write,来保证在进行快照操作的这段时间,需要压缩写入磁盘上的数据在内存中不会发生变化。在进行bgsave时,主线程在收到修改命令时,将原数据复制一份副本,fork线程持久化的是副本数据,这样保证了持久化数据都是同一个时间点。
RDB优缺点:
优点:
- RDB文件是某个时间节点的快照,默认使用LZF算法进行压缩,压缩后的文件体积小
- fork子进程进行持久化,父进程不需要IO操作,性能高
- 直接加载数据,数据恢复快
缺点:
- 最近一次持久化后的数据可能会丢失
总结:不适合实时持久化,适合备份、全量复制等场景。
AOF(APPEND ONLY FILE)
以日志的形式来记录每个写操作(先写内存,后写日志)
Redis将执行过的所有命令都记录下来(写操作)追加到文件中(appendonly.aof文件),当Redis重启时,根据日志文件的内容将写操作重新执行一次,从而完成数据恢复。
配置方式:redis.conf文件中 appendonly yes
执行流程:
- 客户端接收到命令,将数据写入内存
- 将命令写入aof文件缓区
- 根据缓存区三种刷盘策略将命令写入磁盘AOF文件
- AOF重写,避免文件膨胀
- 重启时,从AOF加载数据
三种刷盘策略
| 配置项 | 刷盘时机 | 优点 | 缺点 |
|---|---|---|---|
| Always | 同步写回:每个写命令执行完,立马同步地将日志写回磁盘 | 可靠性高,数据基本不丢失 | 性能差 |
| Everysec | 每秒写回:每隔一秒把缓冲区中的内容写入磁盘 | 性能适中 | 可能丢失1秒数据 |
| No | 操作系统控制的写回:操作系统决定何时将缓冲区内容写回磁盘 | 性能高 | 宕机丢失较多数据 |
AOF优缺点:
优点:
- 数据安全性高
缺点:
- 影响性能
- 重启后数据恢复慢
RDB和AOF混合持久化方式(4.0版本)
混合持久化并不是一种全新的持久化方式,而是对已有方式的优化。混合持久化只发生于 AOF 重写过程。
AOF重写问题:
AOF文件会记录每个写命令,随着时间越来越长,AOF文件会变得越来越大。
使用了混合持久化,重写后的新 AOF 文件前半段是 RDB 格式的全量数据,后半段是 AOF 格式的增量数据。
这样不用很频繁地执行bgsave,这就避免了频繁 fork 对主线程的影响。而且,AOF 日志也只用记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现文件过大的情况了,也可以避免重写开销。
混合持久化中数据恢复流程
- redis重启时,如果开启了aof,那么就优先加载aof文件
- 若aof文件不存在,加载rdb文件
- 如果都不存在,redis直接启动成功
那么为什么会优先加载AOF呢?因为AOF保存的数据更完整。
总结
- RBD文件是一个快照,优点是文件体积小,数据恢复快,缺点易丢失数据。
- AOF文件是一个追加的文件,优点是数据不易丢失,缺点是文件体积大,影响性能
- 生产环境推荐使用混合持久化
最后
本文是Redis系列的第三篇,这个系列会系统全面的梳理Redis的知识体系,如果有遗漏或者错误,欢迎留言沟通交流。
如果你都看到这了,在文章左侧有个点赞按钮,点赞支持弥金吧。