日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

Nginx基本数据结构之ngx_hash_keys_arrays_t

發(fā)布時間:2024/2/28 Nginx 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx基本数据结构之ngx_hash_keys_arrays_t 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大家看到在構建一個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; hsize:pool:temp_pool:keys:keys_hash:dns_wc_head:dns_wc_tail:dns_wc_head_hash:dns_wc_tail_hash:
將要構建的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。

ha:type:
該結構的對象指針。
該字段有2個值可選擇,即NGX_HASH_SMALL和NGX_HASH_LARGE。用來指明將要建立的hash表的類型,如果是NGX_HASH_SMALL,則有比較小的桶的個數(shù)和數(shù)組元素大小。NGX_HASH_LARGE則相反。
ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key, void *value, ngx_uint_t flags);

一般是循環(huán)調用這個函數(shù),把一組鍵值對加入到這個結構體中。返回NGX_OK是加入成功。返回NGX_BUSY意味著key值重復。

ha:key:value:flags:
該結構的對象指針。
參數(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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。