线程模型
首先,memcache 在启动的时候会初始化一组 worker 线程,主线程接收到的请求都会转给 worker 线程去处理。需要多提一句的是,主线程与各 worker 线程之间是通过 libevent 通信的, memcache 处理各种 IO 操作都基于的 libevent。
线程模型.png处理流程
当主线程接收到请求连接(connection)的时候,会将请求转发给 worker 线程。请求的处理流程集中在memcache.c
文件里的drive_machine
方法当中。drive_machine
其实是一个大号的状态机,处理流程经历的状态如一下代码所示:
/**
* Possible states of a connection.
*/
enum conn_states {
conn_listening,
conn_new_cmd,
conn_waiting,
conn_read,
conn_parse_cmd,
conn_write,
conn_nread,
conn_swallow,
conn_closing,
conn_mwrite,
conn_closed,
conn_max_state
};
其中解析、处理请求是在conn_parse_cmd
开始进行的,主要的逻辑是在process_command
函数当中,里面含有对不同命令的处理函数,函数名一般叫process_xxx_command
。
关联数组
memache 使用 Associative Array 来实现的缓存功能。主要的逻辑在assoc.h
和assoc.c
代码文件中。worker 线程接到请求的时候会根据命令类型(set
,get
etc)对关联数组做不同的操作。
网友评论