memcached的学习(8)

2018.6.13
接下来分析memecached服务端的源码分析,主要目的是了解其中的数据结构,以及缓冲区的替换算法这一部分。
希望一步一步把memcached的代码看懂,找到了一篇参考博客,对memecached源码分析比较透彻,这里给出链接:https://blog.csdn.net/initphp/article/details/44893869

同样,采用参考博客的目录,按照以下的目录进行学习:
在这里插入图片描述

首先来看下memcached的网络模型部分,主要说明如下:

Memcached分析

1. 网络模型流程分析

Memcached主要是基于Libevent的事件库来实现网络线程模型的。我们先需要下载memcached的源码包。

Memcached的网络线程模型主要涉及两个主要文件:memcached.c 和thread.c文件。
我们这边主要分析tcp的模型。memcached也支持udp。

流程
  1. memcached首先在主线程中会创建main_base,memcached的主线程的主要工作就是监听和接收listen和accpet新进入的连接。
  2. 当memcached启动的时候会初始化N个worker thread工作线程,每个工作线程都会有自己的LIBEVENT_THREAD数据结构来存储线程的信息(线程基本信息、线程队列、pipe信息)。worker thread工作线程和main thread主线程之间主要通过pipe来进行通信。
  3. 当用户有连接进来的时候,main thread主线程会通过求余的方式选择一个worker thread工作线程。
  4. main thread会将当前用户的连接信息放入一个CQ_ITEM,并且将CQ_ITEM放入这个线程的conn_queue处理队列,然后主线程会通过写入pipe的方式来通知worker thread工作线程。
  5. 当工作线程得到主线程main thread的通知后,就会去自己的conn_queue队列中取得一条连接信息进行处理,创建libevent的socket读写事件。
  6. 工作线程会监听用户的socket,如果用户有消息传递过来,则会进行消息解析和处理,返回相应的结果。
流程图

在这里插入图片描述

主线程的任务流图及对应的函数:

在这里插入图片描述

工作线程的任务流图及对应的函数:

在这里插入图片描述
总的来说,网络模型是用libevent的事件来驱动的,事件的不同类型通过注册回调函数,调用状态机来完成。

总结与启发:

学习了memcached的网络模型,主要是服务于多个客户端TCP连接的网络模型创建,也是CS架构上我们值得学习的一个模型,在设计网络模型的时候可以学习这种框架。

猜你喜欢

转载自blog.csdn.net/u012414189/article/details/84317190