Redis 数据持久化

概述

Redis 主要用途是在内存中存储数据,对数据的存储就需要有可靠性,不会出现数据的丢失和错误。但我们都知道 Redis 的高性能来源于其将数据存储在内存中,一旦应用进程关闭(这可能是应用进程崩溃、或服务器主机异常引起的意外中断)会导致数据丢失。这时候数据的持久化就显得尤其重要了,数据持久化是指将内存中的数据备份在磁盘中一份,当下次启动 redis 时会从磁盘中读取数据,写入内存,从而实现数据的恢复。
Redis 的持久化有两种方式 RDB 和 AOF,RDB 是将内存数据集的快照主动或被动的按某些条件备份到磁盘中;AOF 是将 Redis 所有的数据更改命令存储在文件中,当下次启动 Redis 时就会执行文件中的所有命令来达到还原数据的效果

RDB 持久化

RDB 数据的备份分为手动和被动两种方式

手动触发

使用 save 命令可以手动触发备份数据

微信截图_20210330154201

save 命令会阻塞 Redis 服务器进程,直到 RDB 的文件创建完成,期间不能执行其他任何命令请求。

如果希望不阻塞 Redis 服务器进程,可以使用bgsave 命令

微信截图_20210330154055

bgsave 命令会创建一个子进程,由子进程来创建 RDB 文件,父进程可以继续处理其他请求。

这时我们就可以在 Redis 安装目录下看到 dump.rdb 文件,当下次启动 Redis 时就会加载改文件的数据

被动触发

被动触发是指达到一定的条件时,Redis 会自动备份数据。
在 Redis 的配置文件 Redis.conf 中我们可以看到如下配置

微信截图_20210330165752

其中的含义分别为:

save 900 1 在900秒内发生一次数据变更执行备份

save 300 10 在300秒内发生10次数据变更执行备份

save 60 10000 在60秒内发生10000次数据变更执行备份

AOF 持久化

Redis 服务器默认开启 RDB,关闭 AOF。要开启 AOF 备份,需要修改配置文件。
设置配置文件中的 appendonly 为 yes

更改完配置文件后重启 Redis 服务,我们可以在安装目录下看到 appendonly.aof 文件,当我们执行添加、更改和删除数据命令时,Redis 会将命令写入 appendonly.aof 文件中。

image-20210330171311787

重启服务后,依然可以 get 到改数据

两种持久化的选择

RDB 与 AOF 的区别

RDB 方式

优点:RDB 的数据保存文件紧凑,体积小,网络传输快,适合全量复制;RDB 的数据恢复速度要比 AOF 快很多。RDB 持久化对 Rdis 性能的影响较小。

缺点:RDB 文件的致命缺点就是数据的持久化无法做到实时保存,会出现数据丢失,这对系统中的重要数据来说是致命的。

AOF 方式

优点:AOF 持久化支持秒级的持久化,数据可实时保存。

缺点:备份文件大,启动时数据恢复慢,对 Redis 的性能影响大。

实际应用中应该如何选择

无论是 RDB 还是 AOF,开启持久化必然对性能方面造成一定的影响。从应用需求和硬件条件综合来考虑。

下面分场景来讨论持久化策略的选择,下面的讨论也只是作为参考,实际方案可能更复杂更具多样性。

(1)如果Redis中的数据完全丢弃也没有关系(如Redis完全用作DB层数据的cache),那么无论是单机,还是主从架构,都可以不进行任何持久化。

(2)在单机环境下(对于个人开发者,这种情况可能比较常见),如果可以接受十几分钟或更多的数据丢失,选择RDB对Redis的性能更加有利;如果只能接受秒级别的数据丢失,应该选择AOF。

(3)但在多数情况下,我们都会配置主从环境,slave的存在既可以实现数据的热备,也可以进行读写分离分担Redis读请求,以及在master宕掉后继续提供服务。

在这种情况下,一种可行的做法是:

master(主服务器):完全关闭持久化(包括RDB和AOF),这样可以让master的性能达到最好

slave(从服务器):关闭RDB,开启AOF(如果对数据安全要求不高,开启 RDB 关闭 AOF 也可以),并定时对持久化文件进行备份(如备份到其他文件夹,并标记好备份的时间);然后关闭 AOF 的自动重写,然后添加定时任务,在每天Redis闲时(如凌晨12点)调用 bgrewriteaof

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!