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提供给了此辅助类型。

该类型以及相关的操作函数也定义在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: 将要构建的hash表的桶的个数。对于使用这个结构中包含的信息构建的三种类型的hash表都会使用此参数。

pool: 构建这些hash表使用的pool。

temp_pool:在构建这个类型以及最终的三个hash表过程中可能用到临时pool。该temp_pool可以在构建完成以后,被销毁掉。这里只是存放临时的一些内存消耗。

keys: 存放所有非通配符key的数组。

keys_hash: 这是个二维数组,第一个维度代表的是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值,也就是是否有重复。

dns_wc_head: 存放前向通配符key被处理完成以后的值。比如:“*.abc.com”被处理完成以后,变成“com.abc.”被存放在此数组中。

dns_wc_tail: 存放后向通配符key被处理完成以后的值。比如:“mail.xxx.*”被处理完成以后,变成“mail.xxx.”被存放在此数组中。

dns_wc_head_hash: 该值在调用的过程中用来保存和检测是否有冲突的前向通配符的key值,也就是是否有重复。

dns_wc_tail_hash: 该值在调用的过程中用来保存和检测是否有冲突的后向通配符的key值,也就是是否有重复。

在定义一个这个类型的变量,并对字段pool和temp_pool赋值以后,就可以调用函数ngx_hash_add_key把所有的key加入到这个结构中了,该函数会自动实现普通key,带前向通配符的key和带后向通配符的key的分类和检查,并将这个些值存放到对应的字段中去,

然后就可以通过检查这个结构体中的keys、dns_wc_head、dns_wc_tail三个数组是否为空,来决定是否构建普通hash表,前向通配符hash表和后向通配符hash表了(在构建这三个类型的hash表的时候,可以分别使用keys、dns_wc_head、dns_wc_tail三个数组)。

构建出这三个hash表以后,可以组合在一个ngx_hash_combined_t对象中,使用ngx_hash_find_combined进行查找。或者是仍然保持三个独立的变量对应这三个hash表,自I机决定何时以及在哪个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,则有比较小的桶的个数和数组元素大小。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);

一般是循环调用这个函数,把一组键值对加入到这个结构体中。返回NGX_OK是加入成功。返回NGX_BUSY意味着key值重复。

ha: 该结构的对象指针。

key: 参数名自解释了。

value: 参数名自解释了。

flags: 有两个标志位可以设置,NGX_HASH_WILDCARD_KEY和NGX_HASH_READONLY_KEY。同时要设置的使用逻辑与操作符就可以了。NGX_HASH_READONLY_KEY被设置的时候,在计算hash值的时候,key的值不会被转成小写字符,否则会。NGX_HASH_WILDCARD_KEY被设置的时候,说明key里面可能含有通配符,会进行相应的处理。如果两个标志位都不设置,传0。

有关于这个数据结构的使用,可以参考src/http/ngx_http.c中的ngx_http_server_names函数。

转载自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=686647&id=3392072

时间: 2024-10-25 11:47:47

Nginx基础数据结构分析-ngx_hash_keys_arrays_t的相关文章

Nginx基础数据结构分析-ngx_array_t

ngx_array_t是nginx内部使用的数组结构.nginx的数组结构在存储上与大家认知的C语言内置的数组有相似性,比如实际上存储数据的区域也是一大块连续的内存.但是数组除了存储数据的内存以外还包含一些元信息来描述相关的一些信息.下面我们从数组的定义上来详细的了解一下.ngx_array_t的定义位于src/core/ngx_array.c|h里面. ngx_array_t结构的定义如下: typedef struct ngx_array_s ngx_array_t; struct ngx_

Nginx基础数据结构分析-ngx_buf_t

