redis机制详解

RDB 快照机制

在默认情况下,Redis 会将内存数据库的快照存储在名为 “dump.rdb” 的二进制文件中。同时,你可以通过相关设置,让 Redis 在满足特定条件时自动保存数据集。例如,设定 “save 60 1000”,意味着当在 60 秒内数据集至少有 1000 个键被改动时,Redis 就会自动保存一次数据集。若想关闭 RDB 功能,只需将所有的 save 保存策略注释掉即可。

除了自动保存,还能手动生成 RDB 快照。进入 Redis 客户端后,执行 “save” 或 “bgsave” 命令都可以生成 “dump.rdb” 文件。需要注意的是,每次执行这些命令时,都会依据当前 Redis 的内存状态生成一个全新的 rdb 文件,并覆盖原有的 rdb 快照文件。

bgsave 的写时复制(COW)机制

Redis 借助操作系统提供的写时复制(Copy-On-Write,COW)技术,实现了在生成快照的同时,依然能够正常处理写命令。具体而言,“bgsave” 子进程是由主线程通过 “fork” 操作生成的,它能够共享主线程的所有内存数据。在 “bgsave” 子进程运行后,会开始读取主线程的内存数据,并将其写入 RDB 文件。

在此过程中,如果主线程只是对数据执行读操作,那么主线程和 “bgsave” 子进程之间互不干扰。然而,要是主线程要修改某块数据,这块数据就会被复制一份副本出来,“bgsave” 子进程会把这个副本数据写入 RDB 文件,而主线程依旧可以直接对原来的数据进行修改操作。

另外,配置自动生成 rdb 文件时,后台采用的就是 “bgsave” 方式。

AOF(append-only file)机制

虽然快照功能能对数据进行一定程度的持久化,但它并非十分耐久。倘若 Redis 因某些原因出现故障停机,服务器将会丢失那些最近写入却还没来得及保存到快照中的数据。

从 Redis 1.1 版本起,新增了一种具有更高耐久性的持久化方式 ——AOF 持久化。它会将每一条修改数据集的指令记录到 “appendonly.aof” 文件中(先写入操作系统缓存,每隔一段时间再通过 “fsync” 操作同步到磁盘)。

例如,执行 “set zhuge 666” 命令后,在 aof 文件里会按照 resp 协议格式记录相应数据,其中星号后面的数字表示命令包含的参数个数,“$” 号后面的数字代表对应参数的字符个数。要是执行带过期时间的 set 命令,比如 “set tuling 888 ex 1000”,aof 文件里记录的并非原始执行命令,而是记录 key 过期的时间戳。

可以通过修改配置文件开启 AOF 功能,只需设置 “appendonly yes” 即可。此后,每当 Redis 执行一个会改变数据集的命令(如 SET 命令)时,该命令就会被追加到 AOF 文件的末尾。如此一来,当 Redis 重新启动时,就能通过重新执行 AOF 文件中的命令来重建数据集。

关于 AOF 文件数据同步到磁盘的频率,有以下三种配置选项:

  1. appendfsync always:每次有新命令追加到 AOF 文件时,就执行一次 “fsync” 操作。这种方式虽然安全性很高,但速度很慢。
  2. appendfsync everysec:每秒执行一次 “fsync” 操作,它兼顾了速度和安全性,在出现故障时,最多只会丢失 1 秒钟的数据,也是推荐且默认的设置方式。
  3. appendfsync no:从不执行 “fsync” 操作,而是将数据交由操作系统自行处理。这种方式速度更快,但相对来说不太安全。

AOF 重写机制

随着 Redis 的使用,AOF 文件中可能会积累大量无用的指令。为此,AOF 会定期依据内存中的最新数据来重新生成 aof 文件。

例如,执行了一系列命令后,经过重写,AOF 文件中的内容会根据内存最新状态进行优化调整。

