news 2026/9/6 7:36:18

Redis 服务器线程与事件循环解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis 服务器线程与事件循环解析

文章目录

  • 事件循环线程
  • 事件循环相关源码文件
  • 事件主循环机制
  • 睡眠钩子(Hooks)机制
  • 睡眠钩子的实现
  • Epoll 实战:键盘输入监听

事件循环线程

众所周知,Redis 服务器启动时会开启六个线程:

  1. Thread-1 [redis-server](主线程)
  2. Thread-2 [bio_close_file](后台 I/O 线程 - 文件关闭)
  3. Thread-3 [bio_aof](后台 I/O 线程 - AOF 刷盘)
  4. Thread-4 [bio_lazy_free](后台 I/O 线程 - 惰性删除)
  5. Thread-5 [jemalloc_bg_thd](内存整理线程)
  6. Thread-6 [jemalloc_bg_thd](内存整理线程)

而事件循环则位于Thread-1 [redis-server](主线程)中。

事件循环相关源码文件

源码文件说明
ae.c事件驱动循环核心
ae_epoll.cLinux 系统实现(epoll)
ae_evport.cSolaris 专用
ae_kqueue.cmacOS 专用
ae_select.c老旧 Linux 或兼容模式使用
ebuckets.c事件桶管理
eventnotifier.c事件通讯器

事件主循环机制

Redis 的事件主循环位于ae.c中,核心代码如下:

voidaeMain(aeEventLoop*eventLoop){eventLoop->stop=0;while(!eventLoop->stop){aeProcessEvents(eventLoop,AE_ALL_EVENTS|AE_CALL_BEFORE_SLEEP|AE_CALL_AFTER_SLEEP);}}

但死循环非常消耗 CPU,Redis 是如何让线程进入睡眠等待的呢?

真正的“睡眠”发生在aeApiPoll中,其核心是调用系统epoll_wait

staticintaeApiPoll(aeEventLoop*eventLoop,structtimeval*tvp){aeApiState*state=eventLoop->apidata;intretval,numevents=0;retval=epoll_wait(state->epfd,state->events,eventLoop->setsize,tvp?(tvp->tv_sec*1000+(tvp->tv_usec+999)/1000):-1);if(retval>0){intj;numevents=retval;for(j=0;j<numevents;j++){intmask=0;structepoll_event*e=state->events+j;if(e->events&EPOLLIN)mask|=AE_READABLE;if(e->events&EPOLLOUT)mask|=AE_WRITABLE;if(e->events&EPOLLERR)mask|=AE_WRITABLE|AE_READABLE;if(e->events&EPOLLHUP)mask|=AE_WRITABLE|AE_READABLE;eventLoop->fired[j].fd=e->data.fd;eventLoop->fired[j].mask=mask;}}elseif(retval==-1&&errno!=EINTR){panic("aeApiPoll: epoll_wait, %s",strerror(errno));}returnnumevents;}
  • epoll_wait就是实现“睡眠”的系统调用。
  • 当没有事件时,线程在此阻塞,不消耗 CPU。

睡眠钩子(Hooks)机制

为了在睡眠前后执行必要逻辑,Redis 提供了钩子函数。

initServer函数中注册:

aeSetBeforeSleepProc(server.el, beforeSleep); aeSetAfterSleepProc(server.el, afterSleep);

aeProcessEvents中调用:

if (eventLoop->beforesleep != NULL && (flags & AE_CALL_BEFORE_SLEEP)) eventLoop->beforesleep(eventLoop); if (eventLoop->aftersleep != NULL && flags & AE_CALL_AFTER_SLEEP) eventLoop->aftersleep(eventLoop);

作用

  • beforeSleep:处理客户端写回、检查阻塞超时、计算下一次epoll_wait的超时时间等。
  • afterSleep:清理或重置休眠期间的状态。

这些钩子避免了无限循环中 CPU 空转,是 Redis 高效的核心之一。


睡眠钩子的实现

beforeSleep钩子和afterSleep钩子的实现都在server.c中,分别是void beforeSleep(struct aeEventLoop *eventLoop)和void afterSleep(struct aeEventLoop *eventLoop)。
实现上beforeSleep远比afterSleep复杂。

