接下来的三篇文章将对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. 前言 在使用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
一键生成webXml、initXml、contextXml等系统配置文件 配置控制生成输出文件(listenter、filter、quartz、activeMQ、redis、webXml、initXml、contextXml) 项目可统计在线人数,无操作超时退出,监听网络请求,...
php+redis 键值过期自动监听 可以用作定时任务 当redis键值过期的时候就会触发回调方法,然后执行自己的程序,比如30分钟订单自动取消
它将启动 6 个 Redis 服务器,监听7000~7005端口和一个主管以确保所有服务器都启动。 在所有服务器启动后,redis-trib 将创建一个 Redis 集群。 docker run -p 7000:7000 -p 7001:7001 -p 7002:7002 -p 7003:7003 -...
redis主从模式与哨兵模式例子 # 当前Sentinel服务运行的端口 port 26378 # 哨兵监听的主服务器 sentinel myid 09a71e001825114de399e0b6214c4b6f5449ab3a # 3秒内mymaster没响应,则认为mymaster宕机 sentinel deny...
监听redis的key的变化
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使 3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解 4. 绑定的
功能弹性伸缩,提供控制面板,管理员可以增加和删除Redis节点Redis运行状态监控,报警Redis故障或者网络故障的灾难应对原理consistent-hashing一致性hashzookeeper保持一致性和监听文章测试如果您愿意捐助一下项目,...
WebSocket服务器上的Redis介绍基于websocket的redis发布订阅协议服务器此服务在localhost上监听2000扩展软件架构服务端示例客户端示例安装教程1.需要先安装redis redis默认监听6379扩展2.安装依赖yarn install使用...
主要介绍了解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题,需要的朋友可以参考下
1.springboot集成redis,并监听redis过期key做相应的业务处理
核心技术:Redis开启过期监听 springboot整合redis,springboot配置redis监听。 案例中通过访问addOrder方法实现向mysql数据库添加一条数据并在redis中设置该条数据的有效期为10秒,10秒过后触发redis监听,在监听中...
需要下载release版本,下载地址: http://download.redis.io/releases/ 我这里下载的是: ...解压到/usr/local/redis目录中,然后...如上图,redis-server启动成功,并监听6379端口。 常用命令说明 redis-server redis
修订版 Redis-rs是Rust的高级Redis库。 它通过非常灵活但底层的API,提供对所有Redis功能的便捷访问。 它使用可自定义的类型转换特征,以便任何操作都可以返回所需类型的结果。 这带来了非常愉快的开发经验。 该板条...
主要介绍了spring boot+redis 监听过期Key,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
laravel-redis-socket 使用laravel,redis和socket.io在没有数据库的情况下向用户发送实时通知 首先,克隆后,您必须创建一个虚拟主机。 安装套件 npm install express ioredis socket.io --save composer require...
为了收集数据进行监控和分析,请构建一个能持续创建并维护...1. 记录、获取和清理计数器数据。 2. 对上述数据进行统计分析,记录最小值、最大值、平均值、标准差、样本数量及利用其它统计分析方法得到的统计数据。
1.初始化server变量,设置redis相关的默认值 2.读入配置文件,同时接收命令行中传入的参数,替换服务器设置的默认值 3.初始化服务器功能模块。在这一步初始化了包括进程信号处理、客户端链表、共享对象、初始化数据...
1、生成恶意.so文件,下载RedisModules-ExecuteCommand使用make编译即可生成 1、监听本地1234端口 2、将Redis服务器设置