Redis数据持久化

  • Redis是基于内存的NoSQL数据库,所以它的读写速度很快,但存储在内存中的Redis数据会在服务器重启后丢失。
  • 在一些场景里需要长久地保存数据,所以需要把内存中的Redis数据持久化地保存在硬盘中。
  • Redis提供了两种持久化的方式,分别是AOF (Append Only File,只追加文件)和RDB (Redis DataBase,基于Redis数据库)

AOF持久化

在AOF持久化的过程中,会以日志的方式记录每个Redis “写”命令,并在Redis服务器重启时重新执行AOF日志文件中的命令,从而达到“恢复数据”的效果。

image-20230713232213459

  • AOF持久化功能打开后,每当发生写的命令,该命令就会被记录到AOF缓冲区。
  • AOF缓冲区会根据事先配置的策略定期与硬盘文件进行同步操作。
  • 当AOF文件大到一定程度后该文件会被重写,即在不影响持久化结果的前提下进行压缩。
  • 当Redis服务器重启时,会加载硬盘上的AOF日志文件,以实现数据恢复的效果。

当Redis因发生故障而重启时,Redis服务器会按照如下步骤根据AOF日志文件恢复数据。

  • 创建一个伪客户端(fake client)。之所以叫伪客户端,是因为该客户端在本地,不带任何网络连接,但该伪客户端执行命令的效果和真实的带网络的客户端没有任何差别。

  • 该伪客户端从AOF日志文件里依次读取一条写命令并执行,直到完成所有写命令。

    执行完上述步骤后,其实就达到了“根据AOF日志文件恢复Redis现场”的持久化效果。

RDB持久化

  • 基于RDB的持久化方式会把当前内存中所有Redis键值对数据以快照的方式写入硬盘文件中,如果需要恢复数据,就把快照文件读到内存中。

  • RDB快照文件是经压缩的二进制格式的文件,它的存储路径不仅可以在Redis服务器启动前通过配置参数来设置,还可以在Redis运行时通过命令来设置。

    有两种方式可以触发RDB持久化机制:

  • 第一种是通过save和bgsave等命令手动触发;

  • 第二种是Redis服务器会根据redis.conf配置文件里设置的方式定期把内存数据写入快照。
    基于RDB的持久化方式比较适合数据备份和灾备场景,但RDB无法实现即时备份,即上次生成快照后的修改会丢失。