有两个配置项可用于控制 AOF 自动重写的频率:

  1. # auto‐aof‐rewrite‐min‐size 64mb:表示 aof 文件至少要达到 64M 的大小才会自动触发重写。因为文件太小的话,恢复速度本身就比较快,重写的意义不大。
  2. # auto‐aof‐rewrite‐percentage 100:意味着 aof 文件自上一次重写后,若文件大小增长了 100%,则会再次触发重写操作。

当然,AOF 也支持手动重写,进入 Redis 客户端执行 “bgrewriteaof” 命令即可进行重写。值得注意的是,AOF 重写时,Redis 同样会 “fork” 出一个子进程去执行相关操作,这与 “bgsave” 命令类似,不会对 Redis 正常处理命令造成过多影响。

RDB 和 AOF 的选择及混合持久化

在实际生产环境中,既可以启用 RDB,也可以启用 AOF。当 Redis 启动时,如果同时存在 rdb 文件和 aof 文件,会优先选择 aof 文件来恢复数据,毕竟通常情况下,aof 文件中的数据相对更全面一些。

Redis 4.0 版本引入了混合持久化这一选项(需先开启 AOF),通过配置 “# aof‐use‐rdb‐preamble yes” 即可开启该功能。开启混合持久化后,AOF 在重写时,不再仅仅是把内存数据转换为 RESP 命令写入 AOF 文件,而是会先对重写这一刻之前的内存做 RDB 快照处理,然后将 RDB 快照内容与增量的 AOF 修改内存数据的命令整合在一起,一同写入新的 AOF 文件。新生成的文件一开始并不叫 “appendonly.aof”,待重写完成后才会进行改名,并覆盖原有的 AOF 文件,完成新旧文件的替换。

借助混合持久化功能,在 Redis 重启时,可以先加载 RDB 的内容,再重放增量 AOF 日志,这样就无需像以往那样全量重放 AOF 文件,从而大幅提升了重启效率。混合持久化后的 AOF 文件有着特定的结构,以此来保障数据恢复的准确性和高效性。

Redis 数据备份策略

以下是一些常见的 Redis 数据备份策略示例:

  1. 编写 crontab 定时调度脚本,每小时将 rdb 文件或 aof 文件备份一份到指定目录中,并且仅保留最近 48 小时内的备份文件,及时清理过期的备份,避免占用过多磁盘空间。
  2. 每天保留一份当日的数据备份到特定目录,这样可以保留最近 1 个月的备份数据,方便在需要时进行历史数据回溯或数据恢复操作。
  3. 在每次进行备份复制操作时,对那些太过陈旧的备份文件进行删除处理,确保磁盘空间的合理利用以及备份数据的有效性。
  4. 每天晚上将当前机器上的备份文件复制一份到其他机器上,以此来防范因当前机器损坏等意外情况导致的数据丢失问题,增强数据的安全性和冗余性。

Redis 主从架构

配置从节点及主从工作原理

搭建 Redis 主从架构时,配置从节点需要进行相应的操作步骤。

当为 master 配置了一个 slave 后,无论这个 slave 是首次连接 Master,还是后续重新连接,它都会向 master 发送一个 PSYNC 命令来请求复制数据。

Master 收到 PSYNC 命令后,会在后台通过 “bgsave” 方式生成最新的 rdb 快照文件。在持久化过程中,Master 并不会停止接收客户端的请求,而是会把那些可能修改数据集的请求缓存在内存中。

待持久化操作完成后,Master 会将生成的 rdb 文件数据集发送给 slave,slave 接收到数据后,会先进行持久化生成 rdb 文件,再将其加载到内存中。之后,Master 还会把之前缓存在内存中的命令发送给 slave,确保 slave 能完整地复制 master 的数据状态。

并且,当 master 与 slave 之间的连接由于某些原因断开后,slave 具备自动重连 Master 的能力。如果 master 同时收到多个 slave 的并发连接请求,它只会进行一次持久化操作,然后把这份持久化的数据发送给所有并发连接的 slave,避免了重复的资源消耗。

