redis使用epoll的代码在ae_epoll.c文件中。

epoll_create:redis服务器在启动时,创建事件循环,调用epoll_create方法创建epoll实例。

static int aeApiCreate(aeEventLoop *eventLoop) {aeApiState *state = zmalloc(sizeof(aeApiState));if (!state) return -1;state->events = zmalloc(sizeof(struct epoll_event)*eventLoop->setsize);if (!state->events) {zfree(state);return -1;}state->epfd = epoll_create(1024); /* 1024 is just a hint for the kernel */if (state->epfd == -1) {zfree(state->events);zfree(state);return -1;}eventLoop->apidata = state;return 0;
}

epoll_ctl:当有新的客户端连接时,把新的连接描述符注册到epoll实例。

static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {aeApiState *state = eventLoop->apidata;struct epoll_event ee = {0}; /* avoid valgrind warning *//* If the fd was already monitored for some event, we need a MOD* operation. Otherwise we need an ADD operation. */int op = eventLoop->events[fd].mask == AE_NONE ?EPOLL_CTL_ADD : EPOLL_CTL_MOD;ee.events = 0;mask |= eventLoop->events[fd].mask; /* Merge old events */if (mask & AE_READABLE) ee.events |= EPOLLIN;if (mask & AE_WRITABLE) ee.events |= EPOLLOUT;ee.data.fd = fd;if (epoll_ctl(state->epfd,op,fd,&ee) == -1) return -1;return 0;
}

epoll_wait:调用epoll_wait获取客户端产生的io事件。

static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {aeApiState *state = eventLoop->apidata;int retval, numevents = 0;retval = epoll_wait(state->epfd,state->events,eventLoop->setsize,tvp ? (tvp->tv_sec*1000 + tvp->tv_usec/1000) : -1);if (retval > 0) {int j;numevents = retval;for (j = 0; j < numevents; j++) {int mask = 0;struct epoll_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;if (e->events & EPOLLHUP) mask |= AE_WRITABLE;eventLoop->fired[j].fd = e->data.fd;eventLoop->fired[j].mask = mask;}}return numevents;
}

转载于:https://www.cnblogs.com/allenwas3/p/8473614.html

redis使用epoll相关推荐

  1. Redis的epoll模型

    之前相关文章推荐:Redis高性能与epoll 本文,我们从源代码的角度,简单理解Redis是如何使用epoll以及epoll的实现原理.浅入浅出~ 找我交流 通过本文了解如下三件事儿,就算是达到了本 ...

  2. epoll源码分析以及在Redis中的实现

    1.概述 这篇文章分析一下linux中epoll的实现原理,主要为了增强自己对网络调用的理解.业界使用epoll的框架比较多,随便就能列出来很多,比如jdk的nio在linux下的实现,以及netty ...

  3. Redis 笔记(12)— 单线程架构(非阻塞 IO、多路复用)和多个异步线程

    Redis 使用了单线程架构.非阻塞 I/O .多路复用模型来实现高性能的内存数据库服务.Redis 是单线程的.那么为什么说是单线程呢? Redis 在 Reactor 模型内开发了事件处理器,这个 ...

  4. Redis 高级特性(4)— 单线程架构

    Redis 使用了单线程架构和 I/O 多路复用模型来实现高性能的内存数据库服务. 1. 单线程模型 开启三个 redis-cli 客户端同时执行命令.客户端 1 设置一个字符串键值对: 127.0. ...

  5. redis灵魂拷问:19图+11题带你面试通关

    又到了金三银四跳槽季,好多同学已经开始行动了.今天我来助力一把,送出这套redis面试题,助力大家通关. 1 redis为什么响应快 1.1数据保存在内存中 redis数据保存在内存中,读写操作只要访 ...

  6. 深度剖析不一样的Redis架构设计!

    -      01.不一样的Redis    - 提到Redis,大家一定会想到的几个点是什么呢? 高并发.KV存储.内存数据库.丰富的数据结构.单线程(版本6之前)等. 那么,接下来,上面提到的这些 ...

  7. 五大点,搞懂单线程的Redis到底快在哪里

    目录 前言 一.开发语言 二.纯内存访问 三.数据结构简单 四.单线程 五.非阻塞多路I/O复用机制 前言 Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可 ...

  8. java redis设置过期时间_Redis的一些核心原理

    点关注,不迷路:持续更新Java相关技术及资讯!!! 一.Redis的单线程和高性能 Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,所有的运算都是内存级别的运算(纳秒),而且单线程 ...

  9. 为什么 Redis 单线程能支撑高并发?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | draveness.me/redis-io-m ...

最新文章

  1. SFB 项目经验-09-用Lync 2013或Skype for Business 2015抢火车票
  2. Struts2教程2:处理一个form多个submit
  3. skyline三维模型规格
  4. 关于 Redis 的一些新特性、使用建议和最佳实践
  5. 利用Jmeter测试CSRF令牌验证的Web API
  6. android通过json生成视图
  7. 三角形垂点坐标js算法(三点定圆求圆心)
  8. 安装服务器系统大概多久,安装服务器系统
  9. Linux下修改系统时间并写入BIOS
  10. hadoop的同类技术_Hadoop和Spark的区别是什么?现在都流行用哪种技术?
  11. VPP-20.09版本安装教程(联网版)
  12. HCSE5.0中文胶片
  13. 提高计算机性能的主流方法,提高cpu性能的方法有哪些?怎么把电脑cpu性能调到最大?...
  14. L1-059 敲笨钟 (20 分)
  15. Go中的MPG模式解析
  16. 第 2-3 课:迭代法计算定积分
  17. 练习4-11 统计素数并求和(素数的函数)
  18. Cesium源码解读系列(一):GeoJsonDataSource如何处理geojson格式的数据
  19. python学习之recognition的多人人脸识别
  20. 离散数学·集合论【自然数和基数】

热门文章

  1. magento常用软件
  2. Java每日一讲讲什么好_撩课-Java每天10道面试题第1天
  3. tomcat 热部署 生产环境_屋顶隔热改善舍内热环境及生产性能
  4. java三级考试_java web 学习 --第五天(Java三级考试)
  5. 极限学习机的matlab程序_新程序员七宗罪,新手别踩雷
  6. mongo在哪创建管理员_MongoDB初始化创建管理员账户登录
  7. java两个jre_为什么会有两个jre?060925(原创)
  8. python默认的一个代码缩进是几个空格_python缩进长度是否统一
  9. 电脑怎么连蓝牙耳机_蓝牙耳机怎么关机
  10. c 远程编辑linux文件,makefile - 在远程Linux机器上编译C ++ - “检测到时钟偏差”警告...