详解Redis的持久化RDB和AOF

Redis的持久化是将内存中的数据同步到硬盘的过程

具体来说,Redis支持两种主要的持久化方式:RDBAOF

RDB(Redis Database)

简介

默认持久化方式

RDB会将内存中的数据快照保存到磁盘上的一个二进制文件中。这个文件包含了Redis在某个时间点上的所有数据,包括键值对及其过期时间等信息。

优缺点

RDB的优点在于文件紧凑、占用空间较小,且恢复数据速度快。

缺点是可能会丢失最后一次快照之后的所有数据,并且在数据恢复时需要加载整个文件,这可能会导致较长的恢复时间。

save 和 bgsve

RDB的触发分为手动触发和自动触发两种。手动触发可以通过执行SAVEBGSAVE命令来完成,而自动触发则是通过配置文件设置相关规则实现的。

在执行**SAVE**命令时,Redis会阻塞所有客户端命令,直到持久化过程完成。

而**BGSAVE**命令则通过创建子进程来进行持久化操作,这样主进程可以继续处理客户端请求。

使用场景

RDB持久化适用于能够容忍一定数据丢失的场景,比如非关键数据的备份,或者作为其他持久化策略(如AOF)的补充。由于RDB在某个时间点提供数据的快照,它恢复数据的速度比AOF更快。

性能

虽然RDB在持久化过程中会占用一些时间和资源,但是只有在触发持久化的时候才会发生性能开销,而在平时不会影响Redis的性能。

恢复

当系统崩溃后重启Redis时,RDB文件可以被用来恢复到最近一次持久化时的数据状态。由于RDB文件是压缩的二进制文件,其加载速度通常比较快。

AOF(Append Only File)

简介

AOF持久化是一种追加日志的方式,它会将Redis接收到的每个写命令追加到一个日志文件中。

这个日志文件以文本形式记录了Redis服务器所执行的所有写操作指令,如键的创建、更新和删除等。这种机制保证了即使在系统故障的情况下,只要AOF文件存在,就可以通过重新执行这些命令来恢复数据到最近的状态。

优缺点

AOF的优点在于数据更加完整和安全,因为每个写操作都被记录下来,而且可以按照不同的策略进行持久化,如每秒同步或每个写命令同步。

其缺点是文件较大,占用的磁盘空间比RDB要大,且恢复数据速度相对较慢,因为需要重新执行日志文件中的所有命令。

开启方式

要启用AOF持久化,需要在Redis配置文件redis.conf中将appendonly选项设置为yes。一旦开启,Redis会根据设定的写入策略将写命令同步到AOF文件。

常用策略

策略包括:

  • always:每个写操作后立即同步,提供最高的数据安全性,但性能影响最大。
  • everysec(默认):每秒同步一次,平衡了性能和数据安全性。
  • no:由操作系统决定何时同步,性能最好,数据安全性最低。

性能

AOF文件会随着时间不断增长,为了效率和性能,Redis还提供了AOF文件重写机制。重写过程会创建一个新的AOF文件,该文件记录了恢复当前数据集所需的最小写命令集。这个过程可以手动触发或根据配置文件中设置的规则自动进行。

与RDB相比,AOF提供了更好的数据安全性,因为它记录了每个写操作,从而在理论上可以实现对数据的逐条恢复。但是,这也意味着在相同的数据量下,AOF文件的大小通常会比RDB文件大,并且加载AOF文件以恢复数据的过程可能比RDB慢。

AOF的工作流程

Redis的AOF持久化工作流程涉及到命令的写入、缓冲、同步以及文件的重写等关键步骤

开启AOF :需要在Redis配置文件中将appendonly选项设置为yes以启用AOF持久化。AOF文件名默认为appendonly.aof,但可以通过appendfilename参数进行设置,而文件存储的目录可以通过dir参数配置。

命令写入AOF缓冲区:当客户端发送写操作时,这些操作首先会被追加到服务器端的AOF缓冲区(aof_buf)中。这样做可以在一定程度上提高性能,因为写操作首先在内存中完成,而不是直接写入磁盘。

文件同步 :根据配置的写入策略,如alwayseverysecno,系统会定期或在每次写操作后将缓冲区中的数据同步到AOF文件中。这个同步过程确保了数据的持久化。

缓冲区写回策略:AOF持久化提供了多种缓冲区写回策略,包括始终将数据立即写入磁盘的策略,以及每秒写入一次或由操作系统决定何时写入的策略。这些策略在保证数据安全性的同时,也考虑了性能的影响。

AOF文件重写:为了优化AOF文件的大小和效率,Redis会定期进行AOF文件重写。重写过程中,Redis会创建一个新的AOF文件,仅包含恢复当前数据集所需的最小命令集,从而减少文件的大小并提高加载速度。

重启加载:Redis 服务器重启可以对AOF文件加载进行数据恢复。

RDB和AOF如何选择

在选择Redis的持久化方式时,通常建议结合使用AOF和RDB以达到最佳的数据安全性和恢复速度

数据安全性:AOF通过记录每个写操作来提供更高的数据安全性,因为它能够保证在系统崩溃后不会丢失最近的操作。而RDB在某个时间点提供数据的快照,可能会丢失最后一次快照之后的所有数据。

恢复速度:RDB的恢复速度通常比AOF更快,因为它只需要加载单个压缩的二进制文件。但如果同时使用AOF和RDB,Redis会优先使用AOF来恢复数据,因为AOF保存的文件更完整。

性能影响 :AOF在写入时可能会对性能产生一定影响,尤其是在重写过程中。使用everysec策略可以在一定程度上平衡可靠性和性能。RDB的性能影响主要发生在创建快照时,但这可以通过配置自动触发时间和手动触发来控制。

用例场景:如果数据不是非常敏感,可以从其他地方重新生成,那么可以选择关闭持久化。如果数据比较重要但能够承受几分钟的数据丢失(如缓存),可以只使用RDB。对于需要高数据完整性的场景,建议同时开启AOF和RDB。

存储空间:AOF文件通常会比RDB文件大,因为它记录了每个写命令。存储空间的限制也可能影响持久化方式的选择。

维护和管理:AOF文件可能需要定期进行重写以避免过大,而RDB的维护相对简单,因为它只需要在某些策略下自动或手动触发快照。

相关推荐
了一li2 小时前
Qt中的QProcess与Boost.Interprocess:实现多进程编程
服务器·数据库·qt
码农君莫笑2 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
别致的影分身3 小时前
使用C语言连接MySQL
数据库·mysql
京东零售技术4 小时前
“慢”增长时代的企业数据体系建设:超越数据中台
数据库
sdaxue.com5 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)5 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
海海不掉头发5 小时前
苍穹外卖-day05redis 缓存的学习
学习·缓存
阿里嘎多学长6 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_6 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui16 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql