Redis 持久化策略

Redis 提供了多种持久化机制,用于将数据保存到磁盘中,以防止因服务器重启或故障而导致的数据丢失。主要的持久化策略有两种:RDB (Redis Database) 和 AOF (Append Only File),即当 Redis 服务器重新启动时,会读取相应的文件,来还原上次退出时的数据;

一、RDB

RDB 是 Redis 默认的持久化方式,它会定期的将 Redis 内存中的所有数据都写入硬盘中,生成一个 "快照"——.rdb 二进制文件

"定期" 又有两种方式:

1)手动触发

程序员通过 Redis 客户端,执行特定的命令(save,bgsave)来触发快照的生成;

  1. save 命令:执行 save 命令的时候,redis 就会全力以赴的进行 "快照生成" 操作,此时就会阻塞 redis 的其他客户端的命令,直到 RDB 过程完成为止,对于内存比较大的实例造成长时间阻塞,基本不采用;
  2. bgsave 命令:background,该命令不会影响 Redis 服务器处理其他客户端的请求和命令,该命令通过多进程的方式实现,Redis 进程执行 fork 操作创建子进程,RDB 持久化由子进程负责,完成后自动结束,阻塞只发生在 fork 创建进程阶段,这个时间很短;
    1. 执行 bgsave 命令,Redis 父进程判断当前进是否存在其他正在执行的子进程,如 RDB / AOF 子进程,如果存在,bgsave 命令会直接返回;
    2. 父进程执行 fork 创建子进程,fork 过程中父进程会阻塞,通过 info stats 命令查看 latest_fork_usec 选项,可以获取最近⼀次 fork 操作的耗时,单位为微秒;
    3. 父进程 fork 操作执行完成后,bgsave 命令返回 "Background saving started" 信息并不再阻塞父进程,此时父进程可以继续响应其他命令;
    4. 子进程创建 rdb 文件,根据父进程内存生成临时快照文件,完成后对原有文件进行原子替换;执行 lastsave 命令可以获取最后一次生成 rdb 的时间,对应 info 统计的rdb_last_save_time 选项;
    5. 进程发送信号给父进程表示完成,父进程更新统计信息; 

通过 save 命令 手动触发 RDB 

通过 bgsave 命令手动触发 RDB

rdb 文件保存在 dir 配置指定的目录(默认 /var/lib/redis/)下,文件名通过 dbfilename 配置(默认 dump.rdb)指定,/user/bin/ 目录下有检测 rdb 文件的工具 redis-check-rdb,通过 redis-check-rdb rdb 文件名的方式检查 rdb 文件;

如果 Redis 启动时加载到损坏的 rdb 文件会拒绝启动,此时可以使用 Redis 提供的 redischeck-dump 工具检测 rdb 文件并获取对应的错误报告; 也可以通过查看 Redis 的日志查看错误问题,日志文件默认在 /var/log/redis/ 目录下;

通过 bgsave 生成 rdb 文件时,会把要生成的快照数据保存在一个临时文件中,当这个快照生成完毕之后,再删除之前的 rdb 文件,把新生成的临时文件名修改为删除的 rdb 文件名(可通过 stat 命令查看文件的 Inode 编号);

2)自动触发

在 Redis 的配置文件中可以看到这样的信息;

 "save m n" 表示 m 秒内数据集发生了 n 次修改时,自动 RDB 持久化,既要满足经过 m 秒,还要满足达到 n 次修改;

以下情况也会自动触发 rdb

  1. 在 Redis 服务器关闭时也会自动触发
  2.  Redis 进行主从复制的时候,主节点也会自动生成 rdb 快照,然后把 rdb 文件内容传输给从节点;
  3. 执行 flushall,flashdb 命令

3)RDB 的优缺点

优点
  1. 高效的磁盘IO:由于是定期生成快照,RDB 文件的磁盘 IO 操作相对集中,通常比 AOF 的每次写操作同步更加高效。
  2. 快速恢复:RDB 文件是一个紧凑的二进制文件,加载速度较快,适合用于快速数据恢复。
  3. 简单文件结构:RDB 文件结构相对简单,文件较小,便于传输和备份。
