Nginx基本数据结构之ngx_hash_keys_arrays_t
大家看到在構建一個ngx_hash_wildcard_t的時候,需要對通配符的哪些key進行預處理。這個處理起來比較麻煩。而當有一組key,這些里面既有無通配符的key,也有包含通配符的key的時候。我們就需要構建三個hash表,一個包含普通的key的hash表,一個包含前向通配符的hash表,一個包含后向通配符的hash表(或者也可以把這三個hash表組合成一個ngx_hash_combined_t)。在這種情況下,為了讓大家方便的構造這些hash表,nginx提供給了此輔助類型。
該類型以及相關的操作函數(shù)也定義在src/core/ngx_hash.h|c里。我們先來看一下該類型的定義。
typedef struct {ngx_uint_t hsize;ngx_pool_t *pool;ngx_pool_t *temp_pool;ngx_array_t keys;ngx_array_t *keys_hash;ngx_array_t dns_wc_head;ngx_array_t *dns_wc_head_hash;ngx_array_t dns_wc_tail;ngx_array_t *dns_wc_tail_hash; } ngx_hash_keys_arrays_t;| 將要構建的hash表的桶的個數(shù)。對于使用這個結構中包含的信息構建的三種類型的hash表都會使用此參數(shù)。 | |
| 構建這些hash表使用的pool。 | |
| 在構建這個類型以及最終的三個hash表過程中可能用到臨時pool。該temp_pool可以在構建完成以后,被銷毀掉。這里只是存放臨時的一些內存消耗。 | |
| 存放所有非通配符key的數(shù)組。 | |
| 這是個二維數(shù)組,第一個維度代表的是bucket的編號,那么keys_hash[i]中存放的是所有的key算出來的hash值對hsize取模以后的值為i的key。假設有3個key,分別是key1,key2和key3假設hash值算出來以后對hsize取模的值都是i,那么這三個key的值就順序存放在keys_hash[i][0],keys_hash[i][1], keys_hash[i][2]。該值在調用的過程中用來保存和檢測是否有沖突的key值,也就是是否有重復。 | |
| 放前向通配符key被處理完成以后的值。比如:“*.abc.com” 被處理完成以后,變成 “com.abc.” 被存放在此數(shù)組中。 | |
| 存放后向通配符key被處理完成以后的值。比如:“mail.xxx.*” 被處理完成以后,變成 “mail.xxx.” 被存放在此數(shù)組中。 | |
| ? | 該值在調用的過程中用來保存和檢測是否有沖突的前向通配符的key值,也就是是否有重復。 |
| ? | 該值在調用的過程中用來保存和檢測是否有沖突的后向通配符的key值,也就是是否有重復。 |
在定義一個這個類型的變量,并對字段pool和temp_pool賦值以后,就可以調用函數(shù)ngx_hash_add_key把所有的key加入到這個結構中了,該函數(shù)會自動實現(xiàn)普通key,帶前向通配符的key和帶后向通配符的key的分類和檢查,并將這個些值存放到對應的字段中去, 然后就可以通過檢查這個結構體中的keys、dns_wc_head、dns_wc_tail三個數(shù)組是否為空,來決定是否構建普通hash表,前向通配符hash表和后向通配符hash表了(在構建這三個類型的hash表的時候,可以分別使用keys、dns_wc_head、dns_wc_tail三個數(shù)組)。
構建出這三個hash表以后,可以組合在一個ngx_hash_combined_t對象中,使用ngx_hash_find_combined進行查找。或者是仍然保持三個獨立的變量對應這三個hash表,自己決定何時以及在哪個hash表中進行查詢。
ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type);初始化這個結構,主要是對這個結構中的ngx_array_t類型的字段進行初始化,成功返回NGX_OK。
| 該結構的對象指針。 |
| 該字段有2個值可選擇,即NGX_HASH_SMALL和NGX_HASH_LARGE。用來指明將要建立的hash表的類型,如果是NGX_HASH_SMALL,則有比較小的桶的個數(shù)和數(shù)組元素大小。NGX_HASH_LARGE則相反。 |
一般是循環(huán)調用這個函數(shù),把一組鍵值對加入到這個結構體中。返回NGX_OK是加入成功。返回NGX_BUSY意味著key值重復。
| 該結構的對象指針。 |
| 參數(shù)名自解釋了。 |
| 參數(shù)名自解釋了。 |
| 有兩個標志位可以設置,NGX_HASH_WILDCARD_KEY和NGX_HASH_READONLY_KEY。同時要設置的使用邏輯與操作符就可以了。NGX_HASH_READONLY_KEY被設置的時候,在計算hash值的時候,key的值不會被轉成小寫字符,否則會。NGX_HASH_WILDCARD_KEY被設置的時候,說明key里面可能含有通配符,會進行相應的處理。如果兩個標志位都不設置,傳0。 |
有關于這個數(shù)據(jù)結構的使用,可以參考src/http/ngx_http.c中的ngx_http_server_names函數(shù)。
總結
以上是生活随笔為你收集整理的Nginx基本数据结构之ngx_hash_keys_arrays_t的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx源码分析之变量
- 下一篇: Nginx源码阅读(ngx_http_p