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

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


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

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

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

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

2.   支持那些事件?

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

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

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

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

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

C代码 复制代码  收藏代码
  1. /* A fired event */  
  2. typedef struct aeFiredEvent {  
  3.     int fd;  
  4.     int mask;  
  5. } aeFiredEvent;  
  6.   
  7. /* State of an event based program */  
  8. typedef struct aeEventLoop {  
  9.     int maxfd;  
  10.     long long timeEventNextId;  
  11.     aeFileEvent events[AE_SETSIZE]; /* Registered events */  
  12.     aeFiredEvent fired[AE_SETSIZE]; /* Fired events */  
  13.     aeTimeEvent *timeEventHead;  
  14.     int stop;  
  15.     void *apidata; /* This is used for polling API specific data */  
  16.     aeBeforeSleepProc *beforesleep;  
  17. } aeEventLoop;  

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

aeFileEvent是文件读写事件的抽象

C代码 复制代码  收藏代码
  1. /* File event structure */  
  2. typedef struct aeFileEvent {  
  3.     int mask; /* one of AE_(READABLE|WRITABLE) */用来区分读写事件  
  4.     aeFileProc *rfileProc;   读文件事件的处理函数  
  5.     aeFileProc *wfileProc;  写文件事件的处理函数  
  6.     void *clientData;  
  7. } aeFileEvent;  
  8. aeTimeEvent则是定时响应的事件的抽象  
  9. /* Time event structure */  
  10. typedef struct aeTimeEvent {  
  11.     long long id; /* time event identifier. */  
  12.     long when_sec; /* seconds */  事件响应点的秒时刻  
  13.     long when_ms; /* milliseconds */事件响应的毫秒时刻  
  14.     aeTimeProc *timeProc;  事件响应函数  
  15.     aeEventFinalizerProc *finalizerProc;  
  16.     void *clientData;  
  17.     struct aeTimeEvent *next;  下一个要响应的时间事件  
  18. } aeTimeEvent  

 

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

 

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

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

相关文章
|
移动开发 NoSQL Redis
Redis代码阅读1--Redis启动原理
 前面写了一篇文章简单介绍Redis的list结构。再写完之后,我觉得有必要熟悉Redis的启动过程和如何读取Redis的命令,因此本文将通过分析代码来介绍Redis的启动过程,通过查看Redis 的启动脚本,得知Redis的启动时从Redis.c的main方法开始的。
887 0
|
NoSQL Redis API
Redis代码阅读3--Redis网络监听(1)
 接下来的三篇文章将对Redis的网络监听流程及涉及到事件库和各个主要方法进行介绍。 在介绍 redis的网络监听流程和事件库之前,我们先设想一下,如果我们不采用 libevent 等流行的开源库进行基于事件的网络监听,而是自己去实现一套基于事件的库去进行网络监听,需要考虑些什么,然后我们带着这些问题去分析 Redis是如果通过少量的代码来完成这个工作的。
1094 0
|
NoSQL Redis 算法
Redis代码阅读3--Redis网络监听(2)
 这篇文章接上一篇,主要介绍Redis网络监听流程的各个步骤。 aeCreateEventLoop :创建用于循环监听的 eventLoop , Redis 支持主流的三种事件触发机制: select ,epoll, kqueue, 可以通过在 config.
956 0
|
NoSQL Redis
Redis代码阅读3--Redis网络监听(3)
 是介绍Redis网络监听的最后一篇文章,着重分析定时时间处理函数serverCron,这个函数其实已经和网络监听没多大关系了,当时因为其绑定在Redis自定义的事件库的定时事件上,所以放到一起来讲。
974 0
|
NoSQL Redis 算法
Redis代码阅读3--Redis网络监听(2)
 这篇文章接上一篇,主要介绍Redis网络监听流程的各个步骤。 aeCreateEventLoop :创建用于循环监听的 eventLoop , Redis 支持主流的三种事件触发机制: select ,epoll, kqueue, 可以通过在 config.
810 0
|
NoSQL Redis
Redis代码阅读3--Redis网络监听(3)
 是介绍Redis网络监听的最后一篇文章,着重分析定时时间处理函数serverCron,这个函数其实已经和网络监听没多大关系了,当时因为其绑定在Redis自定义的事件库的定时事件上,所以放到一起来讲。
938 0
|
SQL 监控 安全
网络安全与信息安全:漏洞、加密与安全意识
随着互联网的迅猛发展,网络安全和信息安全问题日益受到关注。本文深入探讨了网络安全漏洞、加密技术以及提高个人和组织的安全意识的重要性。通过分析常见的网络攻击手段如缓冲区溢出、SQL注入等,揭示了计算机系统中存在的缺陷及其潜在威胁。同时,详细介绍了对称加密和非对称加密算法的原理及应用场景,强调了数字签名和数字证书在验证信息完整性中的关键作用。此外,还讨论了培养良好上网习惯、定期备份数据等提升安全意识的方法,旨在帮助读者更好地理解和应对复杂的网络安全挑战。
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
687 17
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
504 10
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
在数字化时代,网络安全和信息安全已成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术和安全意识等方面的内容,并提供一些实用的代码示例。通过阅读本文,您将了解到如何保护自己的网络安全,以及如何提高自己的信息安全意识。
467 10