一文读懂Redis之数据持久化

目录

一、RDB快照持久化

(一)、手动触发RDB快照持久化

1、save命令

2、bgsave命令

(二)、自动触发RDB快照持久化

二、AOF日志持久化

(一)、开启AOF日志持久化

1、开启AOF日志持久化

2、配置AOF文件名称

(二)、设置AOF写入策略

(三)、配置AOF文件重写规则

(四)、重启Redis服务

三、RDB+AOF混合持久化


更多精彩博文详见:

《Linux系统应用运维》专栏总目录(持续更新)

Redis是内存数据库,数据直接存放在内存中,所以读写效率非常高。但这种方式也存在一个很大的问题:一旦服务器断电或者宕机,数据将全部丢失。为了解决这个问题,Redis提供了持久化机制。Redis持久化机制可以把内存数据持久化到硬盘,同时也可以通过备份文件来恢复数据。

Redis支持三种持久化方式:RDB快照持久化、AOF日志持久化、混合持久化。其中混合持久化是Redis 4.0开始增加的持久化选项。

一、RDB快照持久化

RDB快照持久化是按照指定的时间间隔对数据进行快照,将数据保存在数据文件中。RDB快照触发方式有手动触发和自动触发两种。快照触发后,数据默认写入dump.rdb文件,该文件名称通过Redis配置文件的dbfilename选项指定。

RDB快照方式无法做到实时或者秒级持久化。

(一)、手动触发RDB快照持久化

手动触发RDB快照持久化是通过在Redis客户端命令行工具上人为执行持久化备份命令完成的。

1、save命令

执行save命令会在前台进行快照备份。save命令执行时会调用rdbSave函数,函数调用后立即启动持久化流程。由于Redis是单线程,在执行save命令进行快照备份的过程中,Redis无法对外提供服务。

  • 执行save命令

root@dataTest \~# /data/redis/redis_6379/src/redis-cli

127.0.0.1:6379> save

  • 查看dump.rdb文件

root@dataTest \~# ll /data/redis/data/

dump.rdb文件的存放路径通过Redis配置文件的dir选项指定,此处为/data/redis/data

2、bgsave命令

执行bgsave命令会在后台进行快照备份。bgsave命令执行时会调用rdbSaveBackground函数,该函数会fork出子进程,子进程负责调用rdbSave函数执行持久化流程,而主进程会继续对外提供服务。

  • 执行bgsave命令

root@dataTest \~# /data/redis/redis_6379/src/redis-cli

127.0.0.1:6379> bgsave

  • 查看dump.rdb文件

root@dataTest \~# ll /data/redis/data/

dump.rdb文件的存放路径通过Redis配置文件的dir选项指定,此处为/data/redis/data

(二)、自动触发RDB快照持久化

自动触发RDB快照持久化流程,通常有下面三个场景:

  • Redis配置文件中"save m n"规则的设置。如"save 300 10",表示300秒(5分钟)内至少有10个key的值发生变化,则执行持久化流程。其中save ""表示关闭RDB持久化。
  • Redis主从复制。当从节点第一次连接主节点时,主节点会触发RDB持久化,并将rdb文件发送给从节点,进而完成主从复制的初始化。
  • 未开启其他持久化机制(如未开启AOF日志持久化)的情况下,当执行shutdown命令关闭Redis服务时,Redis会默认执行bgsave操作。

例如Redis配置文件中的配置:

save "" 表示关闭RDB持久化。


二、AOF日志持久化

AOF(Append Only File)日志持久化是将Redis执行过的所有写操作记录下来(读操作不记录),并以追加的方式写在日志文件中。日志文件由Redis配置文件中的appendfilename选项设置,默认为"appendonly.aof"。

当Redis服务重启时,会按顺序重新执行日志文件中记录的指令内容,从而完成数据的恢复工作。AOF日志重放的过程相对于RDB快照来说要慢很多,在AOF日志文件较大的情况下,数据恢复、Redis服务启动需要花费较长的时间。

