Twemproxy內部定義了若干種數據結構,如概述中所述,包括自定義的數據結構和關鍵數據結構,本章將講述兩種數據結構,爲後面的複雜的邏輯分析掃清障礙。
- 自定義的數據類型: nc_array.c、nc_array.h、nc_string.c、nc_string.h
- 關鍵數據結構和算法: nc_rbtree.h、nc_rbtree.c、nc_queue.h、nc_request.c、nc_response.c、nc_mbuf.c、 nc_mbuf.h、nc_message.c、nc_message.h、nc_server.c、nc_server.h
(1) 數組(nc_array)
數組是一個很常見的數據存儲方式,其特點比如連續存儲、隨機訪問等在此就不累述,這裏只講解在NC中的實現。
NC的array實現需要熟練操作指針,基本所有的數組操作都是內存指針的操作。根據元素個數和元素大小申請一塊連續的內存,像array_idx獲取元素index、array_get獲取指定index處的元素、array_top等操作比較簡單,array_push需要考慮數組已經滿了的情況,如果出現這種情況,爲了減少內存分配和釋放的次數,NC會重新申請當前數組長度兩倍的內存,然後才能將新元素放入數組。
還有一點,nc_array實際上是一個棧的操作,只能在array的尾部執行添加(push)和刪除(pop)操作,但是查看元素不限位置,只需知道元素的index就可查看該index上的元素。
(2) 字符串(nc_string)
NC字符串string是一個結構體,包含長度和值,如下:
針對string的操作是對glibc庫中字符串操作的一系列的封裝。
(3) 紅黑樹(nc_rbtree)
Nc源碼裏實現了紅黑樹的初始化,查找最小值,插入和刪除操作
對紅黑樹的講解下面的這篇博客講解的比較清晰,可以參考:
http://blog.csdn.net/chenhuajie123/article/details/11951777
(4) 隊列(nc_queue)
NC的列表沒有自己實現,而是採用了“拿來主義”,借用了系統內核代碼sys/queue.h。該頭文件中共定義了5種數據結構,全部採用宏定義的方式實現:
l singly-linked lists
l singly-linked tail queues
l lists
l tail queues
l circular queues
在NC中只使用了其中的單向尾隊列(STAILQ,用於內存池)和尾隊列(TAILQ,用於管理client或server的連接隊列)。
網絡上講解這五種數據結構的文章比較多,在此不再累述。
(5) 內存池(nc_mbuf)
內存池(mbuf)內部採用單向尾隊列(STAILQ)作爲存儲結構。
mbuf定義了一個struct mhdr類型的STAILQ單向尾隊列,隊列通過兩個mbuf類型的指針stqh_first和stqh_last將若干個mbuf類型的元素串連起來,形成一個鏈表隊列。