缺点
  1. 数据持久化的时间间隔:RDB 是基于时间间隔生成快照的,在两次快照之间的数据可能会丢失。如果 Redis 崩溃(通过 kill -9 杀掉 redis 进程),则最后一次快照之后的所有数据都将丢失,即不能实时的持久化保存数据。
  2. 生成快照时的性能开销:生成快照时,尤其是对大数据集生成快照,可能会对 Redis 的性能产生影响。
  3. 存在兼容性问题:Redis 版本演进过程中有多个 RDB 版本,兼容性可能有风险。

二、AOF

AOF 默认是关闭状态,需要修改配置文件(改为 yes)来开启 AOF 功能,当开启 AOF 的时候,RDB 就不生效了,即 Redis 启动时就不会读取 RDB 文件的内容了;同时 AOF 写入的是文本文件;

AOF 通过记录每个写操作的日志,以追加的方式写入日志文件,来实现数据持久化;

AOF 的主要作用是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式;

1)AOF 工作流程

1. 所有的写入命令会追加到 aof_buf(缓冲区)中;

2. AOF 缓冲区根据对应的策略(缓冲区刷新策略)向硬盘做同步操作;

3. 随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的;

4. 当 Redis 服务器启动时,可以加载 AOF 文件进行数据恢复;

可以看出 AOF 机制并非是直接让工作进程把数据写入硬盘,而是先写入一个内存的缓冲区,积累一波后,再统一写入硬盘,若在缓冲区还没来得及写入硬盘的时候,此时进程异常结束,主机掉电,则缓冲区的数据会丢失;

因此 Redis 给出了缓冲区的刷新策略(类似于 MySQL 的事务隔离级别),通过 appendfsync 选项进行配置,默认为 everysec,分别为:

  • always:每次有写操作时,立即将数据写入 AOF 文件并同步到磁盘;
  • everysec:每秒将缓冲区中的数据写入 AOF 文件并同步到磁盘,Redis 使用后台线程每秒执行一次 fsync
  • no:让操作系统决定何时将缓冲区中的数据写入 AOF 文件并同步到磁盘。Redis 只负责将数据写入缓冲区,不主动执行 fsync

2)AOF 的重写机制

随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,Redis 引入 AOF 重写机制压缩文件体积;AOF 文件重写是把 Redis 进程内的数据转化为写命令同步到新的 AOF 文件;

重写后的 AOF 文件为什么可以变小?有如下原因:

  • 进程内已超时的数据不再写入文件; 
  • 旧的 AOF 中的无效命令,例如 del、hdel、srem 等重写后将会删除,只需保留数据的最终版本;
  • 多条写操作合并为⼀条,例如 lpush list a、lpush list b、lpush list c 从可以合并为 lpush list a b c;

较小的 AOF 文件不仅降低了硬盘空间占用,还可以提升启动 Redis 时数据恢复的速度; 

AOF 重写过程可以分为手动触发和自动触发

  • 手动触发:通过执行 bgrewriteaof 命令;

  • 自动触发:根据配置项 auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数确定自动触发时机;

    • auto-aof-rewrite-min-size:表示触发重写时 AOF 的最小文件大小,默认为 64MB;

    • auto-aof-rewrite-percentage:代表当前 AOF 占用大小相比较上次重写时增加的比例;

AOF 重写流程

1. 执行 AOF 重写请求,如果当前进程正在执行 AOF 重写,则请求不执行;如果当前进程正在执行 bgsave 操作,则会等待 bgsave 操作完成之后再执行;

2. 父进程执行 fork 创建子进程;

3. 重写

  1. 主进程 fork 之后,可以继续响应其他命令,所有修改操作写入缓冲区并根据缓冲区策略同步到硬盘,保证旧的 AOF 文件机制正确;
  2. 父进程生成一个 aof_rewrite_buf 重写缓冲区,用于存放 fork 之后的写数据(这部分数据也会在 aof_buf 中存在);

4. 子进程根据内存快照,将命令合并到新的 AOF 文件中(精简旧的 AOF 文件);

5. 子进程完成重写

  1. 新文件写入后,子进程发送信号给父进程;
  2. 父进程把 AOF 重写缓冲区内临时保存的命令追加到新的 AOF 文件中;
  3. 用新的 AOF 文件替换旧的 AOF 文件;

3)AOF 的优缺点

