对于redis底层框架的理解(五)

之前总结了redis的通讯流程,基本框架,epoll的封装等等,这次介绍下

redis对于select模型的封装

//select 模型
typedef struct aeApiState {
    //读文件描述符集合,写文件描述符集合
    fd_set rfds, wfds;
    /* We need to have a copy of the fd sets as it‘s not safe to reuse
     * FD sets after select(). */
     //读写集合的副本
    fd_set _rfds, _wfds;
} aeApiState;

_rfds和_wfds是读写结合的副本,因为select调用后会将读写集合中未就绪的文件描述符

清除,所以每次用_rfds和_wfds传入,就不用担心原读写集合描述符被清除。

封装的基于select的初始化函数

static int aeApiCreate(aeEventLoop *eventLoop) {
    //开辟aeApiState空间
    aeApiState *state = zmalloc(sizeof(aeApiState));

    if (!state) return -1;
    //读写集合清零
    FD_ZERO(&state->rfds);
    FD_ZERO(&state->wfds);
    eventLoop->apidata = state;
    return 0;
}

函数将读写集合清零,并且将state回传给eventloop的apidata部分。

内存回收功能

//释放空间
static void aeApiFree(aeEventLoop *eventLoop) {
    zfree(eventLoop->apidata);
}

封装的添加和删除事件

//select 添加事件
static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) {
    aeApiState *state = eventLoop->apidata;

    if (mask & AE_READABLE) FD_SET(fd,&state->rfds);
    if (mask & AE_WRITABLE) FD_SET(fd,&state->wfds);
    return 0;
}

//select 删除事件
static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int mask) {
    aeApiState *state = eventLoop->apidata;

    if (mask & AE_READABLE) FD_CLR(fd,&state->rfds);
    if (mask & AE_WRITABLE) FD_CLR(fd,&state->wfds);
}

添加事件函数将文件描述根据mask是读事件还是写事件放入不同的set

删除事件根据文件描述符mask是读事件还是写事件从不同的set中清除

下面是核心功能,事件派发

//select 触发事件
static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp) {
    aeApiState *state = eventLoop->apidata;
    int retval, j, numevents = 0;
    //将select读集合的数据拷贝到_rfds
    memcpy(&state->_rfds,&state->rfds,sizeof(fd_set));
       //将select写集合数据拷贝到_wfds
    memcpy(&state->_wfds,&state->wfds,sizeof(fd_set));

    //从读和写的copy集合里选出就绪的文件描述符
     retval = select(eventLoop->maxfd+1,
                &state->_rfds,&state->_wfds,NULL,tvp);

    //大于零表示有就绪的文件描述符

    if (retval > 0) {
        //select的弊端所在,每次都要将所有的文件描述符轮询一遍
        for (j = 0; j <= eventLoop->maxfd; j++) {

            int mask = 0;
            aeFileEvent *fe = &eventLoop->events[j];

            if (fe->mask == AE_NONE) continue;
            //aeFileEvent 事件可读
            if (fe->mask & AE_READABLE && FD_ISSET(j,&state->_rfds))
                mask |= AE_READABLE;

            //aeFileEvent 事件可写
            if (fe->mask & AE_WRITABLE && FD_ISSET(j,&state->_wfds))
                mask |= AE_WRITABLE;
            eventLoop->fired[numevents].fd = j;
            eventLoop->fired[numevents].mask = mask;
            numevents++;
        }
    }
    return numevents;
}

先将读写集合中的内容copy的_rfds和_wfds中,分别传入select函数中,

这样select后返回的_rfds中只有就绪的读socket

_wfds中只有就绪的写socket

通过FD_ISSET判断读写事件之后放到eventloop的fire队列里。

基本的封装就是这个样子,select模型相对容易理解

我的公众号:

时间: 2024-08-27 05:56:11

对于redis底层框架的理解(五)的相关文章

Spring框架AOP的使用及个人对底层原理的理解

Spring框架AOP的使用及个人对底层原理的理解**** 前言: AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,今天要给大家分享的是Spring框架AOP的使用,以及我个人对底层原理的一些理解. Aop使用步骤 配置aop信息 <aop:config> 相当于aop的根节点 配置切入点 <aop:piontcut> 切入点 可以理解为需要增强的方法

Nginx Http框架的理解

