【源码分析】redis网络通讯并发架构简介

来源:互联网 发布:手指泡水起皱 知乎 编辑:程序博客网 时间:2024/05/18 23:26

我记得有一阵子Redis以不可阻挡之势火了起来,大家都说它的性能很高,单位时间内能处理大量请求。于是我很有兴趣知道它是怎么处理网络并发的。这篇文章适合想研究Redis代码而不知从何入手的朋友,并没有展现很多的细节,只对Redis的网络通讯做了一个系统性的介绍。文章分成两部分,第一部分是对Redis所用的事件驱动模型的原理的讲解,第二部分采用跟踪关键代码的形式去探究客户端-服务端是怎么使用这个框架进行通讯的。


第一部分:Redis的事件驱动模型

这个部分只需要看3个源文件:

ae.hae.c — 定义并实现了一个事件驱动的反应器(什么是反应器下文详解),ae具体代表什么我也不知道,

 我猜的话大概,a:asynchronous,e:event

ae_epoll.c — 用系统API实现了反应器所用到的底层I/O功能


注:其实跟ae_epoll.c同样功能的还有ae_evport.cae_kqueue.cae_select.c 3个源文件,对应不同的系统API。因为epoll比较通用,所以这里用epoll做例子


接下来解析一下反应器的工作原理:

反应器有三个要素:事件集合、回调函数、单线程

他们的关系如图所示:



反应器维护一个事件集合,用户向反应器注册事件时,声明该文件描述符关注的事件类型,并设置回调函数,等该事件就绪时,由主线程调用该回调函数

程序主体是一个事件循环,使用多路复用技术处理多个读写请求以及定时器事件


第二部分 应用Redis事件驱动模型的一般通讯流程

2.1 启动消息循环



2.2 客户端连接



2.3 获取请求并回复



总结

Redis自己实现了一个反应器,使用多路复用技术处理并发的读写事件和定时器事件,单线程避免了线程切换的开销和互斥量的等待时间,这些设施对Redis的性能大有裨益。

0 0
原创粉丝点击