1. 程式人生 > >memcached的學習(8)

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架構上我們值得學習的一個模型,在設計網路模型的時候可以學習這種框架。