Redis执行写操作时,不会立即写入AOF文件,而是将写操作先保存在AOF缓存区,再根据写入策略把所有写操作保存在AOF文件中。

随着AOF文件内容的增加,AOF会根据对应的规则进行写操作命令的合并(重写),从而起到压缩AOF文件的目的,避免了文件过大。

(一)、开启AOF日志持久化

1、开启AOF日志持久化

Redis默认情况下是关闭AOF日志持久化功能的,需要修改如下配置开启功能。

  • **appendonly:**yes代表开启AOF,no代表关闭AOF。

2、配置AOF文件名称

AOF文件的默认名称为appendonly.aof,可以根据实际需求修改文件名称。

  • **appendfilename:**默认文件名称为appendonly.aof,该文件存放在dir配置项配置的路径下,此处为/data/redis/data

(二)、设置AOF写入策略

AOF会根据写入策略,将AOF缓冲区的写操作持久化到AOF文件中。

  • **appendfsync:**默认的写入策略是everysec,即每秒写入。

appendfsync配置项对比如下:

|--------------|----------|---------------|------------|
| 配置项 | 写入时机 | 优点 | 缺点 |
| always | 立即写入磁盘 | 强持久化,数据基本不丢失。 | 性能影响较大 |
| everysec(默认) | 每秒写入一次磁盘 | 性能适中 | 宕机时丢失一秒的数据 |
| no | 操作系统控制写入 | 性能较佳 | 宕机时损失数据较多 |

(三)、配置AOF文件重写规则

随着Redis写操作的增加,AOF文件将会越来越大。需要配置策略定期对AOF文件进行重写,避免AOF文件过大导致性能问题。

AOF重写规则主要由以下配置完成:

  • **auto-aof-rewrite-percentage:**默认设置为100,即当AOF文件增长了100%时,AOF开始重写。
  • **auto-aof-rewrite-min-size:**默认设置为64mb,即当文件超过64mb时,AOF开始重写。需要注意的是,若AOF的增长百分比超过了auto-aof-rewrite-percentage设置的值,但文件仍然小于64mb时,AOF不会重写。

(四)、重启Redis服务

root@dataTest \~# /data/redis/redis_6379/src/redis-server /data/redis/redis_6379/redis.conf

root@dataTest \~# netstat -tnlp

root@dataTest \~# ll /data/redis/data/

由上可见,重启Redis服务后,服务创建了appendonly.aof文件,说明AOF日志持久化功能已经成功开启。


三、RDB+AOF混合持久化

Redis 4.0后新增了一个新的持久化模式-----RDB+AOF混合持久化。混合持久化模式使用RDB快照文件和RDB快照时间点之后的增量AOF日志文件进行数据恢复。恢复数据时先加载RDB快照文件,再重放增量AOF日志文件。这样即解决了使用RDB快照恢复数据时存在数据丢失的问题,又解决了使用AOF日志恢复数据时的性能问题。

开启RDB+AOF混合持久化

aof-use-rdb-preamble yes


更多精彩博文详见:

《Linux系统应用运维》专栏总目录(持续更新)

相关推荐
风哥2号38 分钟前
数据库教程FGMT52‑PostgreSQL用户权限与安全管理
数据库·postgresql
考虑考虑6 小时前
docker compose V2版本新属性
运维·后端·自动化运维
风哥2号7 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
AlanBruce7 小时前
摩尔信使MThings功能综述与应用使用指南
linux·自动化·plc·mthings·摩尔信使
小小的木头人8 小时前
Ubuntu Samba修改端口绕过445封禁挂载
运维·ubuntu
YangYang9YangYan8 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
西安栈上月明软件科技9 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m9 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
wdfk_prog9 小时前
ROS教程:01 搭建 ROS1 Noetic Docker 开发环境
运维·缓存·docker·容器·ros
SEO_juper9 小时前
Java 并发编程实战:从线程基础到高并发架构
运维·人工智能·爬虫·chatgpt·seo