`

Redis代码阅读3--Redis网络监听(1)

 
阅读更多

接下来的三篇文章将对Redis的网络监听流程及涉及到事件库和各个主要方法进行介绍。

在介绍 redis的网络监听流程和事件库之前,我们先设想一下,如果我们不采用 libevent 等流行的开源库进行基于事件的网络监听,而是自己去实现一套基于事件的库去进行网络监听,需要考虑些什么,然后我们带着这些问题去分析 Redis是如果通过少量的代码来完成这个工作的。

在我认为,需要考虑的问题有以下一些(限于水平,暂时只能想到这些 ):

1.   采用何种 事件触发机制 ,是 epoll select kquque,抑或 3种都支持

2.   支持那些事件?

3.   如何管理各种事件(数据结构响应,查找)?

4.   如何响应 I/O事件?是异步还是同步?是单线程响应还是多线程响应?

5.   如何尽快地响应各种事件?

Redis的作者没有采用 libevent等之类的知名网络库,而是通过少量的代码实现了一个基于反转模式的轻量级网络库,对于这一点, Redis的作者是这样解释的,因为他觉得 libevent之类的知名网络库太过于庞大,而对 Redis来说只需要异步监听的基本功能,因此他不想引入过于“庞大”的第三库。

首先我们从 ae.h文件开始,介绍一下 redis网络监听所涉及的几个结构体和方法

/* A fired event */
typedef struct aeFiredEvent {
    int fd;
    int mask;
} aeFiredEvent;

/* State of an event based program */
typedef struct aeEventLoop {
    int maxfd;
    long long timeEventNextId;
    aeFileEvent events[AE_SETSIZE]; /* Registered events */
    aeFiredEvent fired[AE_SETSIZE]; /* Fired events */
    aeTimeEvent *timeEventHead;
    int stop;
    void *apidata; /* This is used for polling API specific data */
    aeBeforeSleepProc *beforesleep;
} aeEventLoop;

aeEventLoop 是用于网络循环监听一个结构体,其通过 events这个内部数组来维护要要监听的文件事件,通过 fired来维护 select到需要响应的文件事件, timeEventHead则是把定时响应的时间事件通过链表的形式维护起来。

aeFileEvent是文件读写事件的抽象

/* File event structure */
typedef struct aeFileEvent {
    int mask; /* one of AE_(READABLE|WRITABLE) */用来区分读写事件
    aeFileProc *rfileProc;   读文件事件的处理函数
    aeFileProc *wfileProc;  写文件事件的处理函数
    void *clientData;
} aeFileEvent;
aeTimeEvent则是定时响应的事件的抽象
/* Time event structure */
typedef struct aeTimeEvent {
    long long id; /* time event identifier. */
    long when_sec; /* seconds */  事件响应点的秒时刻
    long when_ms; /* milliseconds */事件响应的毫秒时刻
    aeTimeProc *timeProc;  事件响应函数
    aeEventFinalizerProc *finalizerProc;
    void *clientData;
    struct aeTimeEvent *next;  下一个要响应的时间事件
} aeTimeEvent

 

Redis的网络监控库里面, aeEventLoop aeFileEvent aeTimeEvent之间的关系是:

 

在了解了 Redis基于事件驱动的网络库所涉及的三个基本组件后,我们来看一下 Redis的网络监听的基本流程:

接下来下一篇文章将介绍整个流程涉及到的具体方法

  • 大小: 27.6 KB
  • 大小: 48.9 KB
1
0
分享到:
评论

相关推荐

    Redis集群下过期key监听的实现代码

    1. 前言 在使用redis集群时,发现...关于Redis集群配置代码此处不贴,直接贴配置监听类代码! redis.host1: 10.113.56.68 redis.port1: 7030 redis.host2: 10.113.56.68 redis.port2: 7031 redis.host3: 10.113.56.6

    逆向工程极速搭建SSM-Redis-activeMQ-Quartz整合项目

    一键生成webXml、initXml、contextXml等系统配置文件 配置控制生成输出文件(listenter、filter、quartz、activeMQ、redis、webXml、initXml、contextXml) 项目可统计在线人数,无操作超时退出,监听网络请求,...

    redis过期监听.docx

    php+redis 键值过期自动监听 可以用作定时任务 当redis键值过期的时候就会触发回调方法,然后执行自己的程序,比如30分钟订单自动取消

    docker-redis-cluster:一个 Redis 集群 Docker 镜像

    它将启动 6 个 Redis 服务器,监听7000~7005端口和一个主管以确保所有服务器都启动。 在所有服务器启动后,redis-trib 将创建一个 Redis 集群。 docker run -p 7000:7000 -p 7001:7001 -p 7002:7002 -p 7003:7003 -...

    redis主从模式与哨兵模式例子

    redis主从模式与哨兵模式例子 # 当前Sentinel服务运行的端口 port 26378 # 哨兵监听的主服务器 sentinel myid 09a71e001825114de399e0b6214c4b6f5449ab3a # 3秒内mymaster没响应,则认为mymaster宕机 sentinel deny...

    监听redis的key的变化

    监听redis的key的变化

    Redis 配置文件1

    1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使 3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解 4. 绑定的

    flycache:一致性哈希的redis分片存储 (Redis sharding by consistent-hashing)

    功能弹性伸缩,提供控制面板,管理员可以增加和删除Redis节点Redis运行状态监控,报警Redis故障或者网络故障的灾难应对原理consistent-hashing一致性hashzookeeper保持一致性和监听文章测试如果您愿意捐助一下项目,...

    redis-pubsub-websocket-server:基于websocket的redis发布订阅协议服务器

    WebSocket服务器上的Redis介绍基于websocket的redis发布订阅协议服务器此服务在localhost上监听2000扩展软件架构服务端示例客户端示例安装教程1.需要先安装redis redis默认监听6379扩展2.安装依赖yarn install使用...

    解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    主要介绍了解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题,需要的朋友可以参考下

    监听redis过期key,做对应业务处理

    1.springboot集成redis,并监听redis过期key做相应的业务处理

    springboot2.7.9+Redis6.2.5实现订单超时处理+数据超时+订单超时监听

    核心技术:Redis开启过期监听 springboot整合redis,springboot配置redis监听。 案例中通过访问addOrder方法实现向mysql数据库添加一条数据并在redis中设置该条数据的有效期为10秒,10秒过后触发redis监听,在监听中...

    mac下redis安装、设置、启动停止方法详解

    需要下载release版本,下载地址: http://download.redis.io/releases/ 我这里下载的是: ...解压到/usr/local/redis目录中,然后...如上图,redis-server启动成功,并监听6379端口。 常用命令说明 redis-server redis

    redis-rs:Redis库防锈

    修订版 Redis-rs是Rust的高级Redis库。 它通过非常灵活但底层的API,提供对所有Redis功能的便捷访问。 它使用可自定义的类型转换特征,以便任何操作都可以返回所需类型的结果。 这带来了非常愉快的开发经验。 该板条...

    spring boot+redis 监听过期Key的操作方法

    主要介绍了spring boot+redis 监听过期Key,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    laravel-redis-socket:使用laravel,redis和socket.io在没有数据库的情况下向用户发送实时通知

    laravel-redis-socket 使用laravel,redis和socket.io在没有数据库的情况下向用户发送实时通知 首先,克隆后,您必须创建一个虚拟主机。 安装套件 npm install express ioredis socket.io --save composer require...

    Redis实现系统监控

    为了收集数据进行监控和分析,请构建一个能持续创建并维护...1. 记录、获取和清理计数器数据。 2. 对上述数据进行统计分析,记录最小值、最大值、平均值、标准差、样本数量及利用其它统计分析方法得到的统计数据。

    redis架构分析.docx

    1.初始化server变量,设置redis相关的默认值 2.读入配置文件,同时接收命令行中传入的参数,替换服务器设置的默认值 3.初始化服务器功能模块。在这一步初始化了包括进程信号处理、客户端链表、共享对象、初始化数据...

    第02篇:Redis主从复制getshell1

    1、生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成 1、监听本地1234端口 2、将Redis服务器设置

Global site tag (gtag.js) - Google Analytics