这篇文章主要讲解了“怎么理解Redis中的epoll和文件事件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Redis中的epoll和文件事件”吧!Redis 服务器是事件驱动程序,分为文件事件
和时间事件
文件事件:socket 的可读可写事件定时任务它们都被封装到aeEventLoop
结构体中事件驱动程序实际上也是通过while/for
循环,循环等待事件的发生aeProcessEvents
为事件处理主函数Redis 客户端通过 TCP socket 与服务端交互,文件事件指的就是 socket 的可读可写事件。一般使用非阻塞模式,相关的 I/O 多路复用有select/epoll/kqueue
等,不同的操作系统不同的实现。以epoll
为例,它是 Linux 内核为处理大量并发网络连接而提出解决方案。epoll
提供3个 APIepoll_create 创建一个 epoll 专用的文件描述符,用于后续 epoll 相关 API 调用epoll_ctl 函数向 epoll 注册、修改或删除需要监控的事件epoll_wait 函数会会阻塞进程,直到监控的若干网络连接有事件发生Reids 没有直接使用 epoll 的 API,而是同时支持4种I/O多路复用模型,对这些模型的 API 进行了封装。然后在编译阶段检查操作系统支持的I/O多路复用模型,并按照策略来决定复用那张模型。还是以 epoll 为例,Redis 进行了如下封装回忆一下上面提到的eventLoop
结构体,其成员 apidata 指向4种I/O多路复用模型对象;events 存储需要监控的事件数组,以 socket 文件描述符作为数组索引存取元素;fired 存储已触发的事件数组。文件事件的结构体定义如下:看一下创建文件事件 aeCreateFileEvent 的实现Redis 服务器会通过创建各类文件事件来处理事务,比如:启动时创建 socket 并监听,等待客户端连接客户端与服务器建立 socket 连接之后,服务器会等待客户端的命令请求服务器处理完客户端的命令请求之后,命令回复会暂时缓存在client结构体的buf缓冲区,待客户端文件描述符的可写事件发生时,才会真正往客户端发送命令回复Redis 所有事件的执行都是通过aeProcessEvents
函数来控制。在其中,执行文件事件会出现阻塞情况(epoll_wait),如果阻塞事件太长了,会妨碍到时间事件(定时)的执行,为避免出现这种情况,在实现文件事件时传入的等待时间,是计算最早发生的时间事件得到的现在我们来整体看一下 Redis 服务器相应命令的流程aeMain 函数通过调用 aeProcessEvents 函数来进行文件事件和时间事件的调度和执行。aeEventLoop 中记录了事件相关的信息。首先通过 aeSearchNearestTimer 函数获取最短的时间事件的执行时间间隔n,然后调用 aeApiPoll 函数获取监听到的套接字,最后执行与套接字向对应的事件处理函数 rfileProc 和 wfileProc,最后再执行时间事件函数 processTimeEvents。一次完整的客户端与服务端连接事件:器监听套件字的 AE_READABLE 事件,当客户端发送连接请求产生 AE_READABLE 事件,服务端会对客户端的连接请求进行应答,将客户端套接字的 AE_READABLE 事件与命令请求处理函数(aeFileProc),客户端可以向服务端发送命令请求了端向服务端发送一个命令请求,客户端套接免费云主机域名字将产生 AE_READABLE 事件,引发命令处理器去执行,执行命令将产生相应的命令回复,服务端将客户端套接字的 AE_WRITABLE 事件与命令回复处理函数(aeFileProc)关联端尝试读取命令回复时,客户端套接字将产生 AE_WRITABLE 事件,触发命令回复处理器执行,当命令回复处理器将命令回复全部写入套接字之后,服务器就会接触客户端套接字的 AE_WRITABLE 事件与命令回复处理函数(aeFileProc)之间的关联感谢各位的阅读,以上就是“怎么理解Redis中的epoll和文件事件”的内容了,经过本文的学习后,相信大家对怎么理解Redis中的epoll和文件事件这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云,小编将为大家推送更多相关知识点的文章,欢迎关注!
本篇内容介绍了“cluvfy的命令列表及实例应用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!cluvfy stage {-list|-help}列出所有参数c…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。