線程模型
??首先糯而,memcache 在啟動(dòng)的時(shí)候會(huì)初始化一組 worker 線程,主線程接收到的請(qǐng)求都會(huì)轉(zhuǎn)給 worker 線程去處理泊窘。需要多提一句的是熄驼,主線程與各 worker 線程之間是通過 libevent 通信的, memcache 處理各種 IO 操作都基于的 libevent。
![線程模型.png](http://bcs.duapp.com/kilifala/fbe55c36c2c6d3e77df7da980967f8c3.png)
線程模型.png
處理流程
??當(dāng)主線程接收到請(qǐng)求連接(connection)的時(shí)候烘豹,會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給 worker 線程瓜贾。請(qǐng)求的處理流程集中在memcache.c
文件里的drive_machine
方法當(dāng)中。drive_machine
其實(shí)是一個(gè)大號(hào)的狀態(tài)機(jī)携悯,處理流程經(jīng)歷的狀態(tài)如一下代碼所示:
/**
* 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
};
??其中解析祭芦、處理請(qǐng)求是在conn_parse_cmd
開始進(jìn)行的,主要的邏輯是在process_command
函數(shù)當(dāng)中憔鬼,里面含有對(duì)不同命令的處理函數(shù)龟劲,函數(shù)名一般叫process_xxx_command
。
關(guān)聯(lián)數(shù)組
??memache 使用 Associative Array 來實(shí)現(xiàn)的緩存功能轴或。主要的邏輯在assoc.h
和assoc.c
代碼文件中昌跌。worker 線程接到請(qǐng)求的時(shí)候會(huì)根據(jù)命令類型(set
,get
etc)對(duì)關(guān)聯(lián)數(shù)組做不同的操作。