数据部分复制(断点续传)

从 Redis 2.8 版本开始,在 master 和 slave 断开重连的情况下,不再总是进行全量数据复制,而是可以支持部分数据复制(类似断点续传功能),这得益于 PSYNC 命令的使用。

Master 会在其内存中创建一个用于复制数据的缓存队列,用来缓存最近一段时间的数据。Master 和它所有的 slave 都各自维护了复制的数据下标 “offset” 以及 Master 的进程 ID。

当网络连接断开后,slave 会向 master 请求继续进行未完成的复制操作,从所记录的数据下标开始进行。不过,如果 Master 的进程 ID 发生了变化,或者从节点数据下标 “offset” 太过陈旧,已经超出了 Master 的缓存队列范围,那么就会进行一次全量数据的复制。

缓解主从复制风暴

若存在很多从节点,可能会出现主从复制风暴的情况,即多个从节点同时向主节点请求复制数据,导致主节点压力过大。针对这种情况,可以通过合理的架构设计来进行优化,例如让部分从节点与已经和主节点同步过的从节点进行数据同步,以此分担主节点的压力,优化整个主从复制的流程和性能。

希望以上优化后的内容能让你对 Redis 的这些核心机制和架构有更清晰、顺畅的理解,如果你还有其他疑问或者需要进一步详细介绍某些部分,可以随时告诉我哦。

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

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

相关文章

idea_卸载与安装

卸载与安装 卸载1、设置 -> 应用2、查找到应用,点击卸载3、把删除记录和设置都勾选上4、删除其它几个位置的残留 安装1、下载安装包2、欢迎安装 -> Next3、选择安装目录 -> Next4、创建快捷图标和添加到环境变量5、确认文件夹的名称 -> Install6、完成安…

学习threejs,使用specularMap设置高光贴图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshPhongMaterial高…

UR开始打中国牌,重磅发布国产化协作机器人UR7e 和 UR12e

近日,优傲(UR)机器人公司立足中国市场需求,重磅推出UR7e和UR12e 两款本地化协作机器人。它们延续优傲(UR)一以贯之的高品质与性能特质,着重优化负载自重比,且在价格层面具竞争力&…

2024年陕西科技大学数据结构程序填空题+预测

递归实现插入排序 #include <stdio.h>void insertion_sort(int arr[], int n) {if (n > 1){insertion_sort(arr, n - 1);arr[0] arr[n];int i;for (i n - 1; i > 0; i--){if (arr[i] > arr[0]){arr[i 1] arr[i];}else{break;}}arr[i 1] arr[0];} }int m…

OGRE 3D----3. OGRE绘制自定义模型

在使用OGRE进行开发时,绘制自定义模型是一个常见的需求。本文将介绍如何使用OGRE的ManualObject类来创建和绘制自定义模型。通过ManualObject,开发者可以直接定义顶点、法线、纹理坐标等,从而灵活地构建各种复杂的几何体。 Ogre::ManualObject 是 Ogre3D 引擎中的一个类,用…

基于PoE交换机的智慧停车场监控组网应用

伴随城市发展快速&#xff0c;汽车保有量也不断增长&#xff0c;导致停车管理问题也愈发凸显。针对包括路侧停车位、地面停车场、地下停车场等场景的停车管理需求&#xff0c;通常会部署监控设备进行车位监测、现场安全监测等&#xff0c;助力构建智能化停车管理。因此如何为分…

直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例

在嵌入式开发中&#xff0c;位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算&#xff0c;并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…

多点DMALL启动招股:将在港交所上市,聚焦数字零售服务

近日&#xff0c;多点数智有限公司&#xff08;Dmall Inc.&#xff0c;下称“多点”或“多点DMALL”&#xff09;发布全球发售文件&#xff0c;于11月28日至12月3日招股&#xff0c;预计将于2024年12月6日在港交所主板挂牌上市。 招股书显示&#xff0c;多点DMALL本次全球发售的…

