美文网首页Redis 解析
Redis的事件模型(ae epoll实现方式)

Redis的事件模型(ae epoll实现方式)

作者: 邹志全 | 来源:发表于2019-07-18 22:13 被阅读0次

上一篇我们说到了文件描述符及常见的polling机制,下面来看看ae中对于epoll的封装实现。

image.png

具体完整的交互过程是这样的:

(看一下初始化过程及对应的函数及事件的作用)

1、首先调用aeCreateEventLoop创建了一个事件循环。

2、通过anetTcpServer创建了一个TCP服务器,然后绑定端口并且监听对应的网络请求。

3、调用anetNonBlock将套接字的fd设置为非阻塞IO模式

4、然后将套接字的fd的“客户端连接”时间设置为acceptProc。(然后这个回调函数被aeCreateEventLoop中创建的事件循环使用)

5、当TCP连接建立之后,将触发acceptProc中的动作。

6、通过anetTcpAccept接受连接请求,然后更新套接字中的fd的“有数据可读取”事件的回调函数注册为readProc

7、当readProc被调用时,就可以直接取到可读取的数据,并且更新套接字中的fd的“有数据可写入”事件的回调函数writeProc

8、当EventLoop接收到“有数据可供写入”事件时,就会触发writeProc将数据发送给套接字对应的客户端。

大家可以下载下来看一下,Redis 源码的量其实还好。

wget http://download.redis.io/releases/redis-4.0.1.tar.gz

tar -zxvf redis-4.0.1.tar.gz

image.png

然后进到src 文件夹下,看一下server.c,下面是初始化过程的代码片段,L:1812

server.c 主函数中initServer调用了aeCreateEventLoop、anetTcpServer、anetNonBlock来完成初始化

image.png

处理“客户端连接”事件的函数也是在initServer中进行的 L:1897

image.png

当初始化完成之后,aeMain方法被调用

image.png

然后在aeMain方法中sProcessEvents方法被陆续的调用来处理各个时间。

很显然,在整个交互的过程中没有线程或者进程间的交互及其他线程的创建,这个模型其实就是一个轻量级的上下文切换的IO模型,并且上下文切换的代价还很小。但是Redis 因为是使用单线程进行交互的,一条命令没有处理完,就不能执行另一条命令,所以很容易出现延迟问题,但由于Redis 操作比较高效并且是内存操作,所以说这个问题其实还好啦,并且这种串行操作也完全的避免了并发问题。

基本上这就是Redis的事件模型~

相关文章

  • Redis的事件模型(ae epoll实现方式)

    上一篇我们说到了文件描述符及常见的polling机制,下面来看看ae中对于epoll的封装实现。 具体完整的交互过...

  • ae.c

    Redis的ae.c封装了多种事件驱动框架的使用。如:evport、epoll、kqueue、select。在ae...

  • redis为什么性能高?

    存内存访问,速度高 非阻塞IO,Redis使用epoll作为I/O多路复用技术的实现。redis自身的事件处理模型...

  • Redis 小记

    网络 IO 模型 redis 采用 io 多路复用,默认采用 epoll 方式,也提供了 kqueue、selec...

  • Reactor和Proactor对比

    常见的IO事件处理模型有两种:Reactor和Proactor。Redis中的ae就是采用的Reactor事件处理...

  • linux下redis常用命令和常用数据类型

    redis是单进程模型来处理客户端的请求对读写等事件的响应是通过 epoll函数的包装来做到的.redis的实际处...

  • Redis漫谈之五大类型

    上次讲了从 BIO 到 NIO 最终到 Epoll 的历史过程。 Redis 是单线程模型的。所有客户端的事件都通...

  • Redis源码分析之事件循环

    本篇我们来讲Redis的事件循环,Redis的事件循环会根据系统选择evport、epoll、kqueue或sel...

  • 2020-06-24

    redis IO模型 学习方法 应该从对比的角度去分析其特性; 本篇博客主要针对redis的单线程模型,epoll...

  • Redis启动后杂项基础知识

    Redis启动后杂项基础知识 1. 单进程 单进程模型来处理客户端的请求。对读写等事件的响应是通过对epoll函数...

网友评论

    本文标题:Redis的事件模型(ae epoll实现方式)

    本文链接:https://www.haomeiwen.com/subject/lzmllctx.html