一、前言

Redis网络库是一个单线程EPOLL模型的网络库,和Memcached使用的libevent相比,它没有那么庞大,代码一共2000多行,因此比较容易分析。其实网上已经有非常多有关这个网络库的分析了,但是我觉得它们的不足在于只是分析了各个文件中各个函数的单独含义,而没有将其统一起来,不能给读者一种宏观的把握。比如我如果想把这个网络库直接拿出来为我所用该怎么办,但是 @浅墨 学长已经完成了这个事,他拿出了Redis网络部分的代码,设计了应用层协议,添加了应用层buffer,定义了服务器类型。让它现在变成了一个可以实现简单聊天的小程序。 大家可以 fork这个项目,在这个单线程的网络模型上做更多有意思的事情。

因此我的分析基于这个简单的聊天程序,我们从创建服务器开始,到它开始工作,把整个过程疏理一遍其实网络库主干就已经出来了,而且这种方式更加容易让人明白各个函数的真正含义,话不多说,撸起袖子开干。

二、环境准备

1:fork&clone

$ git clone https://github.com/hurley25/ANet.git

2: 测试一波

$ cd ANet/
$ cmake .
$ make
$ ./server
$ ./server_test //在另一个终端

备注:客户端测试分为三次发送(每次20个数据包),第一次正常发送,第二次usleep(10000),第三次分为单个字节发送,服务器端结果显示均正常到达。TCP是一个流协议,保证按字节到达,应用层的粘包需要我们自己处理,这里是通过测试的。

三、模型介绍

Redis网络库是一个单线程EPOLL模型,也就是说接收连接处理读写请求包括定时器任务都被这一个线程包揽,真的是又当爹又当妈,但是效率一定比多线程差吗?不见得。

单线程的好处有:
1:避免线程切换带来的上下文切换开销。
2:单线程避免了锁的争用。
3:对于一个内存型数据库,如果不考虑数据持久化,也就是读写物理磁盘,不会有阻塞操作,内存操作是非常快的。

它的处理流程如图所示:

四、各个文件含义介绍

各个文件的含义如下所示(前两行是Redis源码):

文件 作用
ae.c ae.h ae_epoll.c ae_select.c Redis事件处理器的实现,Linux平台上是epoll(Redis源码)
anet.c anet.h Redis网络库的实现(Redis源码)
buffer.c buffer.h 自行实现的buffer
protocol.c protocol.h 自行定义协议
define.h 一些常量,比如listen的backlog大小
server.c server.h server_test.c 自定义的服务端和客户端程序

Redis网络库源码分析(1)之介绍篇的更多相关文章

  1. Redis网络库源码分析(3)之ae.c

    一.aeCreateEventLoop & aeCreateFileEvent 上一篇文章中,我们已经将服务器启动,只是其中有些细节我们跳过了,比如aeCreateEventLoop函数到底做 ...

  2. Redis网络库源码分析(2)之启动服务器

    一.从main开始 main函数定义在server.c中,它的内容如下: //server.c int main() { signal(SIGPIPE, SIG_IGN); //忽略SIGPIPE信号 ...

  3. 第08课:【实战】Redis网络通信模块源码分析(1)

    我们这里先研究redis-server端的网络通信模块.除去Redis本身的业务功能以外,Redis的网络通信模块实现思路和细节非常有代表性.由于网络通信模块的设计也是Linux C++后台开发一个很 ...

  4. 第10课:[实战] Redis 网络通信模块源码分析(3)

    redis-server 接收到客户端的第一条命令 redis-cli 给 redis-server 发送的第一条数据是 *1\r\n\$7\r\nCOMMAND\r\n .我们来看下对于这条数据如何 ...

  5. Redis事件库源码分析

    由于老大在新项目中使用redis的事件库代替了libevent,我也趁着机会读了一遍redis的事件库代码,第一次读到“优美,让人愉快”的代码,加之用xmind制作的类图非常帅,所以留文纪念. Red ...

  6. 第09课:【实战】Redis网络通信模块源码分析(2)

    侦听 fd 与客户端 fd 是如何挂载到 EPFD 上去的 同样的方式,要把一个 fd 挂载到 EPFD 上去,需要调用系统 API epoll_ctl ,搜索一下这个函数名.在文件 ae_epoll ...

  7. # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#

    Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...

  8. 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02

    百篇博客系列篇.本篇为: v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  9. 鸿蒙内核源码分析(汇编传参篇) | 如何传递复杂的参数 | 百篇博客分析OpenHarmony源码 | v23.02

    百篇博客系列篇.本篇为: v23.xx 鸿蒙内核源码分析(汇编传参篇) | 如何传递复杂的参数 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...

随机推荐

  1. Shell系列(14)- declare声明变量

    declare声明变量类型 格式 declare [+/-] [选项] [变量名] 选项 -:给变量设定类型属性 +:取消变量的类型属性 -a :将变量声明为数组型 -i :将变量声明为整数型(int ...

  2. Matlab使用随记

    Matlab 2020 想要看图像每一点的值大小 工具--->数据提示 想要导出的分辨率提高 导出设置--->渲染--->600dpi Matlab 2017b 程序运行后,画出图, ...

  3. maven项目环境变量配置及创建(一)

    Maven是基于JAVA平台的一款编译.测试.打包部署及运行的构建工具 1:首先需要下载安装JDK 2:安装Eclipse 3:下载maven包(https://maven.apache.org/do ...

  4. sublime text 3 在Windows下配置sublimelinter-php的路径问题

    首先用package control安装sublimelinter和sublimelinter-php,然后依次点击菜单preference-package settings-sublimelinte ...

  5. 12306抢票算法居然被曝光了!!!居然是redis实现的

    导读 相信大家应该都有抢火车票的经验,每年年底,这都是一场盛宴.然而你有没有想过抢火车票这个算法是怎么实现的呢? 应该没有吧,咱们今天就来一一探讨.其实并没有你想的那么难 bitmap与位运算 red ...

  6. P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P5305 题目大意 给一棵有根树和\(k\),\(Q\)次询问给出\(x,y\)求 \[\sum_{i=1}^{x} ...

  7. C# WPF MVVM项目实战(进阶②)

    这篇文章还是在之前用Caliburn.Micro搭建好的框架上继续做的开发,今天主要是增加了一个用户窗体ImageProcessView,然后通过Treeview切换选择项之后在界面显示不同效果的图片 ...

  8. Spring技术内幕笔记2--我懒不写了哈哈哈哈。

    目录 1.1 关于IOC容器设计的线路区别 1.1.1 BeanFactory 1.1.2 ApplicationContext 2.1 FileSystemXmlApplicationContext ...

  9. typora博客笔记上传图片时不能显示

    前言 markdown具有轻量化.易读易写等特性,并且对于图片.超链接.图片.数学公式都有支持. 但是最近在使用Typora的过程中我发现,在写文章笔记的时候导入的图片,因为图片保存在我们电脑本地,当 ...

  10. js--标签语法的使用

    前言 在日常开发中我们经常使用到递归.break.continue.return等语句改变程序运行的位置,其实,在 JavaScript 中还提供了标签语句,用于标记指定的代码块,便于跳转到指定的位置 ...