Redis 事件机制详解

Redis 事件机制详解

Redis 的事件机制是其高性能和高并发能力的关键之一,它采用Reactor 模型,基于文件事件驱动机制实现高效的 I/O 处理。Redis 的事件机制主要分为以下几类:

  1. 文件事件(File Event) —— 处理网络 I/O,如客户端请求、响应、数据同步等。
  2. 时间事件(Time Event) —— 处理定时任务,如过期键清理、定期任务等。
  3. 事件分派机制 —— 负责协调和分发上述事件。

1. 文件事件(File Event)

1.1 概述

Redis 采用单线程处理客户端请求,但借助 I/O 多路复用 实现了对大量客户端连接的高效管理。文件事件机制主要用于:

  • 处理客户端的请求和响应
  • 与其他 Redis 实例(主从复制)进行数据同步
  • 持久化(AOF 或 RDB)的文件操作

1.2 I/O 多路复用

Redis 通过 I/O 多路复用技术在单线程下监听多个客户端连接,底层可以使用:

  • epoll(Linux,推荐)
  • kqueue(BSD、macOS)
  • select(不推荐,性能较低)
  • poll(早期 Linux 版本)

不同操作系统会选择最佳的多路复用方式,例如,在 Linux 下 Redis 默认使用 epoll

1.3 文件事件的类型

Redis 的文件事件由 aeFileEvent 结构体管理,它定义了 Redis 可能监听的事件类型:

  • AE_READABLE :文件可读事件(客户端发送请求、主从同步数据)
  • AE_WRITABLE :文件可写事件(返回数据给客户端)

当某个事件发生时,会触发相应的回调函数,例如:

  • acceptTcpHandler:接受新的客户端连接
  • readQueryFromClient:读取客户端请求
  • sendReplyToClient:向客户端发送响应数据

1.4 事件的监听与触发

Redis 在 ae.c 文件中维护了一个事件驱动框架

  • aeCreateFileEvent():注册事件
  • aeDeleteFileEvent():删除事件
  • aeProcessEvents():监听并触发事件
  • aeMain():事件循环主函数,调用 aeProcessEvents() 处理所有事件

2. 时间事件(Time Event)

2.1 概述

时间事件用于执行定时任务,比如:

  • 服务器定期维护(清理过期 key、AOF 持久化)
  • 慢查询监控
  • 统计信息更新
  • 定期执行回调函数

2.2 时间事件的数据结构

时间事件由 aeTimeEvent 结构体管理,包括:

  • id:时间事件 ID
  • when:下一次执行的时间
  • timeProc:时间事件的回调函数
  • finalizerProc:事件清理函数

2.3 Redis 主要的时间事件

  • serverCron()(默认 100ms 执行一次)
    • 关闭空闲连接
    • 处理过期键
    • AOF 重写
    • 主从复制任务
  • activeExpireCycle()(过期键清理)
    • 采用惰性删除定期清理相结合的方式
  • bioProcessBackgroundJobs()(后台异步任务)
    • 用于 AOF、RDB 持久化

3. 事件分派机制(Reactor 模型)

3.1 事件循环(Event Loop)

Redis 采用事件驱动模型,其事件循环 aeMain() 负责不断监听和分派事件:

  1. 处理文件事件
  2. 处理时间事件
  3. 如果没有事件发生,则进入阻塞等待(降低 CPU 负载)

3.2 事件优先级

  • 文件事件优先级高于时间事件,即 Redis 会先处理网络 I/O,再处理定时任务。
  • 时间事件是定期执行的,而文件事件是随时触发的。

3.3 事件循环的核心代码

ae.c 中,aeMain() 负责整个事件循环:

void aeMain(aeEventLoop *eventLoop) {eventLoop->stop = 0;while (!eventLoop->stop) {int numevents;/* 计算下一个时间事件需要的时间间隔 */int64_t milliseconds = aeGetTimeTillNextEvent(eventLoop);/* 监听事件(I/O 多路复用) */numevents = aeApiPoll(eventLoop, milliseconds);/* 处理就绪的文件事件 */aeProcessEvents(eventLoop, AE_FILE_EVENTS);/* 处理时间事件 */aeProcessEvents(eventLoop, AE_TIME_EVENTS);}
}