WRF-Chem模式安装、环境配置、原理、调试、运行方法;数据准备及相关参数设置方法

大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因素是控制大气污染的关键自然因素。大气污染问题既是局部、当地的&#xff0c;也是区域的&#xff0c;甚至是全球的。本地的污染物排放除了对当地造成严重影响外&#xff0c;同时还会在…

离线安装 Docker-IO:详细步骤指南

离线安装 Docker-IO:详细步骤指南 一、准备工作1.1 下载 Docker 离线安装包1.2 准备安装环境1.3 配置防火墙和 SELinux(可选)二、上传和解压离线安装包2.1 上传安装包2.2 解压安装包三、安装 Docker-IO3.1 移动 Docker 文件到系统目录3.2 配置 Docker 服务3.3 赋予服务文件执…

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者&#xff1a;陈承 背景 在 2018 年的 2 月&#xff0c;ARMS Java Agent 的第一个版本正式发布&#xff0c;为用户提供无侵入的的可观测数据采集服务。6 年后的今天&#xff0c;随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长&#xff0c;我们逐渐发现过…

【信息系统项目管理师】第3章:信息系统治理 考点梳理

文章目录 3.1 IT 治理3.1.1 IT治理基础3.1.2 IT治理体系3.1.3 IT治理任务3.1.4 IT治理方法与标准 3.2 IT 审计3.2.1 IT审计基础3.2.2 审计方法与技术3.2.3 审计流程3.2.4 审计内容 3.1 IT 治理 IT治理起到重要的统筹、评估、指导和监督作用。 信息技术审计(IT审计)作为与IT治…

DRM(数字权限管理技术)防截屏录屏----ffmpeg安装

提示&#xff1a;ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…

github webhooks 实现网站自动更新

本文目录 Github Webhooks 介绍Webhooks 工作原理配置与验证应用云服务器通过 Webhook 自动部署网站实现复制私钥编写 webhook 接口Github 仓库配置 webhook以服务的形式运行 app.py Github Webhooks 介绍 Webhooks是GitHub提供的一种通知方式&#xff0c;当GitHub上发生特定事…

全桥LLC变换器原理及MATLAB仿真模型

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 主电路拓扑 全桥LLC 谐振变换器主电路拓扑结构图。图中S1 &#xff5e; S4为功率开关管&#xff0c; D1 &#xff5e; D4为功率开关管的体二极管&#xff0c; C1 &#xff5e; C4 为功率开关管的寄生电容。谐振电感r…

使用R语言进行美国失业率时空分析(包括绘图)

今天写一篇利用R语言&#xff0c;针对面板数据的简单分析与绘图。让我们直接开始把。 一、数据准备 这次的示例数据非常简单&#xff0c;只有一个shp格式的美国区县矢量数据&#xff0c;我们在QGIS中打开数据查看一下它的属性表。事实上我们需要的数据都在属性表的字段中。 二…

PostgreSQL在Linux环境下的常用命令总结

标题 登录PgSQL库表基本操作命令新建库表修改库表修改数据库名称&#xff1a;修改表名称修改表字段信息 删除库表pgsql删除正在使用的数据库 须知&#xff1a; 以下所有命令我都在Linux环境中执行验证过&#xff0c;大家放心食用&#xff0c;其中的实际名称换成自己的实际名称即…

React Native学习笔记(三)

一 组件简介 1.1 简介 RN中的核心组件&#xff0c;是对原生组件的封装 原生组件&#xff1a;Android或ios内的组件核心组件&#xff1a;RN中常用的&#xff0c;来自react-native的组件 原生组件 在 Android 开发中是使用 Kotlin 或 Java 来编写视图&#xff1b;在 iOS 开发…

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前&#xff0c;TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore&#xff0c;完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

基于matlab程序实现人脸识别

1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现&#xff0c;肤色聚类区域在Cb—Cr子平面上的投影将缩减&#xff0c;与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。…