HTTP框架是Nginx基础框架的一部分,Nginx的其它底层框架如master-worker进程模型.event模块.mail 模块等. HTTP框架代码主要有2个模块组成:ngx_http_module和ngx_http_core_module: 我们编写的HTTP模块需要注册到HTTP框架上,才能融入HTTP请求的处理流程中. 当在nginx.conf中存在一个http{...}的配置时,即启用了HTTP框架代码,在nginx配置解析时,就已经为框架建立好了各种数据结构(尤其是HTTP模块

Hadoop框架基础(五)

** Hadoop框架基础(五) 已经部署了Hadoop的完全分布式集群,我们知道NameNode节点的正常运行对于整个HDFS系统来说非常重要,如果NameNode宕掉了,那么整个HDFS就要整段垮掉了,所以人类思考,能不能让世界多一点爱:),我们能不能弄个备用的NameNode,一旦正在使用的NameNode原地爆炸了,另一台备用的NameNode能立刻代替原先NameNode的位置,继续让HDFS系统正常运行?(同理,ResourceManager也是可以的.) 世界果然充满爱,动物管理员

GoFramework框架简介(五)缓存篇

Redis缓存 框架对Redis进行了基础的调用封装,接口类为:org.go.framework.cache.CacheService,提供了众多方法可供使用.Dubbo服务端及Web端都可以直接引用该服务实例. public void put(String key, Object value, int timeToLive, TimeUnit timeUnit, String namespace); public void put(String key, Object value, int t

王晶:华为云OCR文字识别服务技术实践、底层框架及应用场景 | AI ProCon 2019【华为云技术分享】

演讲嘉宾 | 王晶(华为云人工智能高级算法工程师王晶) 出品 | AI科技大本营(ID:rgznai100) 近期,由 CSDN 主办的 2019 中国AI 开发者大会(AI ProCon 2019)在北京举办.在计算机视觉技术专题,华为云OCR人工智能高级算法工程师王晶分享了“文字识别服务的技术实践.底层框架及应用场景”的主题演讲. 演讲的第一部分,他分享了文字检测和识别的基础知识以及难点和最新进展.第二部分是华为云文字识别服务关键能力.关键技术,以及落地过程中遇到的“坑”,这对其他人工智能产

底层框架——【新生入学系统】

前言 开始学习的时候,搭建底层架构非常吃力.听着师哥师姐讲架构,感觉像听天书的似的,脑子里面一团浆糊,就看着师哥的F12按的特别欢,具体跳到哪里了,不知道. 不过硬着头皮做了一段时间的项目后,因为要如果不分析里面的调用关系,根本就不知道一条线怎么下来,所以一开始模仿,渐渐地开始有了自己的思路,感觉整个框架在脑海里面越来越清晰. 底层框架 .Net的框架十分的强大,跟之前的机房收费系统比,真的是从原始社会直接奔向了小康社会. 废话不多说的,赶紧进入正题,整个框架主要分成以下这几块,简单的介绍一下它

spring框架学习(五)注解

spring框架学习(五)注解 注解Annotation,是一种类似注释的机制,在代码中添加注解可以在之后某时间使用这些信息.跟注释不同的是,注释是给我们看的,java虚拟机不会编译,注解也是不编译的,但是我们可以通过反射机制去读取注解中的信息.注解使用关键字@interface,继承java.lang.annotition.Annotition spring框架为我们提供了注解功能. 使用注解编程,主要是为了替代xml文件,使开发更加快速.但是,xml文件的使用就是解决修改程序修改源代码,现在

考试系统--底层框架发布时遇到的问题解决方案(Window7 IIS6.0)(三)

<承接上篇文章> 考试系统--底层框架发布时遇到的问题解决方案(Window7 IIS6.0)(二) 4.问题描述 内存入口检查失败,因为可用没存(XX字节)少于总内存的XX%,因此,该服务不可用于传入的请求.若要解决此问题,请减少计算机上的负载,或调整serviceHostingEnvironment配置元素上的minFreeMemoryPercentageToActivateService的值. 解决方法:服务是运行在电脑上的应用程序,并且服务执行耗费资源的操作,因此有必要确保其在开始运行

跟着刚哥学习Spring框架--AOP(五)

AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.OOP引入封装.继承.多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合.不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能.日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性.异常处理和透明的持续性也都是如此,这种散布在各