当前位置: 首页 > 后端技术 > Java

彻底读懂Redis持久化的一篇文章:为什么RDB和AOF

时间:2023-04-01 22:12:46 Java

需要持久化?Redis对数据的操作是基于内存的。当遇到进程退出、服务器宕机等突发情况时,如果没有持久化机制,Redis中的数据就会丢失,无法恢复。通过持久化机制,Redis可以在下次重启时使用之前持久化的文件进行数据恢复。了解和掌握Redis的持久化机制,对Redis的日常开发和运维有很大的帮助,也是大厂面试中经常被问到的一个知识点。Redis支持的两种持久化机制:RDB:生成当前数据的快照,保存在硬盘上。AOF:将对数据的每一次操作都记录到硬盘上。接下来,让我们仔细看看这两种持久化机制。RDB持久化RDB(RedisDataBase)持久化是将当前Redis中的所有数据生成一个快照,保存在硬盘上。RDB持久化可以手动或自动触发。save和bgsave命令都可以手动触发RDB持久化。save命令执行save命令会手动触发RDB持久化,但是save命令会阻塞Redis服务,直到RDB持久化完成。当Redis服务存储大量数据时,会造成长时间阻塞,不推荐使用。>执行saveOK后,Redis日志记录:*DBsavedondiskbgsavecommand执行bgsave命令也会手动触发RDB持久化。与save命令不同,Redis服务一般不会阻塞。Redis进程会执行fork操作创建子进程,RDB持久化由子进程负责,不会阻塞Redis服务进程。Redis服务的阻塞只发生在fork阶段,一般时间很短。>执行bgsaveBackgroundsavingstarted后,Redis日志记录:*Backgroundsavingstartedbypid2645*DBsavedondisk*RDB:0MBofmemoryusedbycopy-on-write*Backgroundsavingterminatedwithsuccess具体过程bgsave命令如下图:执行bgsave命令,Redis进程首先判断是否有当前正在执行的RDB或AOF子线程,如果存在则直接结束。Redis进程执行fork操作创建子线程,在fork操作过程中Redis进程会被阻塞。Redis进程fork完成后,bgsave命令结束。从此Redis进程不会被阻塞,可以响应其他命令。子进程根据Redis进程的内存生成快照文件,替换原来的RDB文件。子进程通过信号量通知Redis进程自己完成了。自动触发Redis除了可以通过执行上述命令手动触发外,还可以自动触发RDB持久化。自动触发的RDB持久化采用bgsave的方式来减少Redis进程的阻塞。那么,在什么场景下会自动触发呢?在配置文件中设置了save的相关配置,如savamn,表示当m秒内数据被修改n次时,自动触发bgsave操作。当从节点进行全量复制时,主节点会自动执行bgsave操作,将生成的RDB文件发送给从节点。当执行debugreload命令时,也会自动触发bgsave操作。执行shutdown命令时,如果没有开启AOF持久化,会自动触发bgsave操作。RDB的优点RDB文件是一个紧凑的二进制压缩文件,它是所有Redis数据在某个时间点的快照。因此使用RDB进行数据恢复的速度要比AOF快很多,非常适合备份、全量复制、容灾等场景。RDB的缺点每次执行bgsave操作,都要频繁执行fork操作创建child,属于重量级操作,频繁执行成本太高,无法实时持久化或秒级持久化取得成就。另外,由于Redis版本的不断迭代,存在不同格式的RDB版本,可能存在低版本的RDB格式无法兼容高版本的RDB文件的问题。AOFPersistenceAOF(AppendOnlyFile)持久化就是将每条写入命令追加到日志中,需要恢复数据时重新执行AOF文件中的命令。AOF解决了数据持久化的实时性,也是目前Redis主流的持久化方式。AOF持久化过程AOF过程如下:命令追加(append):所有写命令都会追加到AOF缓冲区(aof_buf)。文件同步(sync):根据不同的策略将AOF缓存区同步到AOF文件中。文件重写(rewrite):周期性地重写AOF文件,以达到压缩的目的。数据加载(load):当需要恢复数据时,重新执行AOF文件中的命令。文件同步策略AOF持久化过程中的文件同步有以下几种策略:always:每次写入缓存区都必须同步到AOF文件中。硬盘的运行比较慢,限制了Redis的高并发,所以不建议配置。no:每次写入缓存区后不进行同步。同步到AOF文件的操作由操作系统来处理。AOF文件每次同步的周期不可控,增加了每次同步的硬盘数据量。eversec:每次写入缓存后,每秒都有一个专用线程同步,兼顾性能和数据安全。是推荐的同步策略,也是默认策略。触发文件改写AOF持久化过程中的文件改写可以手动触发也可以自动触发。手动触发:使用bgrewriteaof命令。自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage的配置决定自动触发的时机。auto-aof-rewrite-min-size表示运行AOFrewrite时的最小文件大小,默认为64MB;auto-aof-rewrite-percentage表示当前AOF文件大小与上次rewrite后AOF文件大小的最小比例,默认为100。只有同时超过前两项才会自动触发文件重写。AOF持久化配置了解了AOF持久化的具体过程之后,我们来看看如何配置AOF。默认不开启AOF持久化,需要修改配置文件,如:#appendonly为yes,开启AOFappendonlyyes#AOF文件名appendfilename"appendonly.aof"#AOF文件写入方式#everysec每秒都会写入方式appendfsynceverysec默认启用将缓存区的内容写入文件#运行AOF时AOF文件大小增长率的最小值rewriteauto-aof-rewrite-percentage100#文件大小的最小值当运行AOFrewriteauto-aof-rewrite-min-size64mb