Redis 通过 aeApiPoll() 调用底层的 epoll_wait()(或 select() 等)来监听事件。


4. Redis 事件机制的优势

Redis 采用单线程模型,但借助 I/O 多路复用,使其能够高效地处理大量并发请求,主要优势包括:

  1. 避免了线程切换开销:单线程避免了多线程带来的上下文切换开销。
  2. I/O 多路复用提升吞吐量epoll 提供高效的事件通知机制,支持高并发连接。
  3. 合理的事件优先级设计:优先处理网络 I/O,保证请求处理的实时性。
  4. 时间事件支持定时任务:自动管理过期键、持久化等任务。

5. 总结

Redis 的事件机制基于 Reactor 模型,由文件事件(I/O 处理)、时间事件(定时任务)和事件分派机制(事件循环)组成。其核心是 I/O 多路复用,使得单线程的 Redis 能够高效处理并发请求。

核心要点

  • 文件事件:基于 epoll 实现高效的网络 I/O 处理(请求、响应、主从同步)。
  • 时间事件:管理定时任务,如过期键清理、慢查询统计、持久化等。
  • 事件循环:协调文件事件和时间事件,确保高效运行。

Redis 通过事件驱动架构,保证了其高性能和高并发能力,是 NoSQL 数据库领域的标杆之一。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LangChain入门 3 Prompts组件】聊天提示词模板 ChatPromptTemplate