这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据.该结构实际上是一种抽象的数据结构,它代表某种具体的数据.这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分,也可能是一些纯元数据(元数据的作用在于指示这个链表的读取者对读取的数据进行不同的处理). 该数据结构位于src/core/ngx_buf.h|c文件中.我们来看一下它的定义. struct ngx_buf_s { u_char *pos; u_char *last; off_t file_pos;

Nginx基础数据结构分析-ngx_list_t

ngx_list_t顾名思义,看起来好像是一个list的数据结构.这样的说法,算对也不算对.因为它符合list类型数据结构的一些特点,比如可以添加元素,实现自增长,不会像数组类型的数据结构,受到初始设定的数组容量的限制,并且它跟我们常见的list型数据结构也是一样的,内部实现使用了一个链表. 那么它跟我们常见的链表实现的list有什么不同呢?不同点就在于它的节点,它的节点不像我们常见的list的节点,只能存放一个元素,ngx_list_t的节点实际上是一个固定大小的数组. 在初始化的时候,我们需

[喵咪软件推荐(1)]全球化地址基础数据

[喵咪软件推荐(1)]全球化地址基础数据 前言 哈喽大家好啊!今天又来刨坑了,这次给大家带来的是软件推荐系列,主要是把一些特别好用的一些软件推荐给大家并且分析使用场景以及用法,今天要给大家介绍的一个类软件呢,主要是解决全球化地址这类问题,那么话不多说进入今天的正片环节. 附上: 喵了个咪的博客:w-blog.cn 全球国家信息国旗以及经纬度范围:https://github.com/mledoze/countries 全球国家各语言名称:https://github.com/umpirsky/c

如何做到ERP基础数据的整理?

参与过ERP项目实施的人都应该知道,ERP项目实施能够成功,关键在于细节.有人这样说,ERP不难,只是很繁.这里所说的繁,指的就是整理ERP基础数据的过程.整理ERP基础数据的确很繁琐,这个过程并不比ERP上线轻松,但它并不难,只要坚持,就一定能够实现.ERP项目实施成功靠的是三分技术,七分管理,十二分数据.可见,ERP系统中基础数据整理的重要性. ERP系统中共有三大数据源,分别为工程数据源,库存数据源和其它各项参数的设置.其中,工程数据源和库存数据源占据了整个ERP系统数据库的90%,它们的

【原创】C#搭建足球赛事资料库与预测平台(3) 基础数据表设计

        本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html  开源C#彩票数据资料库系列文章总目录:http://www.cnblogs.com/asxinyu/p/4329642.html  本篇文章开始将逐步介绍使用C#搭建足球赛事资料库与预测平台的相关细节.还是先从数据库开始,从本文开始将逐步对每个核心实体类和数据库设计相关的内容进行讲解,并公布源代码,至于能不能跑起来,看的看个人努力.数据库很庞大,且采用了XCo

电影 影院 影片 信息-电影 APP 基础数据接口 API

问题描述 电影 APP 基础数据接口 API 目前公司想做一个电影APP,与影院的交易接口API有了.但是他们没有基础数据的API (影院详细信息.影片详细信息),他们交易就只有影院.影片的编码+名称交易. 想咨询网上的大牛,怎么获取这些影院.影片的详细基础信息,还有即将上映的电影信息.其他电影购买平台都是怎么做这些基础数据的? 解决方案 1.如果API里没有,看数据库里是否有,如果有的话,可以从数据库中抓取 2.从网上找相关的信息,手工录入系统中

互联网金融-最近股市板块轮动明显,想开发一款主题投资工具,缺少基础数据,请问如何获取主题资讯数据?

问题描述 最近股市板块轮动明显,想开发一款主题投资工具,缺少基础数据,请问如何获取主题资讯数据? 想开发主题投资工具 目前沪指大幅震荡板块轮动明显,想开发一款主题投资工具,为股民把握市场风格变幻助力: 1.通过新闻资讯和市场行情,自动挖掘->发现->推荐 新主题和热点主题 2. 自动关联主题板块,所对应的成分股 3.辅以关联分析.回测计算等运算快速获最新主题及其关联股票的涨幅收益概览 遇到的困难 目前 媒体.微博.贴吧等等最新资讯的获取,以及主题关键词抽取.内容聚合等大数据挖掘,分析,计算等等

Nginx基础知识、安装及调试

编写此技术指南在于推广普及NGINX在国内的使用,更方便的帮助大家了解和掌握NGINX的一些使用技巧.本指南很多技巧来自于网络和工作中或网络上朋友们问我的问题.在此对网络上愿意分享的朋友们表示感谢和致意!欢迎大家和我一起丰富本技术指南提出更好的建议! Nginx http://www.aliyun.com/zixun/aggregation/22929.html">基础知识 1.简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,