- 博客(148)
- 收藏
- 关注
原创 图解redis的压缩列表
压缩列表(ziplist)是列表键和哈希键的底层实现之一。列表键里面包含的都是1、3、5、10086这样的小整数值,以 及"hello"、"world"这样的短字符串。另外,当一个哈希键只包含少量键值对,比且每个键值对的键和值 要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使 用压缩列表来做哈希键的底层实现。
2023-03-18 12:14:10
713
原创 图解redis的跳跃表
跳跃表是有序集合的底层实现之一。·Redis的跳跃表实现由zskiplist和zskiplistNode两个结构组成,其中zskiplist用于保存跳跃表信息(比如表头节点、表尾节点、长度),而zskiplistNode则用于表示跳跃表节点。·每个跳跃表节点的层高都是1至32之间的随机数。·在同一个跳跃表中,多个节点可以包含相同的分值,但每个节点的成员对象必须是唯一的。·跳跃表中的节点按照分值大小进行排序,当分值相同时,节点按照成员对象的大小进行排序。
2023-03-17 08:52:45
589
原创 图解redis的字典
·字典被广泛用于实现Redis的各种功能,其中包括数据库和哈希键。·Redis中的字典使用哈希表作为底层实现,每个字典带有两个哈希 表,一个平时使用,另一个仅在进行rehash时使用。·当字典被用作数据库的底层实现,或者哈希键的底层实现时, Redis使用MurmurHash2算法来计算键的哈希值。·哈希表使用链地址法来解决键冲突,被分配到同一个索引上的多 个键值对会连接成一个单向链表。·在对哈希表进行扩展或者收缩操作时,程序需要将现有哈希表包 含的所有键值对rehash到新哈希表里面,并且
2023-03-16 16:44:14
415
原创 图解redis之链表的实现
双端:链表节点带有prev和next指针,获取某个节点的前置节点和 后置节点的复杂度都是(1)。·无环:表头节点的prev指针和表尾节点的next指针都指向NULL, 对链表的访问以NULL为终点。·带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)。·带链表长度计数器:程序使用list结构的len属性来对list持有的链表 节点进行计数,程序获取链表中节点数量的复杂度为O(1)。
2023-03-16 16:10:55
568
原创 redis之动态字符串sds的实现
Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符 数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串 (simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认 字符串表示C字符串只会作为字符串字面量(string literal)用在 一些无须对字符串值进行修改的地方sds1.当Redis需要的不仅仅是一个字符串字面量,而是一个可以被修改 的字符串值时,Redis就会使用SDS来表示字符串值那么Redis将在数据库中创建一个
2023-03-16 15:44:54
1002
原创 数据库概述之重点
在sql中,必须定义好地段和表结构之后,才能够添加数据,例如定义表的主键、索引、外键等。表结构可以在定义之后更新,但是如果有比较大的结构变更,就会变的比较复杂。在Nosql数据库中,数据可以在任何时候任何地方添加。不需要预先定义。
2023-03-14 10:16:31
172
原创 Nginx upstream实战
通常, 在启动upstream时, 我们将决定以何种方式处理上游响应的包体, 前文说过, 我们会原封不动地转发百度的响应包体到客户端, 这一行为是由ngx_http_request_t结构体中的subrequest_in_memory标志位决定的, 默认情况subrequest_in_memory为0, 即表示将转发上游的包体到下游。这两个方法也是通用的, 它们适用于解析所有的HTTP响应包, 而且这个方法的代码ngx_http_proxy_module模块的实现几乎是完全一致的。
2023-02-24 16:36:54
1997
原创 深度解析linux的文件系统
1.Unix使用了四种和文件系统相关的传统抽象概念:文件、目录项、索引节点和安装点( mount point)。从本质上讲文件系统是特殊的数据分层存储结构,它包含文件、目录和相关的控制信息。文件系统的通用操作包含创建、删除和安装等。2.在 Unix中,文件系统被安装在一个特定的安装点上该安装点在全局层次结构中被称作命名空间,所有的已安装文件系统都作为根文件系统树的枝叶出现在系统中。3.文件:文件其实可以做一个有序字节串,字节串中第一个字节是文件的头,最后一个字节是文件的尾。
2023-02-23 15:55:01
463
原创 关于upstream的八种回调方法
process_header可能会被多次调用, 它的调用次数与process_header的返回值有关如果process_header返回NGX_AGAIN, 这意味着还没有接收到完整的响应头部, 如果再次接收到上游服务器发来的TCP流, 还会把它当做头部, 仍然调用process_header处理,而在下图中, 如果process_header返回NGX_OK( 或者其他非NGX_AGAIN的值) , 那么在这次连接的后续处理中将不会再次调用process_header。
2023-02-22 15:47:10
862
原创 如何使用ngxin的 upstream
4) 在http模块中, 调用ngx_http_upstream_init方法即可启动upstream机制。注意,自己的模板回调方法此时必须返回NGX_DONE,
2023-02-21 15:39:44
1895
原创 error日志的用法
可以看到, 如果只是想把相应的信息记录到日志文件中, 那么完全不需要关心ngx_log_t类型的log参数是如何构造的。特别是在编写HTTP模块时, HTTP框架要求所有的HTTP模块都使用它提供的log, 如果重定义ngx_log_t中的handler方法, 或者修改data指向的地址, 那么很可能会造成一系列问题。
2023-02-20 15:06:13
568
原创 读懂ngxin的http配置(1)
在开发功能灵活的Nginx模块时,需要从配置文件中获取特定的信息,不过,不需要再 编写一套读取配置的系统,Nginx已经为用户提供了强大的配置项解析机制,同时它还支持“- s reload”命令——在不重启服务的情况下可使配置生效例子:总体解析:1.test_str这个配置项在http块内出现的值为main,在监听80端口的 server块内test_str值为server80,该server块内有两个location由mytest模块处理的且每个location中又重新设置了test_str的值,分
2023-01-11 20:42:49
456
原创 如何自定义配置项处理办法和合并
例子:参数解析:1.参数conf就是HTTP框架传给用户的在ngx_http_mytest_create_loc_conf回调方法中分配的结构体ngx_http_mytest_conf_t(相当一座桥梁)2.cf->args是1个ngx_array_t队列,它的成员都是ngx_str_t结构。我们用value指向ngx_array_t的elts内容,其中value[1]就是第1个参数,同理,value[2]是第2个参数 (int main(char*arg....))
2023-01-11 20:38:58
561
原创 深度解析ngx_command_t结构
因为HTTP框架可以使用预设的14种方法自动 地将解析出的配置项写入HTTP模块代码定义的结构体中,但HTTP模块中可能会定义3个结 构体,分别用于存储main、srv、loc级别的配置项(对应于create_main_conf、 create_srv_conf、create_loc_conf方法创建的结构体),如果需要在解析完配置项后回调某个方法,就要实现 上面的ngx_conf_post_handler_pt,并将包含post_handler的ngx_conf_post_t结构体传给post指 针。
2023-01-09 20:01:27
818
原创 ngxin将磁盘文件作为包体发送
发送文件时完全可以先把 文件读取到内存中再向用户发送数据,但是这样做会有两个缺点:·为了不阻塞Nginx,每次只能读取并发送磁盘中的少量数据,需要反复持续多次。·Linux上高效的sendfile系统调用不需要先把磁盘中的数据读取到用户态内存再发送到 网络中note:1.fd是打开文件的句柄描述符,打开文件这一步需要用户自己来做。Nginx简单封装了一个宏用来代替open系统的调用。
2023-01-09 12:12:02
404
原创 基于ngxin一个http模板
commands数组用于定义模块的配置文件参数,每一个数组元素都是ngx_command_t类型,数组的结尾用ngx_null_command表示。Nginx在解析配置文件中的一个配置项时首先会遍历所有的模块,对于每一个模块而言,即通过遍历commands数组进行,另外,在数组中检查到ngx_null_command时,会停止使用当前模块解析该配置项。每一个ngx_command_t结构体定义了自己感兴趣的一个配置项:其余参考。
2023-01-08 19:40:43
341
原创 定义一个自己的http模板
同理,u_char*类型的uri_start和uri_end也与request_start、method_end的用法相似,唯一不同的是,method_end指向方法名的最后一个字符,而uri_end指向URI结束后的下一个地址,也就是最后一个字符的下一个字符地址(HTTP框架的行为)这是大部分u_char*类型指针对"xxx_start"和"xxx_end"变量的用法。2.ngx_http_finalize_request决定了ngx_http_mytest_handler如何起作用。
2023-01-08 16:26:58
1132
原创 HTTP模块的数据结构
ngx_module_t结构体作为所有模块的通用接口,它只定义了init_master、init_module、init_process、init_thread、ext_thread、exit_process、exit_master这7个回调方法(事实上,init_master、init_thread、exit_thread这3个方法目前都没有使用),它们负责模块的初始化和退出,同时它们的权限也非常高。
2022-12-20 19:25:26
628
原创 Nginx的相关库简介
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的
2022-12-04 14:24:05
1253
原创 开发一个简单的http模板之序章
Nginx模块需要使用C(或者C++)语言编写代码来实现,每个模块都要有自己的名字。 按照Nginx约定俗成的命名规则,我们把第一个HTTP模块命名为ngx_http_mytest_module。由 于第一个模块非常简单,一个C源文件就可以完成为了做到跨平台,Nginx定义、封装了一些基本的数据结构。由于Nginx对内存分配比较“吝啬”(只有保证低内存消耗,才可能实现十万甚至百万级别的同时并发连接数),所以 这些Nginx数据结构天生都是尽可能少占用内存。(看我nginx源码解析即可) config文件其
2022-12-03 11:26:22
1072
原创 Nginx源码解析--configure
是一个关键文件,我们需要看看它的内部结构。一个默认配置下生成的。中的优先级,当一个请求同时符合多个模块的处理规则时。是非常关键的数组,它指明了每个模块在。目录用于存放编译时产生的目标文件。保存了一些宏,这两个头文件会被。configure生成的文。上述目录和文件介绍如下。执行过程中产生的结果。
2022-12-02 22:59:16
1120
原创 nginx源码分析--基数树
1.pool是内存池指针 preallocate:预分配的基数树节点树 如果传递的值为-1,那么将会根据当前操作系统中一个页面的大小来预分配基数树节点。这个函数是这四个函数中最简单的一个,就是根据key值查询,如果找到返回value值,没有找到返回NGX_RADIX_NO_VALUE。ngx_radix_tree_t基数树要求存储的每个节点都必须以32位整型作为区别任意两个节点的唯一标识。决定节点位置的方法很简单,先。数树是不管树的形态是否平衡的,因因此,它插入节点、删除节点的速度要比红黑树快得多。
2022-12-02 11:12:18
470
原创 用HTTP proxy module配置一个简单反向代理服务器
于是,Nginx通常会被配置为既是静态Web服务器也是反向理服务器,不适合Nginx处理的请求就会直接转发到上游服务器中处理。当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游。模后的结果把请求转发到相应的上游服务器中。例如,假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的。器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给。
2022-12-01 22:04:55
721
原创 nginx核心板块来构建静态服务器三
文件操作的优化文件操作的优化sendfile系统调用语法:默认:配置块:http、server、location以启用Linux上的sendfile系统调用来发送文件,它减少了内核态与用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的效率。
2022-12-01 13:43:01
339
原创 ngxin开发一个静态http服务器二
如果在一个时间间 隔(超时时间)内没有读取到客户端发来的字节,则认为超时,并向客户端返回 408("Request timed out")响应。的buffer大小,那么Nginx会自动降低本次请求所使用的内存buffer,以降低内存消耗。是中间值,一般情况下在关闭连接前都会处理连接上的用户发送的数据,除了。生效后,在关闭连接前,会检测是否有用户发送的数据到达服务器,,是为了防止一个目录下的文件数量太多,从而导。有些情况下在业务上认定这之后的数据是不必要的。来打开的方式类型,当该扩展名文件被访问的时候,
2022-12-01 13:09:42
598
原创 Ngxin--源码分析 缓冲区链表
1.基本数据结构1.基本数据结构在处理 TCP/HTTP 请求时会经常创建多个缓冲区来存放数据, Nginx缓冲区块简单地组织一个单向链表buf: 缓冲区指针next 下一个链表节点。
2022-11-27 12:01:11
675
原创 Nginx源码分析--单个缓冲区
而后者是当前数据块链(ngx_chain_t)里的最后一块,之后可能还会有数据需要处理。从ngx_buf_t的定义可以看到,一个有数据的缓冲区不是在内存里,就是在文件里,所以内存标志位成员变量(temporary/memory/mmap)和文件标志成员变量(in_file/temp_file)不能全为0,否则Nginx 会认为这是个特殊( special)或无效的缓冲区。如果缓冲区既不在内存也不在文件里,那么它就不含有有效数据,只起到控制作用,例如刷新(flush)或者同步(sync)
2022-11-27 11:12:53
458
原创 nginx源码分析--双端列表
数据节点本质上与头节点并无区别,所以很多操作代码是相同的数据节点本质上与头节点并无区别,所以很多操作代码是相同的。1.分裂队列 h是头 q是分裂节点的界限 n为分裂完的新节点。当前节点,实际上它只是调整了节点的指针,全是暴力算法 效率比较低 不做过多解释。1.初始化头结点 将两个指针指向自身。2.合并队列 n本身的节点会抛弃。h作为一个哨兵,x成为一个头结点。3返回头结点(哨兵:)
2022-11-26 16:55:40
777
原创 Nginx--单向链表分析
它类似ngx_array_t,是一个简单的数组,也可以“泛型”存储数据,但少了一些成员size: 链表储存元素的大小结点对比 ngx_array_t可以看到,ngx_list_t 的成员size、nalloc和pool的含义是相同的,确定了节点里数组的元信息。可以这么说,。ngx_list_t 的 part成员是链表的头节点(注意不是指针),part.next 指向链表里的第二个节点,而last则指向链表的尾节点。
2022-11-26 11:39:43
590
原创 nginx--源码分析 array(实现动态数组)
数组的内存位置,即数组首地址采用void* 近似使用模板技术,可以通过类型转化实现各种类型 例如 char*等2.
2022-11-25 12:29:53
601
原创 Nginx源码重作--时间 日期
Ngxclock使用一个成员变量m_time来保存时间值,在构造时调用成员函数 now ()获取当前时间,表示计时的起点。
2022-11-23 11:30:25
337
原创 Nginx源码分析 --时间 日期 日志
在Nginx里用来表示时间,成员变量sec和msec分别表示秒数(时间戳)和小数部分的毫秒数。,以分钟为单位,例如北京时区是GMT+8,那么gmtoff就是480=8* 60。
2022-11-23 10:32:58
1617
原创 Nginx源码分析--内存池
NGINX通过ngx_create_pool创建内存池。参数size用来指定从内存池的小块内存区域总共可以获取的内存的最大,同时也是可以申请的单个小块内存的最大size。在函数执行过程中size会转化成16的整数倍。
2022-11-20 12:46:59
1463
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人