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

Redis 持久化机制:AOF 与 RDB 详解

一.Redis的持久化机制

Redis 是基于内存型的 NoSQL,和 MySQL 是不同的,使用内存存储进行数据缓存。

如果想要实现数据的持久化,Redis 也可支持将内存数据保存到硬盘文件中。

Redis 支持两种数据持久化保存方法:

  • RDB: Redis DataBase
  • AOF: Append Only File

以MySQL 做类比RDB类似MySQL dump,AOF类似 MySQL binlog。

二.RDB

RDB(Redis DataBase):是基于某个时间点的快照,注意 RDB 只保留当前最新版本的一个快照。

相当于 MySQL 中的完全备份。

RDB 持久化功能生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成该 RDB 文件时数据存储的状态。因为 RDB 文件是保存在磁盘中的,所以即使 Redis 服务器进程甚至服务器崩机,只要配置 RDB 文件存在,就能将数据恢复。

RDB 支持 savebgsave 两种命令实现数据文件的持久化。 

  • SAVE命令用于执行同步保存操作,它会将当前Redis实例的所有数据快照以RDB文件的形式保存到硬盘上。这个命令会阻塞所有其他客户端,直到保存操作完成,因此在生产环境中不推荐使用。
  • BGSAVE 命令用于在后台异步保存当前数据库的数据到磁盘。执行 BGSAVE 命令后,Redis 会立即返回 OK,然后 fork 出一个新子进程。原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出

save 会阻止其它指令的执行,有可能会造成阻塞,bgsave

通过以下命令查看 BGSAVE 是否成功

redis-cli INFO persistence

开启RDB

通过 redis.conf 配置文件开启 RDB,找到 save 配置项,并确保以下内容未被注释(没有 # 号)

例如:

save 900 1   # 900秒(15分钟)内至少有1次写操作
save 300 10  # 300秒(5分钟)内至少有10次写操作
save 60 10000  # 60秒(1分钟)内至少有10000次写操作

修改RDB文件路径

如图,配置文件中dir和dbfilename 组成了RDB文件的存放路径。

三.AOF

AOF (Append-Only File) 是 Redis 提供的一种 持久化机制,它通过 将每一个写入命令追加到日志文件 来确保数据不会丢失。相比于 RDB (Redis Database File),AOF 提供了更高的数据安全性,但相应地也会增加磁盘 I/O 负担。

AOF 即 AppendOnlyFile,AOF 和 RDB 都遵守 COW 机制,AOF 可以决定不同的保存策略,默认为每秒钟执行一次 fsync,按照操作的顺序将修改命令追加至指定的 AOF 日志文件尾部。

在第一次启用 AOF 功能时,会做一次完全备份,后续将持续性备份,相当于完整数据备份 + 增量变化。

如果同时启用 RDB 和 AOF,进行恢复时,默认以 AOF 文件优先级高于 RDB 文件,因此会使用 AOF 文件进行恢复。

在第一次开启 AOF 功能时,会自动备份所有状态到 AOF 文件中,后续只会记录数据的更新指令。

注意:AOF 模式默认是关闭的,第一次开启 AOF 并在服务器发生故障后,会因为 AOF 的优先级高于 RDB,而 AOF 默认没有数据文件存在,从而导致所有数据丢失。

AOF的开启

直接修改配置文件(不推荐,会丢数据)

把此项设置为yes

设置AOF文件路径和文件名

动态修改(推荐)

 动态修改之后再修改配置文件

修改AOF增量日志 恢复误删除数据

如图,误删除数据,下面通过修改AOF增量数据恢复误删除数据。

 把误删除的指令删除重新启动服务。

恢复成功

AOF rewrite重写 

将一些重复的,可以合并的,过期的数据重新写入一个新的AOF文件,从而节约AOF备份占用的硬盘空间,也能加速恢复
可以手动执行bgrewriteaof触发AOF,第一次开启AOF功能,或定义自动rewrite策略

AOF rewrite过程
父进程生成一个新的子进程负责生成新的AOF文件,同时父进程将新的数据更新同时写入两个缓冲区aof_buff和aof_rewrite_buf 

 

 实现AOF rewrite

在 Redis CLI 执行

bgrewriteaof

动态修改

CONFIG SET auto-aof-rewrite-percentage 100
CONFIG SET auto-aof-rewrite-min-size 64mb
  • auto-aof-rewrite-percentage 100:表示 AOF 文件比上次重写后的大小 增长 100%(即翻倍)时,触发 AOF 重写。
  • auto-aof-rewrite-min-size 64mb:只有当 AOF 文件达到 64MB 以上时才会触发重写。

如果要使该配置永久生效,需要修改 redis.conf,然后重启

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

 

rewrite相关配置
#同时在执行bgrewriteaof操作和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞 的情形,以下参数实现控制

no-appendfsync-on-rewrite no      #在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步策略,主要考虑磁盘1O开支和请求阻塞时间。 #默认为no,表示"不暂缓”,新的aof记录仍然会被立即同步到磁盘,是最安全的方式,不会丢失数据,但是要忍受阻塞的问题
#为yes,相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就 会丢失数据。丢失多少数据呢?Linux的默认fsync策略是30秒,最多会丢失30s的数据,但由于yes性能较好而且会避免出现阻塞因此比较推荐

#rewrite 即对aof文件进行整理,将空闲空间回收,从而可以减少恢复数据时间

auto-aof-rewite-percentage 100 #当Aof log增长超过指定百分比例时,重写AOF文件,设置为0表示不自动重写Aof日志,重写是为了使aof体积保持最小,但是还可 以确保保存最完整的数据

auto-aof-rewrite-min-size 64mb #触aof rewrite的最小文件大小

aof-load-truncated yes#是否加载由于某些原因导致的未尾异常的AOF文件(主进程被kill/断电等),建议yes

 

 

 


http://www.kler.cn/a/589662.html

相关文章:

  • 使用Ollama本地部署DeepSeek
  • (hash表+vector 数位和相等数对的最大和)leetcode 2342
  • CUDA多线程
  • EB-Cable许可证的常见问题及解决方案
  • 贪心算法(7)(java) 分发饼干
  • C#语法基础总结
  • 蓝桥杯省赛(2024)
  • 如何创建HTML自定义元素:使用 Web Component 的最佳实践
  • 从零精通机器学习:线性回归入门
  • 书摘 ASP.NET Core技术内幕与项目实战:基于DDD与前后端分离
  • Flink 初体验:从 Hello World 到实时数据流处理
  • Chat2DB:让数据库管理像聊天一样简单
  • Windows 命令行终端常用的基础命令
  • RxSwift 学习笔记第四篇之RxSwift在项目中的简单应用
  • (C语言)指针与指针数组的使用教学(C语言基础教学)(指针教学)
  • Java中的消息中间件对比与解析:RocketMQ vs RabbitMQ
  • Matlab GPU加速技术
  • 蓝桥杯备赛(基础语法3)
  • 嵌入式八股,手撕线程池(C++)
  • vue3+Ts+elementPlus二次封装Table分页表格,表格内展示图片、switch开关、支持