Fork me on GitHub

redis持久化方式

Redis持久化

RDB快照

redis内存数据库快照保存到dump.rdb二进制文件中。
image-20220701070640391

RDB快照文件体积小,因为进行过压缩,是一个二进制文件,且RDB文件直接恢复即可,恢复速度很快。

在redis.conf配置文件中有关于rdb持久化方式的频率策略:
image-20220701070655378

这里比如 save 60 10000代表的是60s内至少有10000个键被改动时,会自动生成并保存一个RDB快照文件。

可以手动执行RDB快照文件的生成,执行save命令或者bgsave命令即可。

save和bgsave命令

简单来说,save是主线程去写RDB内存快照文件的,而bgsave是fork一个子进程,用子进程去写RDB快照文件,不阻塞主线程去执行客户端发来的命令。(当然bgsave fork子进程的时候是阻塞的)。redis在触发生成RDB时是bgsave的方式。

image-20220701070713216

bgsave的写时复制机制

bgsave是利用COW(copy on write)这个机制来fork一个子进程去执行生成RDB持久化文件,redis本身还可以继续执行命令。子进程运行之后,会读取redis进程的内存数据,写入RDB文件。这时如果主线程还执行写数据命令,那么也会对修改的数据复制一份副本,bgsave子进程会将这个副本数据写入RDB文件。

RDB缺点

  • 虽然恢复速度很快,但是生成快照文件间隔之间redis挂了,那么这时没持久化到RDB文件的数据就会丢失。也就是RDB快照可能丢数据。

AOF持久化 (append only file)

AOF持久化机制,将修改的每一条指令记录进文件appendonly.aof中(先写入到buffer,再定时去fsync刷入磁盘)。当数据恢复时,会按照AOF文件中的写数据命令执行,来重建数据。

image-20220701070730233

这种AOF文件因为存放原生写命令,所以文件会比较大,且恢复时要执行Redis写命令,所以恢复速度比较慢。(相对于RDB快照恢复)当然,这种持久化方式数据安全性更高,因为可以设置fsync的频率,默认是每秒去将aof文件fsync到磁盘中,数据安全性比RDB更高。

AOF重写

AOF文件中可能有比较多的没用指令,比如自增五次,那么可以重写为set key 5即可,redis会定期根据内存最新数据进行aof重写,来压缩下AOF文件。

AOF重写是和bgsave类似,是fork一个子进程去执行AOF文件的重写,不会阻塞其他客户端请求redis。

RDB和AOF的比较

image-20220701070739316

Redis4.0之后的混合持久化方式

Redis 4.0之后提供了混合持久化方式。

1
2
-- 开启redis 混合持久化方式
# aof‐use‐rdb‐preamble yes

如果开启了混合持久化,那AOF在重写的时候,不再单纯去压缩无用的命令,会对此刻内存做RDB快照处理,并将此过程中新的写的命令追加到AOF文件,来生成新的AOF文件,覆盖原来的AOF文件。

image-20220701070749167

这样redis在恢复时,可以先根据RDB快照文件去恢复(速度快、体积小),然后再重放后面增量的写命令(数据安全),效率和安全都得到了保障。

-------------本文结束感谢您的阅读-------------

本文标题:redis持久化方式

文章作者:夸克

发布时间:2021年07月01日 - 07:07

最后更新:2022年07月01日 - 07:07

原始链接:https://zhanglijun1217.github.io/2021/07/01/redis持久化方式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。