redis-server 接收到客户端的第一条命令 redis-cli 给 redis-server 发送的第一条数据是 *1\r\n\$7\r\nCOMMAND\r\n .我们来看下对于这条数据如何处理,单步调试一下 readQueryFromClient 调用 read 函数收取完数据,接着继续处理 c→querybuf 的代码即可.经实际跟踪调试,调用的是 processInputBuffer 函数,位于 networking.c 文件中: /* This function is call…
我们这里先研究redis-server端的网络通信模块.除去Redis本身的业务功能以外,Redis的网络通信模块实现思路和细节非常有代表性.由于网络通信模块的设计也是Linux C++后台开发一个很重要的模块,虽然网络上有很多现成的网络库,但是简单易学且可以作为典范的并不多,而redis-server就是这方面值得借鉴学习的材料之一. 8.1侦听socket初始化工作 通过前面课程的介绍,我们知道网络通信在应用层上的大致流程如下: *服务器端侦听socket: *将侦听socket绑定到需要的…
侦听 fd 与客户端 fd 是如何挂载到 EPFD 上去的 同样的方式,要把一个 fd 挂载到 EPFD 上去,需要调用系统 API epoll_ctl ,搜索一下这个函数名.在文件 ae_epoll.c 中我们找到 aeApiAddEvent 函数: static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) { aeApiState *state = eventLoop->apidata; struct epoll_e…
一.前言 Redis网络库是一个单线程EPOLL模型的网络库,和Memcached使用的libevent相比,它没有那么庞大,代码一共2000多行,因此比较容易分析.其实网上已经有非常多有关这个网络库的分析了,但是我觉得它们的不足在于只是分析了各个文件中各个函数的单独含义,而没有将其统一起来,不能给读者一种宏观的把握.比如我如果想把这个网络库直接拿出来为我所用该怎么办,但是 @浅墨 学长已经完成了这个事,他拿出了Redis网络部分的代码,设计了应用层协议,添加了应用层buffer,定义了服务器类…
一.aeCreateEventLoop & aeCreateFileEvent 上一篇文章中,我们已经将服务器启动,只是其中有些细节我们跳过了,比如aeCreateEventLoop函数到底做了什么? 接下来我们要分析ae.c文件,它是整个Redis网络事件框架,其中定义了各个管理事件的函数,比如aeCreateFileEvent,aeDeleteFileEvent分别是注册新的事件和删除事件. 其实aeCreateEventLoop的作用主要是给server->loop申请空间. //ae…
一.从main开始 main函数定义在server.c中,它的内容如下: //server.c int main() { signal(SIGPIPE, SIG_IGN); //忽略SIGPIPE信号,防止给一个已经关闭socket的客户端连续两次发送数据导致SIGPIPE信号 //的产生,它的默认做法是终止进程. server_t server; //创建一个server bzero(&server, sizeof(server)); server.backlog = DEFAULT_LIST…
Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透源码还是需要先宏观后微观的分支线式地来跟踪源码的来龙去脉.这才能把源码分析清楚.分析透彻.并且在了解源码的基础上根据自己的需求进行相应的改造. Volley这个系列分析源码的人很多了.但是分析完代码能够带入实际工程场景进行改造改良使其适应自己工程的博文还是很少的.这里会按照先宏观后围观,先简单后复杂…
背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现它的有点无处不在的感觉.比如我们经常使用的spring框架,其spring-web包下就在使用该机制. 还有我们每个项目都离不开的日志框架log4j和数据库驱动框架中也同样的使用着SPI机制. 这么看来,SPI机制可谓无处不在,那么今天这篇文章就带大家揭开它的神秘面纱. 什么是SPI机制 SPI机制…
转载自 http://www.jianshu.com/p/9e17727f31a1?utm_campaign=maleskine&utm_content=note&utm_medium=mobile_author_hots&utm_source=recommendation   公司最近新起了一个项目,对喜欢尝鲜的我们来说,好处就是我们可以在真实的项目中想尝试一些新技术,验证想法.新项目对网络框架的选取,我们存在三种方案: 1.和我们之前的项目一样,使用Loader + HttpC…
1.为什么要服务发现? 服务实例的网络位置都是动态分配的.由于扩展.失败和升级,服务实例会经常动态改变,因此,客户端代码需要使用更加复杂的服务发现机制. 2.常见的服务发现开源组件 etcd—用于共享配置和服务发现的高可用性.分布式.一致的键值存储.使用etcd的两个著名项目是Kubernetes和Cloud Foundry.consul-发现和配置服务的工具.它提供了一个API,允许客户端注册和发现服务.领事可以执行健康检查,以确定服务的可用性.Apache Zookeeper——一个广泛使用…