redis持久化

指的是把内存中的数据写入磁盘中。因为redis是基于内存进行数据存储的,当服务器关闭或者重启时,内存中的数据会丢失,所以需要通过持久化机制,来把数据定期自动或者按需手动保存到磁盘中,以便服务器启动时恢复数据。
实现方法分为如下两种

1.RDB(Redis DataBase)

是什么:在指定的时间间隔内,执行数据集的时间点快照,快照文件就是RDB文件(例如dump.rdb)。当Redis重启时,会加载这个.rdb文件,直接将文件中的数据加载到内存中。

相关配置

位于redis.conf配置文件的snapshot模块中

  1. save <seconds> <changes> [<seconds> <changes> ...] 大概位于第440行
    用于配置使时间间隔和数据修改次数,及每个一段固定时间查看当前redis修改数据的次数,超过了设定的i修改次数则进行快照。
  2. dir 文件位置(例如 /root/myredis/dumpfiles) 大概位于第510行
    用于设置rdb文件存放的位置
  3. dbfilename 文件名(例如dump6379.rdb) 大概位于第487行
    用于设置rdb文件的名字
  4. stop-writes-on-bgsave-error
  5. rdbcompression
  6. rdbchecksum
  7. rdb-del-sync-files

自动触发

1.配置文件中的默认快照

根据配置文件中的save进行自动快照操作。

2.主从复制

手动触发

1.save
  • 功能SAVE 命令用于在主线程中同步生成 RDB 文件,将当前 Redis 数据库的数据快照保存到磁盘上。
  • 执行过程:执行 SAVE 命令时,Redis 会阻塞主线程,直到 RDB 文件创建完成。在此期间,Redis 无法处理其他客户端的任何请求。
  • 适用场景:由于其阻塞特性,SAVE 命令通常不适用于生产环境,尤其是在数据量较大时,可能会导致长时间的阻塞。
2.bgsave
  • 功能BGSAVE 命令用于异步生成 RDB 文件。它通过创建一个子进程来执行数据快照操作,而主线程继续处理客户端请求。
  • 执行过程
    • 主进程调用 fork() 创建一个子进程。
    • 子进程负责将内存中的数据写入到磁盘上的临时文件中。
    • 写入完成后,子进程会用新生成的临时文件替换旧的 RDB 文件。
    • 主进程在整个过程中几乎不受影响,只有在 fork() 阶段会有短暂的阻塞。
  • 适用场景BGSAVE 是推荐的持久化命令,尤其适用于生产环境。它可以在不影响 Redis 正常服务的情况下,完成数据的持久化操作。
3.特殊命令
  • 执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义。
  • 执行shutdown且没有设置开启AOF持久化也会产生dump.rdb文件。

2.AOF(Append Only File)

是什么:AOF是Redis的一种持久化机制,它通过将Redis执行的写操作命令以追加的方式记录到一个日志文件(通常是appendonly.aof)中来实现数据的持久化。在Redis重启时,会加载AOF文件,重新执行其中记录的命令,从而恢复数据。

相关配置

位于redis.conf配置文件的append only模块中

  1. appendonly yes/no

    用于设置是否启用AOF,默认只启用RDB,不启用AOF。

  2. dir 文件位置

    用于指定.aof文件所在目录的存放的位置。

  3. appenddirname 目录名

    用于指定aof文件所在的目录

    区分:

    • redis7版本开始,.aof文件存放路径等于dir下的文件位置/appenddirname目录名/xxx.aof

    • redis6版本时,.aof文件存放位置仅等于dir下的文件位置/xxx.aof

  4. appendfilename 文件名

    指定.aof的文件名称

image-20250205002000869

写回策略

