🍉持久化是个啥?
我们都知道电脑中的内存一般指的是 DRAM,属于易失性存储器,里面的电容是会漏电的,需要通电来定期刷新,当断电以后内存中的数据会慢慢消失。
以速度著称的 redis 就是工作在内存中的,它的数据都保存在内存当中,一旦断电或者宕机,所有的数据都会丢失,因此将内存中的数据写入硬盘中进行备份是十分必要的,我们将备份数据到硬盘中的操作叫做数据的持久化。
redis 为我们提供了两种数据的持久化方式:RDB(Redis DataBase)和 AOF(Append Only File)。
🥝持久化策略 - RDB
按照官方的解释,RDB 策略指的是 redis 在指定的时间间隔内将内存中的数据集快照 (数据备份)写入磁盘, 恢复时是将快照文件直接读到内存里。
在 RDB 持久化方式下,数据的备份并不会影响 redis 的 I/O 操作,redis 会单独创建一个子进程专门进行数据的备份操作,它会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。这样做的好处是保证了极高的性能,但是会存在备份数据不完整的问题,比如最后一次持久化进行的时候突然宕机了,那么会丢失一部分数据。
🏄♂️如何开启 RDB 呢?
RDB 是 redis 默认的持久化方式,在配置文件 redis.conf
中可以对其进行设置。
- 配置备份文件的名称,默认为
dump.rdb
:
- 修改 RDB 文件的保存路径,默认为 redis 启动命令所在的目录:
- 设置生成 RDB 快照 的触发方式,
save 30 10
表示在 30 秒内如果有 10 次改动就备份:
save 后面给空值,表示禁用保存策略。
除了配置触发策略让 redis 自动生成 RDB 文件,我们也可以使用命令手动备份:
save
:进行备份,只管保存,会阻塞 redis 的其他操作,一般不建议使用。bgsave
:让 redis 在后台异步进行快照操作,快照同时还可以响应客户端请求。lastsave
:获取最后一次成功执行快照的时间。
🏄♂️触发 RDB 机制的三种情况:
- save 的规则满足的情况下,会自动生成
.rdb
文件。 - 执行
flushall
命令,会自动生成.rdb
文件,但里面是空的,没有意义。 - 退出 redis 时也会产生
.rdb
文件。
🏄♂️如何从备份文件中恢复?
只需要将 .rdb
文件放在 redis 的启动目录,redis 启动的时候会自动检查 dump.rdb
来恢复其中的数据。
🏄♂️优点 & 缺点:
- 适合大规模的数据恢复。
- 对数据的完整性要求不高,备份需要一定的时间,最后一次备份如果宕机会丢失数据。
- 创建(fork)子进程会占用一定的内存空间。
- 恢复速度快,节省磁盘空间。
🍌持久化策略 - AOF
AOF 全称 Append Only File,以日志的形式记录 redis 中的每个写操作,将 redis 所有执行过的写命令记录在备份文件中,redis 启动之初会读取该文件来重新构建数据,其实就是把之前执行过的所有命令再执行一遍来完成数据的恢复工作。
之所以叫 Append Only File,是因为日志文件只许追加备份的指令,而不能改写该文件。
🏄♀️AOF 持久化流程:
- 客户端的请求写命令会被追加到 AOF 缓冲区内;
- AOF 缓冲区根据 AOF 持久化策略
[always, everysec, no]
将操作同步到磁盘的AOF文件中; - AOF 文件大小超过重写策略或手动重写时,会对 AOF 文件重写,压缩 AOF 文件容量;
- redis 服务重启时,会重新加载 AOF 文件中的写操作达到数据恢复的目的;
🏄♀️有关 AOF 的配置:
在 redis.conf
文件中可以修改有关 AOF 的配置:
- 将
appendonly no
中的 no 改为 yes 即为开启 AOF 持久化策略。 appendfilename "appendonly.aof"
可以配置备份文件的名称。
- 关于 AOF 同步频率的设置:
appendfsync always
,始终同步,每次 redis 的写入都会立刻记入日志,性能较差但数据完整性比较好。appendfsync everysec
,每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失。appendfsync no
,redis 不主动进行同步,把同步时机交给操作系统。
🏄♀️如何从备份文件中恢复数据呢?
AOF 的备份机制和性能虽然和 RDB 不同, 但是备份和恢复的操作同 RDB 一样,都是在需要恢复时将 .aof
文件放到 redis 工作目录下,启动系统即加载,redis 会自动完成数据的恢复。
如果同时开启了 AOF 和 RDB,redis 默认取 AOF 的数据进行恢复。
🏄♀️优点 & 缺点:
- 备份机制更稳健,丢失数据概率低,数据完整度高。
.aof
文件可读,可以手动修改.aof
文件来处理误操作。- 比起 RDB 会占用更多的磁盘空间,恢复速度慢。
- 每次读写都要同步的话会影响 redis 的性能。
🚀redis 系列专栏:Redis 快速入门
❤整理不易❤ 还请各位读者老爷们三连支持一下╰( ̄ω ̄o)