文章目录 一、 聊天信息提示词模板1.1 使用关键字1.2 使用SystemMessage, HumanMessage, AIMessage来定义消息1.3 使用MessagesPlaceholder 在特定未知添加消息列表 二、关键类介绍2.1 ChatPromptTemplate 类2.1.1 from_messages()2.1.2 format_messages()2.1.3 format_prompt(…

Flutter TextFormField 完全手册与设计最佳实践

目录 1. 引言 2. TextFormField 的基本用法 3. 主要属性 4. 自定义 TextFormField 样式 4.1 设置边框样式 4.2 设置输入格式限制 4.3 多行输入 5. 结论 相关推荐 1. 引言 在 Flutter 中,TextFormField 是 TextField 的扩展版本,专为表单输入设计…

HC-05与HC-06蓝牙配对零基础教程 以及openmv识别及远程传输项目的概述

这个是上一年的项目,之前弄得不怎么完整,只有一个openmv的,所以openmv自己去我主页找,这篇主要讲蓝牙 这个是我在使用openmv连接单片机1然后单片机1与单片机2通过蓝牙进行通信 最终实现的效果是:openmv识别到图形和数…

【Docker系列一】Docker 简介

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Vue 入门到实战 五

第5章 过渡与动画 目录 5.1 单元素/组件过渡 5.1.1 过渡class 5.1.2 CSS 过渡 5.1.3 CSS 动画 5.1.4 同时使用过渡和动画 5.1.5 JavaScript 钩子方法 5.2 多元素/组件过渡 5.2.1 多元素过渡 5.2.2 多组件过渡 5.3 列表过渡 5.3.1 列表的普通过渡 5.3.2 列表的平滑…

Apache SeaTunnel脚本升级及参数调优实战

最近作者针对实时数仓的Apache SeaTunnel同步链路,完成了双引擎架构升级与全链路参数深度调优,希望本文能够给大家有所启发,欢迎批评指正! Apache SeaTunnel 版本 :2.3.9 Doris版本:2.0.6 MySQL JDBC Conne…

C++ 时间操作:获取有史以来的天数与文件计数器

C 时间操作:获取有史以来的天数与文件计数器 在C中,时间操作是一个非常重要的功能,尤其是在需要处理日期、时间戳或定时任务时。本文将介绍如何利用C的时间操作功能,实现以下两个目标: 获取从Unix纪元时间&#xff0…

Python Bug修复案例分析:Python 中常见的 IndentationError 错误 bug 的修复

在 Python 编程的世界里,代码的可读性和规范性至关重要。Python 通过强制使用缩进来表示代码块的层次结构,这一独特的设计理念使得代码更加清晰易读。然而,正是这种对缩进的严格要求,导致开发者在编写代码时,稍有不慎就…

【论文笔记】Transformer

Transformer 2017 年,谷歌团队提出 Transformer 结构,Transformer 首先应用在自然语言处理领域中的机器翻译任务上,Transformer 结构完全构建于注意力机制,完全丢弃递归和卷积的结构,这使得 Transformer 结构效率更高…

CI/CD(三) 安装nfs并指定k8s默认storageClass

一、NFS 服务端安装(主节点 10.60.0.20) 1. 安装 NFS 服务端 sudo apt update sudo apt install -y nfs-kernel-server 2. 创建共享目录并配置权限 sudo mkdir -p /data/k8s sudo chown nobody:nogroup /data/k8s # 允许匿名访问 sudo chmod 777 /dat…

【QA】单件模式在Qt中有哪些应用?

单例设计模式确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。在 Qt 框架中,有不少类的设计采用了单例模式,以下为你详细介绍并给出相应代码示例。 1. QApplication QApplication 是 Qt GUI 应用程序的核心类,每个 Q…

存储过程触发器习题整理1

46、{blank}设有商品表(商品号,商品名,单价)和销售表(销售单据号,商品号,销售时间,销售数量,销售单价)。其中,商品号代表一类商品,商品号、单价、销售数量和销售单价均为整型。请编写…

基于ChatGPT、GIS与Python机器学习的地质灾害风险评估、易发性分析、信息化建库及灾后重建高级实践

第一章、ChatGPT、DeepSeek大语言模型提示词与地质灾害基础及平台介绍【基础实践篇】 1、什么是大模型? 大模型(Large Language Model, LLM)是一种基于深度学习技术的大规模自然语言处理模型。 代表性大模型:GPT-4、BERT、T5、Ch…

单表达式倒计时工具:datetime的极度优雅(智普清言)

一个简单表达式,也可以优雅自成工具。 笔记模板由python脚本于2025-03-22 20:25:49创建,本篇笔记适合任意喜欢学习的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 Pyth…

最优编码树的双子性

现在看一些书,不太愿意在书上面做一些标记,也没啥特殊的原因。。哈哈。 树的定义 无环连通图,极小连通图,极大无环图。 度 某个节点,描述它的度,一般默认是出度,分叉的边的条数。或者说孩子…

MiB和MB

本文来自腾讯元宝 MiB 和 ​MB 有区别,尽管它们都用于表示数据存储的单位,但它们的计算方式不同,分别基于不同的进制系统。 1. ​MiB(Mebibyte)​ ​MiB 是基于二进制的单位,使用1024作为基数。1 MiB 102…

Labview和C#调用KNX API 相关东西

叙述:完全没有听说过KNX这个协议...................我这次项目中也是简单的用了一下没有过多的去研究 C#调用示例工程链接(labview调用示例在 DEBUG文件夹里面) 通过网盘分享的文件:KNX调用示例.zip 链接: https://pan.baidu.com/s/1NQUEYM11HID0M4ksetrTyg?pwd…

损失函数理解(二)——交叉熵损失

损失函数的目的是为了定量描述不同模型(例如神经网络模型和人脑模型)的差异。 交叉熵,顾名思义,与熵有关,先把模型换成熵这么一个数值,然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…

Kubernetes的Replica Set和ReplicaController有什么区别

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理应用程序副本的两种资源,它们有类似的功能,但 ReplicaSet 是 ReplicationController 的增强版本。 以下是它们的主要区别: 1. 功能的演进 ReplicationController 是 Kubernete…

信息系统运行管理员教程3--信息系统设施运维

第3章 信息系统设施运维 信息系统设施是支撑信息系统业务活动的信息系统软硬件资产及环境。 第1节 信息系统设施运维的管理体系 信息系统设施运维的范围包含信息系统涉及的所有设备及环境,主要包括基础环境、硬件设备、网络设备、基础软件等。 信息系统设施运维…