Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复。理解和掌握Redis的持久机制,对于Redis的日常开发和运维都有很大帮助,也是在大厂面试经常被问到的知识点。Redis支持的两种持久化机制:
接下来,我们详细了解一下这两种持久化机制。
RDB(Redis DataBase)持久化是把当前Redis中全部数据生成快照保存在硬盘上。RDB持久化可以手动触发,也可以自动触发。
save
和bgsave
命令都可以手动触发RDB持久化。
执行save
命令会手动触发RDB持久化,但是save
命令会阻塞Redis服务,直到RDB持久化完成。当Redis服务储存大量数据时,会造成较长时间的阻塞,不建议使用。
> save OK
执行后,Redis的日志中记录:
* DB saved on disk
执行bgsave
命令也会手动触发RDB持久化,和save
命令不同是:Redis服务一般不会阻塞。Redis进程会执行fork操作创建子进程,RDB持久化由子进程负责,不会阻塞Redis服务进程。Redis服务的阻塞只发生在fork阶段,一般情况时间很短。
> bgsave Background saving started
执行后,Redis的日志中记录:
* Background saving started by pid 2645 * DB saved on disk * RDB: 0 MB of memory used by copy-on-write * Background saving terminated with success
bgsave
命令的具体流程如下图:
bgsave
命令,Redis进程先判断当前是否存在正在执行的RDB或AOF子线程,如果存在就是直接结束。bgsave
命令就结束了,自此Redis进程不会被阻塞,可以响应其他命令。除了执行以上命令手动触发以外,Redis内部可以自动触发RDB持久化。自动触发的RDB持久化都是采用bgsave
的方式,减少Redis进程的阻塞。那么,在什么场景下会自动触发呢?
sava m n
,它表示在m秒内数据被修改过n次时,自动触发bgsave
操作。bgsave
操作,并且把生成的RDB文件发送给从节点。debug reload
命令时,也会自动触发bgsave
操作。shutdown
命令时,如果没有开启AOF持久化也会自动触发bgsave
操作。RDB文件是一个紧凑的二进制压缩文件,是Redis在某个时间点的全部数据快照。所以使用RDB恢复数据的速度远远比AOF的快,非常适合备份、全量复制、灾难恢复等场景。
每次进行bgsave
操作都要执行fork操作创建子经常,属于重量级操作,频繁执行成本过高,所以无法做到实时持久化,或者秒级持久化。
另外,由于Redis版本的不断迭代,存在不同格式的RDB版本,有可能出现低版本的RDB格式无法兼容高版本RDB文件的问题。
AOF(Append Only File)持久化是把每次写命令追加写入日志中,当需要恢复数据时重新执行AOF文件中的命令就可以了。AOF解决了数据持久化的实时性,也是目前主流的Redis持久化方式。
AOF流程如下图:
AOF持久化流程中的文件同步有以下几个策略:
AOF持久化流程中的文件重写可以手动触发,也可以自动触发。
bgrewriteaof
命令。对AOF持久化的具体流程有了了解后,我们来看一下如何配置AOF。AOF持久化默认是不开启的,需要修改配置文件,如:
# appendonly改为yes,开启AOF appendonly yes # AOF文件的名字 appendfilename "appendonly.aof" # AOF文件的写入方式 # everysec 每个一秒将缓存区内容写入文件 默认开启的写入方式 appendfsync everysec # 运行AOF重写时AOF文件大小的增长率的最小值 auto-aof-rewrite-percentage 100 # 运行AOF重写时文件大小的最小值 auto-aof-rewrite-min-size 64mb