`

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网络监听所涉及的几个结构体和方法
C代码  收藏代码
/* 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是文件读写事件的抽象
C代码  收藏代码
/* 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网络层echo例子

    本篇文章将深入探讨Redis网络层的工作原理,并通过一个"echo"测试例子来加深理解。 Redis网络层的核心在于它的事件驱动模型,它基于libevent库来处理来自客户端的连接请求和数据传输。libevent是一个跨平台的事件...

    关于Redis网络模型的源码详析

    在本文中,我们将重点探讨基于epoll的Redis网络模型。 首先,`epoll_create()`系统调用用于创建一个epoll实例,它返回一个专用于epoll的文件描述符。参数表示可以监听的最大socket文件描述符数量。`epoll_ctl()`则...

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

    文章中也提到,目前网络上没有现成的解决方案来完美解决在Redis集群下监听key过期的问题。实现一个高效且准确的过期key监听机制需要对Redis集群的内部原理有深入的理解。 从提供的代码片段中,我们可以看到实现的...

    cent OS7无网络安装redis

    1. **Redis介绍**:Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合,还提供了事务、持久化、复制和Lua脚本等功能。 2. **...

    linux离线安装redis

    默认情况下,Redis会监听6379端口。如果你需要更改端口,需要编辑`redis.conf`配置文件。找到`bind 127.0.0.1`和`port 6379`这两行,取消`bind`行的注释,并将`port`设置为你希望的端口,例如: ```conf # 绑定所有...

    Redis 服务器

    - **安全策略**:由于Redis默认监听所有网络接口,可能存在安全隐患,建议配置为仅监听特定IP或启用密码认证。 - **资源限制**:根据服务器资源情况调整Redis配置,如最大内存限制、文件描述符数量等。 - **监控与...

    redis linux rpm离线安装.zip

    默认情况下,Redis监听所有网络接口,为提高安全性,建议限制只监听本地环回地址(127.0.0.1)。此外,还可以配置访问密码,防止未经授权的访问。 10. **监控与维护**: 为了确保Redis的稳定运行,定期检查系统...

    redis集群redis集群

    3. port指令,用于指定Redis监听的端口号。 4. cluster-enabled指令,设置为yes以启用集群模式。 5. cluster-config-file指令,指定集群状态文件的名称。 6. cluster-node-timeout指令,设置集群节点超时时间。 7. ...

    redis 配置详细介绍

    默认情况下,Redis会监听所有网络接口,如果你只想让它监听特定的IP,如127.0.0.1,可以设置`bind 127.0.0.1`,这有助于提高安全性。 Redis提供了多种数据持久化方式,包括RDB(快照)和AOF(Append Only File)。...

    windows redis 安装 redis 安装 redis 安装

    - `bind`:指定 Redis 服务监听的 IP 地址,如果不配置或设置为 0.0.0.0,则监听所有网络接口。 - `requirepass`:设置访问密码,增加安全性。 - `appendonly yes/no`:是否开启持久化,如果开启,数据将在每次写...

    redis mac 7.2.3 arm 包

    - 默认情况下,Redis监听所有网络接口,出于安全原因,建议修改配置文件,仅监听本地接口(`bind 127.0.0.1`)。 - 设置密码认证(`requirepass`),防止未授权访问。 - 避免在生产环境中暴露Redis直接面对互联网...

    redis(window)

    - `bind`: 指定Redis服务器监听的IP地址,默认为本机所有网络接口。 - `protected-mode`: 保护模式,如果设置为`yes`,则只有本地连接可以访问。 - `maxmemory`: 设置Redis的最大内存大小,超过此值会触发LRU...

    redis6.2.5安装包Windows版

    Redis(Remote Dictionary Server)是一个开源的、支持网络、内存储存的键值对数据存储系统。它通常以数据结构服务器的身份工作,使用内存存储数据,通过网络接口提供服务,并定期将内存中的数据持久化到磁盘,以...

    redis.conf,版本7.0.8

    1. `port`: 指定Redis服务器监听的端口号,默认为6379。根据实际需求,可修改为其他未被占用的端口。 2. `bind`: 设置Redis服务器监听的IP地址。默认情况下,Redis会监听所有可用的网络接口。若只想限制在特定IP上...

    redis-windows-7.0.10.zip

    其中,`bind`配置项用于指定Redis服务器监听的网络接口,`port`定义了服务端口,默认为6379;`maxmemory`用于设置Redis的最大内存使用量,超过此值将触发LRU(最近最少使用)或LFU(最不经常使用)的内存淘汰策略。 ...

    redis解压版最新

    1. **Redis的基础知识**: - Redis是一个开源的、基于内存的数据结构存储系统,可以作为数据库、缓存和消息中间件使用。 - 它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,这些数据结构设计巧妙,...

    redis 搭建 配置 运行

    - `bind`: 指定Redis服务器监听的IP地址,默认监听所有网络接口。 - `maxclients`: 设置最大客户端连接数,防止资源耗尽。 - `dbfilename`: 定义RDB持久化文件名。 - `dir`: 指定数据文件的存储目录。 3. **...

    docker redis 3.2 配置文件

    在默认情况下,Redis 会监听 6379 端口。在 Docker 中,通常会通过 `-p` 或 `--publish` 参数将容器内的端口映射到主机的某个端口。如果“端口绑定注销”,可能意味着你希望避免自动映射,而是通过 Docker Compose ...

    redis7.0.5 Windows版本

    1. **Redis简介** Redis是一个开源的内存数据结构存储系统,用作数据库、缓存和消息中间件。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,适合处理大量实时数据。 2. **Windows兼容性** Redis ...

    redis win 64/redis win管理工具

    - **安全**:由于Redis默认监听所有网络接口,应配置合适的防火墙规则或设置bind选项,仅允许特定IP访问。 - **密码保护**:启用`requirepass`配置项,为Redis服务器设置密码,增加安全性。 - **资源限制**:根据...

Global site tag (gtag.js) - Google Analytics