Twemproxy源碼走讀(2):數據結構

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類型的元素串連起來,形成一個鏈表隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章