Redis 持久化机制中的 RDB 和 AOF 方式及比较

什么是 Redis 持久化

Redis 是一种高性能的非关系型数据库,经常被用来缓存、队列、消息等,但是它的数据是存储在内存中的,这意味着如果 Redis 服务挂掉或者被重启,那么内存中的所有数据将会丢失。为了避免这种情况的发生,Redis 提供了两种持久化机制,分别是 RDB 和 AOF。

Redis 的持久化机制可以将 Redis 的数据写入到硬盘中,当 Redis 重启的时候可以直接从硬盘中加载数据,从而保证了 Redis 的数据不会因为服务重启而丢失。

RDB 持久化

RDB 持久化是 Redis 的一种快照机制,当满足某些条件时,Redis 会自动进行 RDB 持久化操作,将 Redis 数据存储到硬盘上的一个文件中。RDB 的存储格式是二进制的,存储的数据非常紧凑,可以大幅度地减少存储空间。

RDB 持久化的优缺点

RDB 持久化的优点:

  • 适合大规模数据恢复。
  • 生成的文件是紧凑的二进制,占用空间少。
  • Redis 启动速度非常快,因为数据可以一次性读入到内存中。

RDB 持久化的缺点:

  • 不能保证数据的实时性:RDB 持久化是通过定时备份实现的,如果 Redis 宕机时进程内存中的数据没有写入到 RDB 文件中,丢失的数据将不可恢复。

RDB 持久化的配置和使用

配置

在 Redis 配置文件 redis.conf 中,以下是对 RDB 持久化的相关配置参数:

save 参数是用于配置 RDB 持久化的规则的,以上面的配置为例,表示当满足以下条件时,Redis 会自动进行 RDB 持久化:

  1. 从 Redis 启动开始,经过 900 秒后,如果有至少一个键被修改,则会创建一个 RDB 文件。
  2. 从 Redis 启动开始,经过 300 秒后,如果有至少 10 个键被修改,则会创建一个 RDB 文件。
  3. 从 Redis 启动开始,经过 60 秒后,如果有至少 10000 个键被修改,则会创建一个 RDB 文件。

其中,第一个参数表示时间间隔,第二个参数表示变更的键值对数量。

dbfilename 参数是 RDB 文件的名称,保存在 Redis 的工作目录中。dir 参数是指定 RDB 文件存储的目录,默认是 Redis 的工作目录。

使用

使用 RDB 持久化的方法非常简单,只需要在 Redis 调用 save 或者 bgsave 命令即可。save 命令会阻塞 Redis 服务器,直到 RDB 持久化保存完毕。而 bgsave 命令则会在后台异步执行,不会阻塞 Redis 服务器的正常运行。

# 执行同步保存
$ redis-cli save

# 执行异步保存
$ redis-cli bgsave

AOF 持久化

AOF 持久化是 Redis 的一种日志机制,将每个写入操作作为一条日志记录下来,这些记录按照顺序存储在一个文件中。当 Redis 重启时,可以通过读取 AOF 文件中的操作记录来重建数据集。

AOF 持久化的优缺点

AOF 持久化的优点:

  • 提供了更好的实时性:只要 Redis 接收到写操作,就会立刻同步到 AOF 文件中。
  • 可以精确地恢复数据:AOF 文件中保存的是 Redis 的操作命令,可以非常精确地恢复数据。
  • 由于 AOF 文件是追加写入的,所以非常不容易损坏。

AOF 持久化的缺点:

  • AOF 文件比 RDB 文件大,并且由于是文本文件,不如 RDB 文件紧凑,所以占用空间相对较大。
  • AOF 持久化的性能要比 RDB 持久化差一些。

AOF 持久化的配置和使用

配置

在 redis.conf 文件中,以下是对 AOF 持久化的相关配置参数:

appendonly 参数用于启用 AOF 持久化,默认是关闭的。appendfilename 参数是指定 AOF 文件的文件名,dir 参数是指定 AOF 文件的存储目录。appendfsync 参数是指定 AOF 文件何时将写入硬盘,有以下几个取值:

  • everysec:每秒钟同步一次 AOF 文件,这是默认的值。
  • always:每次写入都会同步到硬盘,这种方式可以提供最佳的数据安全性,但是会影响性能。
  • no:不同步 AOF 文件,由后台进程异步同步。如果服务器发生故障,则可能会有部分数据丢失。

使用

使用 AOF 持久化的方式也很简单,只需要在 Redis 中调用 bgrewriteaof 命令即可触发 AOF 重写,将历史文件中的内容缩减为积极影响系统性能日志的方式。

# 强制触发 AOF 重写
$ redis-cli bgrewriteaof

RDB 和 AOF 的选择

在选择 RDB 和 AOF 模式之前,我们需要考虑的问题是内存是否盈满、数据的实时性要求以及数据是否可以牺牲一些实时性以换取更好的性能。

如果内存不能存储所有数据,那么应该使用 AOF 持久化方式。AOF 持久化方式比 RDB 更加安全和可控。

如果数据要求实时性高,就要使用 AOF 持久化。因为 AOF 持久化记录的是 Redis 执行的命令,能够保证数据实时同步到磁盘。

如果数据可以牺牲一些实时性以换取更好的性能,就可以考虑使用 RDB 持久化方式。

示例代码

以下是示例代码,Redis 首次使用时会完成数据的持久化:

import redis

# 示例 Redis 客户端配置
config = {
  'host': '127.0.0.1',
  'port': '6379',
  'db': 0,
}

# 实例化 Redis 客户端
client = redis.StrictRedis(**config)

# 设置 Redis 值
client.set('name', 'Redis')

# 保存 Redis 数据
client.save()

总结

Redis 的持久化机制可以为我们带来很多好处,无论我们使用的是 RDB 还是 AOF,都需要根据需求来灵活选择。在实际的应用场景中,我们可以根据业务需求、数据负载和磁盘状态等因素来决定合适的持久化方式。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65934ebeeb4cecbf2d7fe6c9


纠错反馈