自学内容网 自学内容网

简单认识redis - 9 redis持久机制

Redis 提供了两种主要的持久化机制:RDB(Redis Database)和 AOF(Append Only File)。

RDB 持久化机制

工作原理
RDB 持久化是通过对 Redis 中的数据进行周期性的快照(snapshot)来实现的。在指定的时间间隔内,Redis 会将内存中的数据集快照写入磁盘上的一个 RDB 文件中。
例如,当满足以下条件之一时会触发 RDB 操作:
根据配置文件中的设置,达到指定的时间间隔(如每 900 秒如果至少有 1 个键发生了变化)。
在执行特定的命令时,如SAVE(该命令会阻塞 Redis 进程,直到 RD在这里插入代码片B 文件创建完成)或者BGSAVE(后台异步保存 RDB 文件,不会阻塞 Redis 进程的正常处理)。
文件结构
RDB 文件是一个经过压缩的二进制文件。它包含了 Redis 在某个时刻的数据集,包括键值对、过期时间等信息。
这种二进制结构使得 RDB 文件具有很高的加载效率,非常适合用于备份和灾难恢复。例如,在恢复数据时,可以直接将 RDB 文件加载到 Redis 内存中,快速恢复到之前的状态。
1.优点
紧凑高效:RDB 文件是二进制压缩文件,占用磁盘空间小,并且恢复数据速度快。因为它是内存数据的快照,直接加载即可,不需要像 AOF 那样重放大量的操作命令。
适合备份:由于 RDB 文件可以方便地在不同的 Redis 实例之间进行迁移,所以非常适合用于数据备份和灾难恢复场景。
2.缺点
数据丢失风险:如果 Redis 发生故障,并且距离上次 RDB 快照已经有一段时间了,那么在这期间修改的数据将会丢失。因为 RDB 是按照一定的时间间隔进行快照的,不能实时地保存数据的每一次修改。
可能影响性能:在执行BGSAVE操作时,虽然不会阻塞 Redis 的主进程,但会使用额外的内存和 CPU 资源来进行数据的快照操作,在一定程度上可能影响 Redis 的性能。

AOF 持久化机制

工作原理
AOF 持久化以日志的形式记录 Redis 服务器所执行的每一个写操作(如SET、LPUSH等命令)。这些写操作会按照顺序追加到一个 AOF 文件中。
例如,当执行SET key value命令时,这个命令会以文本协议的形式被追加到 AOF 文件的末尾。

文件结构
AOF 文件是一个纯文本文件,其中包含了一系列 Redis 命令。每一条命令都是按照 Redis 协议的格式记录的,这使得 AOF 文件具有可读性,方便进行人工查看和分析。

1.优点

  1. 数据安全性高:由于 AOF 记录了每一个写操作,所以只要 AOF 文件不丢失并且能够正确地重放(replay)这些操作,就可以最大程度地保证数据不丢失。即使 Redis 发生故障,也可以通过重新执行 AOF文件中的命令来恢复数据。
  2. 实时性较好:AOF 是实时地将写操作追加到文件中,相比 RDB 的周期性快照,AOF 能够更及时地保存数据的变化。

2.缺点

  1. 文件体积较大:因为 AOF 记录了所有的写操作,随着时间的推移和 Redis 操作的频繁进行,AOF 文件会变得越来越大。这不仅会占用大量的磁盘空间,而且在恢复数据时,由于需要重放大量的命令,恢复速度相对较慢。
  2. 性能影响:虽然 Redis 会对 AOF 文件进行后台重写(rewrite)来优化文件大小,但在重写过程中仍然会消耗一定的 CPU和内存资源,并且在重写期间对写操作的处理可能会受到一定影响。
  3. 混合持久化(Redis 4.0 及以后版本) 混合持久化结合了 RDB 和AOF 的优点。 在混合持久化模式下,Redis 会先按照 RDB 的方式对数据进行快照,然后将在两次快照之间发生的写操作以 AOF的方式追加到文件中。 这样在数据恢复时,首先加载 RDB 文件,然后再重放 AOF 部分的操作,既能够快速恢复数据,又能保证数据的完整性。

如何配置 Redis 的 RDB 持久化机制?

以下是配置 Redis 的 RDB 持久化机制的方法:
配置文件方式(redis.conf)

1.找到相关配置项
2.在 Redis 的配置文件(通常为 redis.conf)中,可以找到与 RDB 持久化相关的配置部分。

配置保存策略

Redis 允许通过设置save指令来确定何时进行 RDB 快照。例如:

save 900 1:表示如果在 900 秒(15 分钟)内至少有 1 个键被修改,就进行一次 RDB 持久化操作。
save 300 10:表示 300 秒(5 分钟)内至少有 10 个键被修改时触发 RDB 操作。
save 60 10000:表示 60 秒内至少有 10000 个键被修改时触发。
可以根据实际需求调整这些参数。如果不想使用 RDB 的自动保存功能,可以将这些save指令注释掉。

指定RDB 文件名称和存储路径 通过dbfilename配置项来指定 RDB文件的名称,默认名称为dump.rdb。 例如:

dir /var/lib/redis将 RDB文件存储到/var/lib/redis目录下。

使用dir配置项指定 RDB文件的存储目录,默认是 Redis 启动时的当前目录。例如:

可以设置为dbfilename mydump.rdb。

命令行方式
手动触发保存(SAVE 命令)

在 Redis 客户端中,可以使用SAVE命令来手动触发 RDB 持久化操作。但要注意,SAVE命令会阻塞 Redis 进程,直到 RDB
文件创建完成。这意味着在执行SAVE命令期间,Redis 不能处理其他客户端的请求。
例如: 在 Redis 客户端中输入SAVE,Redis将把当前内存中的数据集保存到 RDB 文件中。

后台异步保存(BGSAVE 命令)

与SAVE命令不同,BGSAVE命令会在后台异步地执行 RDB 持久化操作。Redis会创建一个子进程来执行保存操作,而主进程可以继续处理客户端的请求。
例如: 在 Redis 客户端中输入BGSAVE,Redis将在后台进行数据保存。可以通过INFO命令查看 BGSAVE的执行状态,在INFO命令的输出中,rdb_bgsave_in_progress字段如果为 1,表示 BGSAVE 操作正在进行。

在代码中配置(以 Java 为例,使用 Jedis 库) 如果在 Java 程序中使用 Jedis 与 Redis 交互,虽然不能直接在 Jedis 中配置 RDB 持久化的核心参数(如save策略等,这些是 Redis 服务器端的配置),但可以通过 Jedis 触发SAVE或BGSAVE操作。

    import redis.clients.jedis.Jedis;

     public class RedisRDBConfigExample {
         public static void main(String[] avg) {
             // 连接Redis服务器
             Jedis jedis = new Jedis("localhost", 6379);

             // 手动触发BGSAVE操作
             jedis.bgsave();

             // 关闭连接
             jedis.close();
         }
     }

在上述代码中,通过jedis.bgsave()触发了 Redis 的后台异步保存操作。如果要执行SAVE操作,可以使用jedis.save(),但要注意SAVE会阻塞操作。


原文地址:https://blog.csdn.net/m0_68274160/article/details/142883890

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!