AOF的写回策略决定了Redis何时将内存中的命令写入到AOF文件中。Redis提供了三种写回策略,分别通过配置文件中的appendfsync参数来设置:

  1. appendfsync always
    • 描述:每次写操作都会立即同步到AOF文件中。
    • 优点:数据安全性最高,即使Redis崩溃,也不会丢失任何数据。
    • 缺点:性能开销较大,因为每次写操作都会触发一次磁盘同步操作,可能会降低Redis的性能。
  2. appendfsync everysec
    • 描述:每秒同步一次AOF文件。这是默认的写回策略。
    • 优点:在性能和数据安全性之间取得了较好的平衡。即使发生故障,最多只会丢失1秒内的数据。
    • 缺点:在极端情况下(如系统崩溃),可能会丢失1秒内的数据。
  3. appendfsync no
    • 描述:不主动同步AOF文件,由操作系统决定何时同步。
    • 优点:性能开销最小,因为Redis不会主动触发磁盘同步操作。
    • 缺点:数据安全性最低,如果操作系统崩溃或Redis进程被意外终止,可能会丢失较多数据。

重写机制

AOF文件会随着Redis的写操作不断增加,文件大小可能会变得很大。为了优化AOF文件的大小,Redis提供了AOF重写机制,通过生成一个新的AOF文件来替换旧的AOF文件,从而减小文件大小并提高性能。

工作原理

  1. 触发条件
    • 自动触发:可以通过配置文件中的auto-aof-rewrite-percentageauto-aof-rewrite-min-size参数来设置自动触发条件。
      • auto-aof-rewrite-percentage:表示AOF文件大小增长的百分比。例如,设置为100,表示当AOF文件大小增长超过100%时,会触发重写。
      • auto-aof-rewrite-min-size:表示AOF文件的最小大小。例如,设置为64mb,表示只有当AOF文件大小超过64MB时,才会触发重写。
    • 手动触发:可以通过命令BGREWRITEAOF手动触发AOF重写。
  2. 重写过程
    • 当触发AOF重写时,Redis会启动一个子进程来执行重写操作。
    • 子进程会读取当前内存中的数据,并生成一个新的AOF文件,该文件只包含恢复当前数据集所需的最小命令集合。
    • 在重写过程中,主进程会继续处理客户端的请求,并将新的写操作命令追加到一个临时缓冲区中。
    • 当子进程完成重写后,主进程会将临时缓冲区中的命令追加到新的AOF文件中,然后用新的AOF文件替换旧的AOF文件。
  3. 优点
    • 减小文件大小:通过生成一个新的AOF文件,只保留恢复当前数据集所需的最小命令集合,从而减小文件大小。
    • 提高性能:新的AOF文件更紧凑,加载速度更快,同时减少了磁盘空间的占用。
  4. 注意事项
    • AOF重写不会阻塞主进程,因为重写操作是由子进程完成的,主进程可以继续处理客户端的请求。
    • 在重写过程中,主进程会将新的写操作命令追加到临时缓冲区中,以确保数据的完整性。

3.RDB-AOF混合持久化

一、两种持久化方式优先级

  • 当同时开启RDB和AOF两种持久化方式时,AOF的优先级高于RDB。若AOF文件存在并无损,则只加载AOF文件。

二、混合持久化开启

  1. 开启方式

    配置文件append only模块 aof-use-rdb-preamble yes

  2. 混合持久方式的数据执行流程

    (1)Redis启动时,会检查是否存在AOF文件(appendonly.aof)。如果存在且配置了混合持久化(aof-use-rdb-preamble yes),Redis会先加载AOF文件。

    (2)检查AOF文件是否包含RDB快照

    • 如果AOF文件中包含RDB快照(即混合持久化模式),Redis会先加载RDB快照部分,快速恢复大部分数据。
    • 然后,Redis会继续加载AOF文件中自RDB快照之后的增量日志,依次执行这些日志中的写操作,以恢复到最新的数据状态。
    • 混合持久化下的aof文件

    (3)如果AOF文件不存在或损坏

    • 如果AOF文件不存在或损坏,Redis会尝试加载RDB文件(dump.rdb)。
    • 如果RDB文件也不存在或损坏,Redis将无法恢复数据,启动时会报错。

    (4)数据恢复完成

    完成上述步骤后,Redis的数据恢复过程结束,服务开始正常运行。

redis持久化

4.纯缓存模式

定义
纯缓存模式是指同时关闭RDB和AOF持久化功能,将Redis仅作为内存缓存使用,不进行任何数据持久化操作。

1.关闭RDB

save "" 禁用rdb持久化模式下,仍然可以手动执行savebgsave命令生成rdb文件

2.关闭AOF

appendonly no 仍然可以手动执行bgrewriteaof生成aof文件