Epoll 实战:键盘输入监听

我们可以编写代码练习epoll的使用,模拟 Redis 的事件监听机制。

#include<stdio.h>#include<stdlib.h>#include<sys/epoll.h>#include<unistd.h>// 简单的错误处理宏#definepanic(fmt,...)\do{fprintf(stderr,"FATAL ERROR: "fmt" (%s:%d)\n",##__VA_ARGS__,__FILE__,__LINE__);\exit(1);}while(0)typedefstructepoll_eventEvent;intmain(void){intepfd=epoll_create(1);if(epfd<0){panic("epoll_create");return1;}// 设置监听标准输入(键盘)Event ev;ev.events=EPOLLIN;ev.data.fd=STDIN_FILENO;if(epoll_ctl(epfd,EPOLL_CTL_ADD,STDIN_FILENO,&ev)<0){panic("epoll_ctl");return1;}Event events[10];charbuf[1024];// 事件循环for(;;){intnfds=epoll_wait(epfd,events,10,-1);if(nfds<0){panic("epoll_wait");return1;}// 处理就绪事件for(inti=0;i<nfds;i++){if(events[i].data.fd==STDIN_FILENO){intnread=read(STDIN_FILENO,buf,sizeof(buf));if(nread>0){buf[nread]='\0';printf("键盘输入: %s",buf);}}}}close(epfd);return0;}

编译运行

gcc epoll_test.c -o epoll_test ./epoll_test

这个程序会在没有输入时“睡眠”,输入内容按回车后被唤醒,完美模拟了 Redis 的事件处理模型。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 2:12:40

无人机飞行姿态稳不稳?关键看这个MEMS IMU

惯性测量单元&#xff08;IMU&#xff09;是无人机飞控系统的核心感知部件&#xff0c;也是无人机实现稳定飞行、姿态控制与自主导航的基础硬件。无人机依靠 IMU 实时感知自身的运动与姿态状态&#xff0c;再由飞控算法快速输出控制指令&#xff0c;驱动电机与旋翼调整姿态&…

作者头像 李华
网站建设 2026/9/4 7:04:00

机器学习 —— 关联规则

摘要&#xff1a;关联规则挖掘是机器学习中用于发现数据集中项目间关联关系的技术&#xff0c;主要应用于购物篮分析等领域。该方法通过支持度和置信度指标衡量规则强度&#xff0c;其中支持度反映规则普遍性&#xff0c;置信度表示规则可靠性。使用Python的mlxtend库可实现关联…

作者头像 李华
网站建设 2026/8/31 12:19:39

计算机Java毕设实战-基于Java web的酒店管理系统设计与实现在线查询空闲客房、提交预订申请、支付押金【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/3 8:39:05

超声波测距设计研究

超声波测距设计研究 一、研究背景与意义 超声波测距凭借非接触式测量、抗干扰能力强、成本低廉等优势&#xff0c;广泛应用于工业液位检测、智能机器人避障、车辆倒车雷达、安防距离监测等领域。传统超声波测距系统存在测量精度低、测距范围窄、受环境因素影响大等问题&#xf…

作者头像 李华
网站建设 2026/9/6 3:44:52

跨境电商必看:Etsy保号防封全攻略(2026)

Etsy作为全球领先的手工艺品和创意商品销售平台&#xff0c;吸引了成千上万的卖家。但当你刚准备大干一场&#xff0c;Etsy新店24小时就封了&#xff1f;上架第一个产品&#xff0c;店直接没了&#xff1f;本文将带你了解常见的封号原因&#xff0c;并提供实操干货&#xff0c;…

作者头像 李华
网站建设 2026/8/30 14:36:40

自动禁用触控板工具支持winxp/win7/win8.1/win10

平时应该有朋友遇到过手不小心碰到触控板非常影响打字的体验&#xff0c;根本用上不&#xff0c;都是用鼠标&#xff0c;这个触控板就很鸡肋&#xff0c;如果要禁用&#xff0c;可以考虑使用这个工具。能禁用大部分的触控板&#xff0c;需要的保存试试。 下载地下载地址&#x…

作者头像 李华