当前位置: 首页 > news >正文

Redis 中的持久化机制:RDB 与 AOF

文章目录

  • Redis 中的持久化机制:RDB 与 AOF
    • RDB
      • 自动触发 RDB
      • 手动触发 RDB
      • RDB 缺点
      • 禁用 RDB
    • AOF
      • 开启 AOF
      • AOF 相关策略
      • AOF 文件重写

Redis 中的持久化机制:RDB 与 AOF

Redis 提供 RDB 与 AOF 两种持久化机制。RDB 与 AOF 拥有各自优缺点,如果对数据安全性要求较高,则在实际开发中往往会结合两种机制来使用。

RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整(两次备份之间会丢失)相对完整(取决于刷盘策略)
文件大小压缩则文件体积小文件体积很大
宕机恢复速度很快
数据恢复优先级低(数据完整性不高)高(数据完整性高)
系统资源占用高(大量 CPU 与内存消耗)通常低(主要占用磁盘 IO 资源)但重写时高

RDB 更适合对数据完整性要求较低,而对宕机恢复速度要求较高的场景;AOF 更适合对数据完整性要求高,但对宕机速度要求较低的场景。

RDB

RDB 全称 Redis Database Backup file(Redis 数据备份文件),也称 Redis 数据快照。简单来说就是将内存中的所有数据记录到磁盘中。当 Redis 实例故障重启后,从磁盘读取快照文件以达到恢复 Redis 数据目的。

RDB 默认是开启的。RDB 是 Redis 默认的数据持久化方式,将数据库的快照保存在 dump.rdb(默认) 二进制文件中,快照文件称为 RDB 文件,默认保存在 Redis 当前运行目录。

自动触发 RDB

当主动对 Redis 进行停机时,Redis 会自动触发一次 RDB。此时 Redis 日志将输出:

Saving the final RDB snapshot before exiting.
DB saved on disk
Removing the pid file.
Redis is now ready to exit, bye bye...

手动触发 RDB

除了 Redis 宕机时自动触发 RDB,还可以使用 savebgsave 命令以手动触发 RDB。

  • save:由 Redis 主进程执行 RDB,由于 Redis 单线程原因,所以执行后将会阻塞主进程中所有 Redis 命令;

  • bgsave:开启子进程执行 RDB,执行后几乎不会阻塞主进程执行 Redis 命令,但是由于子进程是通过 fork 主进程而来的,所以还是会影响到主进程(在 fork 的过程中,主进程只能进行 fork 一项任务)。

    Redis 将数据写入物理内存的过程,并不是直接写入,而是通过写入 Linux 分配的虚拟内存间接写入物理内存。虚拟内存与物理内存的映射关系通过页码来维护,Linux 得到页码后将通过页码中维护的映射关系,将 Redis 数据写入物理内存。而子进程 fork 主进程的本质,实际上是对 Linux 操作系统页码的复制,子进程获取到主进程的页码后,就可以通过页码定位物理内存数据,从而异步写入磁盘中。

    为了避免主进程向内存中写数据,同时子进程在内存中读数据的情况发生,fork 采用 copy-on-write 技术。copy-on-write 技术会在主进程执行读操作时,访问主进程与子进程共享的内存数据;而在主进程进行写操作时,则会将共享的内存数据标记为 read-only 之后,拷贝一份内存数据,专门用于提供给主进程进行写操作。

也可以通过配置 Redis 配置文件的 save [时间(秒)] [变化KEY的数量] 项达到让 Redis 自动触发 RDB 的目的(默认 save 900 1)。例如:

# RDB的bgsava操作。默认900秒(十五分钟)内有1个key发生变化则执行。
save 900 1

除了在 Redis 配置文件中配置 RDB 的自动触发,还可以配置其他 RDB 相关配置:

# RDB文件是否压缩:默认开启,建议关闭(关闭的是目的是牺牲磁盘空间以节省CPU消耗)
rdbcompression yes
# RDB文件名:默认dump.rdb
dbfilename dump.rdb
# RDB文件保存路径:默认./
dir ./

RDB 缺点

RDB 机制存在两个缺点:

  1. RDB 间隔时间长,两次 RDB 之间存在数据丢失风险;
  2. fork 子进程、压缩、写入 RDB 文件都比较耗时。

禁用 RDB

通过修改配置禁用 RDB:

# RDB禁用
save ""

AOF

AOF 全称为 Append Only File(追加文件)。开启 AOF 后(默认未开启),Redis 处理的每一个写命令都会记录到 AOF 文件中。

开启 AOF

可以通过修改 Redis 配置文件开启 AOF:

