nginx的数据结构

本文详细介绍了Nginx中的关键数据结构,包括整型的封装、字符串ngx_str_t、链表ngx_list_t、HTTP头部ngx_table_elt_t及缓冲区ngx_buf_t等。这些数据结构的设计有助于理解Nginx高效运作的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整型

    nginx使用ngx_int_t和ngx_uint_t封装有符号整型和无符号整型。


ngx_str_t数据结构

    在nginx中ngx_str_t结构就是字符串,但是它与普通字符串有些不一样,它不是以/0结尾的。而是通过一个len来指明字符串长度。所以如果将ngx_str_t类型当作字符串来使用,很可能会造成内存越界。但是这样做的好处是:可以有效的降低内存的使用量,例如:将用户请求“GET/test?a=1 http/1.1\r\n"存储到内存0x1d0b0110上,这时只需要将r->method_name设置为{len=3,data=0x1d0b0110}就可以表示方法名GET,而不需要再分配内存来存储字符串。

typedef struct{
    size_t len;
    u_char *data;
}ngx_str_t;


ngx_list_t数据结构

    nginx中对于链表的的定义如下:

typedef struct ngx_list_part_s ngx_list_part_t;
struct ngx_list_part>s{
    void *elts;  //数组的起始地址
    ngx_uint_t nelts; //数组中已使用的元素个数
    ngx_list_part_t *next; //下一个链表元素
};

typedef struct{
    ngx_list_part_t *last; //链表的最后一个元素地址
    ngx_list_part_t part; //链表的首个元素
    size_t size;    //数组元素占用的空间大小
    ngx_uint_t nalloc; //每个part中数组的最大容量,即最多存储的数据个数
    ngx_pool_t *pool; //链表中管理内存分配的内存池对象
}ngx_list_t;

    ngx_list_t描述整个链表,而ngx_list_part_t只描述链表的一个元素。ngx_list_t不是一个单纯的链表,它就像一个存储元素是数组的链表,这样做的好处是链表中存储的元素是灵活的,它可以是任何一种数据结构,链表元素需要占用的内存由ngx_list_part_t管理,它已经通过数组分配好了;小块的内存使用链表访问效率是低下的,使用数组通过偏移量来直接访问内存则要高效的多。ngx_list_t提供了三个接口,ngx_list_create() , ngx_list_init() , ngx_list_push() 


ngx_table_elt_t数据结构

typedef struct{
    ngx_uint_t hash;
    ngx_str_t key;
    ngx_str_t value;
    u_char *lowcase_key;
}ngx_table_elt_t;

 从上面的代码中可以看到,ngx_table_elt_t就是一个key/value对,key和value都是以字符串的形式来存的,显而易见,ngx_table_elt_t是为HTTP头部量身定制的,其中key存储头部名称,value存储对应的值。有时候我们对大小写不敏感,因此lowcase_key是全小写的。而hash用于快速检索头部。


ngx_buf_t数据结构

    缓冲区ngx_buf_t 是nginx处理大数据的关键数据结构,它既应用于内存数据也应用于磁盘数据。


ngx_chain_t数据结构

    与ngx_buf_t配合使用的链表结构。

typedef struct ngx_chain_s ngx_chain_t;
struct ngx_chain_s{
    ngx_buf_t *buf;
    ngx_chain_t *next;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值