1 为什么需要持久化:
- Data persistence enables recovery in the event of memory loss or other catastrophic failure.
2 持久化的类型:
- RDB (Redis Database):Snapshots are copies of the in-memory database,
- AOF(Append-Only File):records write operations made to the database
3 RDB
- 在指定的时间间隔,执行数据集的时间点快照。
- 快照文件就称为RDB文件(dump.rdb)
- 配置文件:
// redis.conf
# Save the DB to disk.
# 每X秒或者Y次改写后,就自动存储RDB
# save <seconds> <changes> [<seconds> <changes> ...]
#
# Redis will save the DB if the given number of seconds elapsed and it
# surpassed the given number of write operations against the DB.
- 手动触发
- save - 会阻塞主线程,不建议使用
- bgsave - non blocking
3.1 RDB 优势
- 适合大规模的数据恢复
- 按照业务定时备份
- 对数据完整性和一致性要求不高
- RDB文件在内存中的加载速度要比AOF快很多
3.2 RDB 劣势
- 在一定间隔时间做一次备份,所以如果redis意外down掉的话,就会丢失从当前至最近一次快照期间的数据,快照之间的数据会丢失
- 内存数据的全量同步,如果数据量太大会导致IO严重影响服务器性能
- RDB依赖于主进程的fork,在更大的数据集中,这可能会导致服务请求的瞬间延迟。fork的时候内存中的数据被克隆了一份,大致2倍的膨胀性,需要考虑
4 AOF
4.1如何开启
// redis.conf
appendonly yes
appendfsync everysec
appenddirname "appendonlydir"
appendfilename "appendonly.aof"
4.2 aof 同步策略
- Client作为命令的来源,会有多个源头以及源源不断的请求命令。
- 在这些命令到达Redis Server 以后并不是直接写入AOF文件,会将其这些命令先放入AOF缓存中进行保存。
- 这里的AOF缓冲区实际上是内存中的一片区域,存在的目的是当这些命令达到一定量以后再写入磁盘,避免频繁的磁盘IO操作。
- AOF缓冲会根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件。
- 随着写入AOF内容的增加为避免文件膨胀,会根据规则进行命令的合并(又称AOF重写),从而起到AOF文件压缩的目的。
- 当Redis Server服务器重启的时候会队AOF文件载入数据。
4.3 三种同步策略
- always:同步写回,每个写命令执行完立刻同步地将日志写会磁盘
- everysec:每秒写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔1秒把缓冲区中的内容写入到磁盘
- no:操作系统控制的写回,每个写命令执行完,只是先把日志写到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
4.4 AOF 文件
- before redis 7.0 aof文件只有一个
- after redis 7.0 - multi part aof
MP-AOF实现 方案概述 顾名思义,MP-AOF就是将原来的单个AOF文件拆分成多个AOF文件。在MP-AOF中,我们将AOF分为三种类型, 分别为:
- BASE: 表示基础AOF,它一般由子进程通过重写产生,该文件最多只有一个。
- INCR:表示增量AOF,它一般会在AOFRW开始执行时被创建,该文件可能存在多个。
- HISTORY:表示历史AOF,它由BASE和INCR AOF变化而来,每次AOFRW成功完成时,本次AOFRW之前对应的BASE和INCR AOF都将变为HISTORY,HISTORY类型的AOF会被Redis自动删除。
4.4 优缺点
优点
- 更好的保护数据不丢失、性能高、可做紧急恢复
- 当AOF 变得太大时,Redis 能够在后台自动重写AOF
缺点 - 相同数据集的数据而言AOF文件要远大于RDB文件
- AOF运行效率要慢于RDB,每秒同步策略效率较好,不同步效率和RDB相同
5 RDB 和 AOF 混合持久化
- 开启aof
aof-use-rdb-preamble yes
- RDB镜像做全量持久化,AOF做增量持久化 先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录
- 重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能