# AOF持久化功能开关:默认no,即不开启。
appendonly yes
# AOF持久化文件名,默认文件名为appendonly.aof
appendfilename "appendonly.aof"
# AOF策略:值可以为always、everysec或no;
# 值为always:表示每执行一次写命令,立刻记录到AOF日志文件;
# 值为everysec:表示写命令执行完先放入AOF缓冲区,然后每隔1秒将缓存区数据写入AOF文件中(默认)
# 值为no:表示写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写入AOF文件。
appendfsync always
# AOF持久化文件保存路径,与RDB持久化文件保持一致即可
dir=""

AOF 相关策略

配置项刷盘时机优点缺点
always同步刷盘可靠性高,几乎不丢失数据性能影响大
everysec(推荐)每秒刷盘性能适中最多丢失一秒数据
no操作系统控制性能最好可靠性差,可能丢失大量数据

AOF 文件重写

在默认情况下,AOF 文件要比 RDB 文件大很多,根本原因在于 AOF 记录的是操作命令,而 RDB 记录的是操作数据。但是如果对同一个 Key 进行多次操作,并通过 AOF 进行记录是没有意义的,因为只有最后一次写操作才有意义。通过执行 bgrewriteaof 命令可以让 Redis 重写 AOF 文件,从而避免上述问题。

bgrewriteaof 命令可以被手动触发,从而立刻重写 aof 文件。执行正常的情况下将输出结果:

Background append only file rewriting started

此时,重写 AOF 文件的动作将会在后台被执行。

bgrewriteaof 命令也可以通过配置 Redis 配置文件的方式自动触发:

# 触发AOF重写所需要的aof文件体积百分比,aof文件增量大于100%(即一倍)才进行重写,0为关闭AOF自动重写
auto-aof-rewrite-percentage 100
# 触发AOF重写的最小文件体积,大于或等于64MB自动触发
auto-aof-rewrite-min-size 64mb 

文章转载自:
http://cholecystectomized.isnyv.cn
http://backhand.isnyv.cn
http://caginess.isnyv.cn
http://aspiratory.isnyv.cn
http://beachy.isnyv.cn
http://callus.isnyv.cn
http://acrocyanosis.isnyv.cn
http://chiefship.isnyv.cn
http://agateware.isnyv.cn
http://boxcar.isnyv.cn
http://baric.isnyv.cn
http://aruspex.isnyv.cn
http://carter.isnyv.cn
http://blatant.isnyv.cn
http://cabretta.isnyv.cn
http://bloodhound.isnyv.cn
http://bigeminal.isnyv.cn
http://atalanta.isnyv.cn
http://chainbelt.isnyv.cn
http://accusation.isnyv.cn
http://acculturate.isnyv.cn
http://budgetary.isnyv.cn
http://blacky.isnyv.cn
http://amberlite.isnyv.cn
http://absentminded.isnyv.cn
http://choreography.isnyv.cn
http://autarkical.isnyv.cn
http://anhysteretic.isnyv.cn
http://campanulaceous.isnyv.cn
http://ansa.isnyv.cn
http://www.dtcms.com/a/281742.html

相关文章:

  • Java之Stream其二
  • 第二章 OB 存储引擎高级技术
  • 数学金融与金融工程:学科差异与选择指南
  • 【AI News | 20250714】每日AI进展
  • 为 Git branch 命令添加描述功能
  • 将 Vue 3 + Vite + TS 项目打包为 .exe 文件
  • 711SJBH构建制造业信息化人才培训体系的对策-开题报告
  • 21-C#的委托简单使用-1
  • Datawhale 25年7月组队学习coze-ai-assistant Task1学习笔记:动手实践第一个AI Agent—英伦生活口语陪练精灵
  • yolov5、yolov8、yolov11、yolov12如何训练及轻量化部署-netron-onnx
  • echarts折线图的 线条的样式怎么控制
  • Python os模块完全指南:从入门到实战
  • python编程实现GUI界面的排序与查找算法动态模拟演示程序
  • Sa-Token使用要点
  • mongoDB安装初始化及简单介绍
  • 2025/7/15——java学习总结
  • Pandas 和 NumPy 使用文档整理
  • 大宗现货电子盘交易系统核心功能代码解析
  • QT6 源,六章事件系统(8)QEvent 的孙子类:QEnterEvent 光标进入
  • 无穿戴动捕如何凭借摄像头视觉识别算法,赋能高校专业教学革新?
  • python进阶
  • 145-变分模态分解VMD与平稳小波变换SWT信号降噪算法实现!
  • 4G模块 A7680通过MQTT协议连接到onenet(新版)
  • WebAPIs基本认知,DOM基础介绍
  • 基于Springboot+UniApp+Ai实现模拟面试小工具五:权限校验参数校验及日志功能实现
  • Ubuntu 22.04 安装 mysql-server与 postgreSQL 服务端
  • el-tooltip 快速滚动的时候出现残影如何解决 vue3
  • 30.安卓逆向2-frida hook技术-hook So文件(获取app加载的所有模块、导入函数、导出函数、hook SO函数)
  • 区块链发展史全景长图
  • 强化学习Reinforcement Learning