优点
  1. 更高的数据安全性:AOF 可以配置为每次写操作后立即同步到磁盘或者每秒同步一次,从而提供不同程度的数据安全性,即使 Redis 崩溃,通过 AOF 文件可以恢复到最后一次写操作的状态(根据同步策略,数据丢失可以控制在最小范围内);
  2. 可读性:AOF 文件是一个纯文本文件,包含了所有写操作的记录,这使得它更容易阅读和理解;
缺点
  1. 性能开销:相比 RDB 快照,AOF 在每次写操作时都会进行磁盘写入,这可能会导致较高的 I/O 开销,尤其是在写操作频繁的场景中;
  2. 恢复速度:在 Redis 重启时,需要从 AOF 文件中重放所有的写操作来恢复数据,对于大型 AOF 文件,这个过程可能比较耗时,导致恢复速度较慢;

三、混合持久化

混合持久化结合了 RDB 和 AOF 两种持久化方式的优点,通过将 RDB 快照和 AOF 日志结合在一起,实现数据的高效持久性和快速恢复;

在 redis 配置文件中存在以下内容,表示是否开启了混合持久化(默认为 yes,表示开启);

优点:
  • 快速恢复:相比纯 AOF 持久化,混合持久化大大加快了恢复速度,因为大部分数据直接从 RDB 快照加载。
  • 高数据安全性:相比纯 RDB 持久化,混合持久化能确保更高的数据持久性,因为 AOF 日志记录了快照后的所有写操作。
  • 文件体积:通过合并 RDB 和 AOF,减少了持久化文件的体积增长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/730907.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SEGGER Embedded Studio IDE移植embOS

SEGGER Embedded Studio IDE移植embOS 一、背景介绍二、任务目标三、技术实现3.1 获得embOS3.2 创建SES工程3.2.1 创建初始Solution和Project3.2.2 制作项目文件结构3.2.3 移植embOS库和有关头文件3.2.3.1 头文件3.2.3.2 库文件3.2.3.3 创建RTOSInit.c源文件3.2.3.4 OS_Error.c…

鸿蒙HarmonyOS NEXT角落里的知识:ArkTS高性能编程实践

概述 本文主要提供应用性能敏感场景下的高性能编程的相关建议,助力开发者开发出高性能的应用。高性能编程实践,是在开发过程中逐步总结出来的一些高性能的写法和建议,在业务功能实现过程中,我们要同步思考并理解高性能写法的原理…

信息学奥赛初赛天天练-31-CSP-J2022基础题-指针、数组、链表、进制转换、深度优先搜索、广度优先搜索、双栈实现队列应用

PDF文档公众号回复关键字:20240621 2022 CSP-J 选择题 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项) 3.运行以下代码片段的行为是 ( ) int x 101; int y 201; int * p &x; int * q &y;…

【Java】已解决java.net.ProtocolException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.net.ProtocolException异常 在Java的网络编程中,java.net.ProtocolException异常通常表示在网络通信过程中,客户端或服务器违反了某种协议规则。…

ASP.NET Core 6.0 启动方式

启动方式 Visualstudio 2022启动 IIS Express IIS Express 是一个专为开发人员优化的轻型独立版本的 IIS。 借助 IIS Express,可以轻松地使用最新版本的 IIS 开发和测试网站。 控制台版面 直接在浏览器输入监听的地址,监听的是 http://localhost:5137 脚本启动 dotnet run…

Java中将文件转换为Base64编码的字节码

在Java中,将文件转换为Base64编码的字节码通常涉及以下步骤: 读取文件内容到字节数组。使用java.util.Base64类对字节数组进行编码。 下面是一个简单的Java示例代码,演示如何实现这个过程: import java.io.File; import java.io…

添加右键菜单(以git为例)

1、打开注册表编辑器 打开系统注册表,使用组合键“Win R”输入“regedit”。 依次展开”HKEY_CLASSES_ROOT\Directory\Background\shell”。 2、新建右键菜单项 在[Background]下找到“shell”如果没有则新建项shell,接着在“shell”下右键-新建项名…

Linux 线程的同步与互斥

💓博主CSDN主页:麻辣韭菜💓   ⏩专栏分类:Linux初窥门径⏪   🚚代码仓库:Linux代码练习🚚   🌹关注我🫵带你学习更多Linux知识   🔝 前言 1.资源共享问题 2.进程线程间的互斥…

