Redis 是一种快速、高效、内存数据库,开发人员非常喜欢它。但是,Redis 在遇到强制性关闭(比如断电)时,所有进程正在处理的数据都将被丢失。因此,我们就需要一种方法来确保 Redis 数据的可持久性。这就是 Redis 持久化所做的事情。
Redis 有两种持久化方式:RDB 和 AOF。在本文中,我们将深入探讨这两种持久化方式的详细信息、使用场景和如何配置它们。
RDB
RDB(Redis DataBase) 是一种快速、轻量级的持久化方式,它将 Redis 数据以快照形式写入磁盘。当 Redis 在运行过程中达到一定阈值时,Redis 会自动执行一个保存操作,将内存中数据快照写入磁盘(即 RDB 文件)。当 Redis 重新启动时,可以从 RDB 文件中读取数据恢复 Redis。
RDB 的优点
- RDB 比 AOF 更快,因为它不需要实时地将写操作写入磁盘;
- RDB 文件是一个紧凑的压缩文本格式,易于备份和传输;
- RDB 恢复速度比 AOF 快,因为只需要读取一个文件。
RDB 的缺点
- RDB 数据存储是一个周期性的操作,并不是实时的,因此可能会在最后一次 RDB 后出现数据丢失的情况。
- RDB 大小和操作系统的文件大小限制有关,因此如果文件过大,RDB 操作可能会阻塞 Redis 的主线程。
配置 RDB
- 配置保存时间间隔
默认情况下,Redis 会在 900 秒后自动将数据写入磁盘。您可以通过在配置文件中设置 save 指令来改变这个值。
save 60 1000
这里的 60 表示在 60 秒之后 Redis 将进行一次保存操作,1000 表示在一次操作中有至少 1000 个 key 发生变化。这样设置可以确保我们的数据不会丢失,因为接收到断电或强制退出的 Redis 会发生一定数量的自动保存。在 Redis 官方文档中,建议您至少将 save 设置为 60 300(1 小时内进行一次操作的键数为 300 或更多)。
- 手动保存
您也可以通过执行 SAVE 或 BGSAVE 命令在不同的时间内进行手动保存操作。 SAVE 命令会导致 Redis 阻塞,直到保存操作完成。而 BGSAVE 命令会在后台异步进行保存操作,不会阻塞 Redis 主线程。
AOF
AOF(Append Only File) 是另一种持久化方式,Redis 会将执行的每个写操作追加到文件末尾。当 Redis 重新启动时,Redis 会读取 AOF 文件,并执行相应的写操作进行恢复。
AOF 的优点
- 可以保证在 Redis 断电或异常关闭的情况下最小化数据丢失的情况;
- 恢复数据精确度高,并且没有任何混淆。
AOF 的缺点
- 比 RDB 操作慢,因为每个写操作都会实时写入文件中;
- AOF 文件比 RDB 大,不易于备份和传输。
配置 AOF
- 打开 AOF
默认情况下,Redis 会禁用 AOF。您可以打开 AOF,通过在配置文件redis.conf中将“appendonly”指令值设置为 yes。
appendonly yes
- 配置 AOF 保存时间间隔
您可以设置 AOF 持久化间隔的其他“重写 AOF 开销”指令值,以及“ AOF 文件增量大小的阈值”。如下所示:
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
这里,auto-aof-rewrite-percentage 定义了我们每次重写 AOF 文件的增量,如果 AOF 文件大于 100%,我们将触发重写操作。而 auto-aof-rewrite-min-size 定义了重写文件的最小大小。一般而言,重写操作必须执行在磁盘空间充足的情况下。
Redis 持久化的最佳实践
配置 RDB 和 AOF
建议您同时使用 RDB 和 AOF。在採用 RDB 时,我们可以避免 AOF 文件过大导致 AOF 恢复时间过长的情况,并可以避免重写。同时,AOF 可以提供更高的数据可靠性,可以在数据丢失时作为备份恢复之用。
数据存储
在 Redis 中,如果您将数据作为内存,Redis 将非常快。但要注意,如果您需要持久化数据,则它的大小不能超过可用内存的一定百分比。这样的比率可以根据您在 redis.conf 文件中的“maxmemory”指令值进行设置。
此外,使用 Redis Cluster 来在多个服务器之间共享数据也非常有用。在此方案中,每个节点都只存储在其内存中,但在发生节点故障时,可以使用持久化方法恢复数据。
升级和重写
当升级 Redis 时,请确保您在升级之前对数据进行了备份。如果需要开启和关闭持久化以更新配置,请先执行 BGSAVE 命令以保存更新之前的状态。
在使用 AOF 时,如果您发现 AOF 文件过大,可以使用 BGREWRITEAOF 命令将文件重写为只包含最少命令集合。同时,建议使用 AOF 的专有工具,如 aof-rewrite-tool,可以将重写操作分解为子操作。
示例如下:
// 同时启动 RDB 和 AOF save 60 1000 // 配置 RDB 保存时间间隔 appendonly yes // 打开 AOF auto-aof-rewrite-percentage 100 // 配置 AOF 保存时间间隔 auto-aof-rewrite-min-size 64mb
结论
Redis 持久化是关键的数据库维护操作之一,确保将数据写入磁盘,以免丢失数据和保持数据一致性。在升级或更改持久化配置时,请始终注意先进行备份,并始终注意内存使用情况。
然而,无论你使用哪种持久化方式,都要明白它们的优缺点和适用场景,根据自己的需求选择最佳的持久化方式。
—————————————————————————
作者:小菜鸟Jacck
链接:https://www.jianshu.com/p/16f5b5a30458
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6774c3b26d66e0f9aaf0305c