谁拥有数字营销平台即拥有企业竞争力!

掌握数字营销平台,就等于掌握企业竞争力! 宝子们,咱今天来聊聊这个事儿哈。在现在这个数字化的时代,拥有像蚓链这样的数字营销平台那可太重要啦! 想想看,有了它,企业就能更广、更快地去推广…

创新案例|星巴克中国市场创新之路: 2025目标9000家店的挑战与策略

星巴克创始人霍华德舒尔茨:“为迎接中国市场的全面消费复苏,星巴克2025年推进9000家门店计划,将外卖、电商以及家享和外出场景咖啡业务纳入中国新一轮增长计划中。”在面临中国市场同店增长大幅下滑29%背景下,星巴克通过DTC用户体…

Word中删除空白页

① 文字后面出现的空白页 把鼠标放在空白页的位置,按住Ctrl Delete即可。 ② 表格后面的空白页 把鼠标放在空白页左侧,直到出现一个空白的箭头,点击一下选中空白页,然后再Ctrl D,打开字体选项卡,在效果中…

舔狗日记Puls微信小程序源码

源码介绍: 这是一款舔狗日记Puls微信小程序源码,提供每日一舔的功能,让你舔到最后,什么都有! 源码通过API获取一些舔狗日记,内置了100多句舔狗日记,让你摆脱上班摸鱼的无聊时光, …

[240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞

目录 Anthropic 发布 Claude 3.5 Sonnet AI 助手Scoket.IO 拒绝服务漏洞(CVE-2024-38355) Anthropic 发布 Claude 3.5 Sonnet AI 助手 Claude 3.5 Sonnet: 更智能、更快速、更安全的 AI 助手 一、 引言 Anthropic 发布了 Claude 3.5 Sonnet&#xff0…

C语言中操作符详解(一)

众所周知,在我们的C语言中有着各式各样的操作符,并且在此之前呢,我们已经认识并运用了许许多多的操作符,都是诸君的老朋友了昂 操作符作为我们使用C语言的一个非常非常非常重要的工具,诸君一定要加以重视,…

DevOps学习回顾01-技能发展路线-岗位能力-体系认知

事为先,人为重–事在人为 参考来源: 极客时间专栏:DevOps实战笔记,作者:石雪峰 课程链接:https://time.geekbang.org/column/intro/235 时代的典型特征 VUCA VUCA 是指易变性(Volatility&…

【Android面试八股文】你能说一说自定义View与ViewGroup的区别

文章目录 Android UI 组件:View 和 ViewGroupViewGroup 的职责View 的职责自定义 View 和 ViewGroup 的区别1. 继承的类不同2. 主要功能不同3. 重写方法不同4. 使用场景不同5. 事件分发方面的区别6. UI 绘制方面的区别Android UI 组件:View 和 ViewGroup 在 Android 开发中,…

AI通用大模型不及垂直大模型?各有各的好

​​​​​​​AI时代,通用大模型和垂直大模型,两者孰优孰劣,一直众说纷纭。 通用大模型,聚焦基础层,如ChatGPT、百度文心一言,科大讯飞星火大模型等,都归属通用大模型,它们可以解答…

使用ASP.NET Core封装接口请求参数格式

有些人获取接口请求参数是直接使用数据库实体类来获取的,这种方式虽然写起来很方便,但是会导致swagger接口文档出现很多没用的参数,让人看着不舒服。 比如,新增用户只需要传用户名、密码、邮箱就可以了,但是实体类也包…

@ModelAttribute

基础知识 1.ModelAttribute注解源码,从中可以知道,该注解可以标注在参数上和方法上 2.应用场景:先大致有个概念,可以用来存储项目根路径 3.介绍:ModelAttribute 是 Spring 框架中的一个注解,用于在 Spring …

Go微服务: redis分布式锁在集群中可能遇到的问题及其解决方案

概述 我们的 redis 一般都是集群来给我们程序提供服务的,单体的redis现在也不多见 看到上面是主节点redis和下面是6个重节点redis,主节点和重节点的通讯都是畅通没问题的这个时候,我们有 gorouting 写我们的数据,那它就会用到我们…