自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(392)
  • 收藏
  • 关注

原创 Redis 6.0 源码阅读笔记(14) -- redis 时序图

使用strat uml 画出redis建立连接,响应客户端1.the process to accept a redis client connection2.the process to receive the data of command and handle the command,but not include sending the response to client待画3.the process to repsonse client待画...

2022-05-03 18:47:49 643

转载 linux 进程的pid分配策略——pid位图算法

https://www.bilibili.com/video/BV1aK4y1C7DH?from=search&seid=13205632413617942586

2021-09-23 22:53:24 1191

转载 hive简单介绍

Hive有关介绍Hive是什么使用Hive的好处Hive的特点Hive架构Hive工作原理Hive的适用场景Hive中表的分类Hive与HBase的联系和区别Hive与HBase的联系Hive与HBase的区别Hive是什么(1)由Facebook开源,最初用于解决海量结构化的日志数据统计问题;​(2)构建在Hadoop之上的数据仓库;(3)Hive定义了一种类SQL查询语言:HQL(类似SQL但不完全相同);​(4)通常用于进行离线数据处理(采用MapReduce);​(5

2021-09-12 20:50:46 855

转载 go遍历结构体(struct)字段对应的值,切片(slice),字典(map)

一、遍历结构体字段:eg1:package mainimport ( "fmt" "reflect")type person struct { name string age int}func main() { v := reflect.ValueOf(person{"steve", 30}) count := v.NumField() for i := 0; i < count; i++ { f := v.Fie

2021-08-01 00:49:01 1106

转载 Golang 接口切片存储多层嵌套Map对象,如何初始化,又如何直接读取嵌套层的key-value值

package mainimport (“fmt”“reflect”)func main() {//定义一个接口类型的切片in := make([]interface{}, 3)m1 := make(map[string]string)m2 := make(map[string][]byte)//初始化键值对m1 = map[string]string{“teleplay1”: “情定大饭店”,“teleplay2”: “天国的阶梯”,“teleplay3”: “爱在哈佛”

2021-08-01 00:45:26 1048

原创 go语言json嵌套数组结构体用法

文章目录前言1. RDB 文件持久化的优缺点2. RDB 的触发方式2.1 save 命令触发2.2 bgsave 命令触发2.3 定时任务触发2.4 主从同步全量复制触发3. RDB 的处理流程3.1 RDB 文件传输3.2 socket 无盘传输4. RDB 涉及的技术原理4.1 写时复制 Copy On Write4.2 diskless 无盘传输的管道读写前言Redis 是基于内存的 KV 数据库,使用时所有数据都在内存中,这就是它存取性能高的重要原因之一。但是如我们所

2021-08-01 00:41:47 1227

原创 Nginx源码分析 - 核心模块初始化顺序,根据ctx创建上下文

1. 在ngx_cycle_t * ngx_init_cycle(ngx_cycle_t *old_cycle)函数中,取出核心模块,然后创建上下文2. 使用GDB打印断点查看内容

2021-06-10 22:39:37 204

原创 Nginx源码分析 - 模块的赋值及编号 --- 方便了解nginx模块

使用gdb跟踪在编译完成后,根据makfie的配置就生成了下面两种在main函数中完成了对模块的编号上图中的成员赋值,在下面gdb打印出的值是一致的,还可以打印共有多少个模块及模块的最大值...

2021-06-10 22:08:42 115

转载 拆解 Linux 网络包发送过程

在开始今天的文章之前,我先来请大家思考几个小问题。问1:我们在查看内核发送数据消耗的 CPU 时,是应该看 sy 还是 si ? 问2:为什么你服务器上的 /proc/softirqs 里 NET_RX 要比 NET_TX 大的多的多? 问3:发送网络数据的时候都涉及到哪些内存拷贝操作?这些问题虽然在线上经常看到,但我们似乎很少去深究。如果真的能透彻地把这些问题理解到位,我们对性能的掌控能力将会变得更强。带着这三个问题,我们开始今天对 Linux 内核网络发送过程的深度剖析。还是按照我们之前的

2021-06-08 07:24:20 431

转载 Redis 持久化 RDB 详解

文章目录前言1. RDB 文件持久化的优缺点2. RDB 的触发方式2.1 save 命令触发2.2 bgsave 命令触发2.3 定时任务触发2.4 主从同步全量复制触发3. RDB 的处理流程3.1 RDB 文件传输3.2 socket 无盘传输4. RDB 涉及的技术原理4.1 写时复制 Copy On Write4.2 diskless 无盘传输的管道读写前言Redis 是基于内存的 KV 数据库,使用时所有数据都在内存中,这就是它存取性能高的重要原因之一。但是如我们所

2021-05-31 22:53:15 243

原创 Nginx惊群问题分析及解决

1. 惊群效应1.1 简介惊群问题又名惊群效应。简单来说就是多个进程或者线程在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒。唤醒后通常只有一个进程获得了该事件并进行处理,其他进程发现获取事件失败后又继续进入了等待状态,在一定程度上降低了系统性能。打个比方就是:当你往一群鸽子中间扔一块食物,虽然最终只有一个鸽子抢到食物,但所有鸽子都会被惊动来争夺,没有抢到食物的鸽子只好回去继续睡觉, 等待下一块食物到来。这样,每扔一块食物,都会惊动所有的鸽子,即为惊群。简单地说:就是扔一块食物,

2021-05-29 00:06:19 1438

原创 Redis 6.0 源码阅读笔记(5) -- List 数据类型源码分析

使用GDB跟踪Redis源码list push过程127.0.0.1:6379> LPUSH runoobkey redisrunoobkey keyredis value当你push多个时:127.0.0.1:6379> LPUSH runoobkey redis2 redis3存储的结构redis 对于 List 的存储共有 3 种存储形式,其中 OBJ_ENCODING_LINKEDLIST已经彻底废弃不再讨论,其它两种存储形式的内

2021-05-19 23:25:39 225

转载 Nginx源码分析 - 实战篇 - 编写一个阶段化的模块(25)

目录一、代码实例二、初始化绑定阶段处理三、回调函数写日志四、编译调试结果一、代码实例HTTP模块篇,我们讲过Nginx的HTTP阶段处理 《Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler》我们代码在《Nginx源码分析 - 实战篇 - 编写一个自定义的模块》的基础上,将定义一个回调函数挂载到HTTP处理的阶段上。#include <ngx_config.h>#include <ngx_core.h>#i

2021-05-13 12:26:42 180

转载 Nginx源码分析 - 实战篇 - 编写一个自定义的模块(24)

目录一、创建扩展模块目录二、创建config文件三、创建ngx_http_hello_module.c文件四、修改Nginx.conf文件五、编译Nginx源码六、浏览器访问从前面的篇章中,我们基本了解了Nginx的运行原理。Nginx整个框架都是通过模块的方式,对整个系统进行解耦和扩展。在HTTP的http/modules/目录下,有非常多的关于HTTP协议的模块,每个模块都有不同的功能。接下去我们就需要创建一个自定义的模块。一、创建扩展模块目录我们在nginx-1

2021-05-13 12:26:28 368

转载 Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)

目录一、HTTP模块11个阶段处理二、阶段处理的初始化ngx_http_block三、阶段处理过程ngx_http_core_run_phases四、挂载自定义模块上一章我们讲解了HTTP request的解析过程。我们基本知道了Nginx是如何解析HTTP的行和头。这一章我们主要讲解Nginx的阶段处理(PHASE 状态机实现)。阶段处理的概念如何理解,我举个例子:一个HTTP请求过来,除了解析HTTP的行和头外,还需要解析URI的rewrite、接受HTTP BODY中的POST

2021-05-13 12:25:44 179

转载 Nginx源码分析 - HTTP模块篇 - HTTP Request解析过程(22)

目录一、HTTP Request解析流程图二、源码分析1. 等待read事件ngx_http_wait_request_handler2. 处理头部请求行ngx_http_process_request_line3. 处理HTTP协议的header部分ngx_http_process_request_headers4. 处理request信息ngx_http_process_request5. 核心分发函数ngx_http_handler上一章我们讲解了整个Nginx的tcp

2021-05-13 12:25:10 672

转载 Nginx源码分析 - HTTP模块篇 - TCP连接建立过程(21)

目录一、监听套接字初始化函数ngx_http_optimize_servers二、Nginx整个连接的过程上一章,我们讲解了HTTP模块是如何初始化的。这一章节,主要讲解监听套接字初始化函数ngx_http_optimize_servers和Nginx整个连接的过程一、监听套接字初始化函数ngx_http_optimize_serversngx_http_optimize_servers主要处理Nginx服务的监听套接字/** * ngx_http_optimize_servers

2021-05-13 12:24:54 142

转载 Nginx源码分析 - HTTP模块篇 - HTTP模块的初始化(20)

目录一、http模块的配置二、HTTP核心模块的数据结构三、ngx_http_block函数详解前面几章整理了Nginx的事件模块,这一章开始整理HTTP模块。HTTP模块的初始化工作,都在src/http/nginx_http.c 中的ngx_http_block函数中进行的。一、http模块的配置在看nginx_http_block之前,我们还必须看一下nginx.conf中 HTTP大模块的配置文件,只有理解了HTTP模块的配置,才能更好的理解HTTP模块如何初始化的。配

2021-05-12 23:07:42 285

转载 Nginx源码分析 - Event事件篇 - Epoll事件模块(19)

目录一、Epoll模块的数据结构1. epoll模块命令集 ngx_epoll_commands2. epoll模块上下文 ngx_epoll_module_ctx3. epoll模块配置 ngx_epoll_module二、Epoll模块的初始化1. 配置文件初始化ngx_events_block2. 模块初始化ngx_event_process_init三、核心函数1. ngx_epoll_process_events实现了收集、分发事件接口这一篇主要讲解一下..

2021-05-12 23:05:58 484

转载 Nginx源码分析 - Event事件篇 - Event模块的进程初始化(18)

目录一、源码分析1. Event核心模块ngx_event_core_module2. Event模块初始化ngx_worker_process_init3. 初始化核心函数ngx_event_process_init二、TCP连接和读取事件逻辑1. ngx_event_process_init 初始化事件循环2.ngx_http_init_connection 初始化http连接,读取read事件数据3. ls->handler的回调函数是如何赋值的前面一篇我..

2021-05-12 23:02:15 266

转载 Nginx源码分析 - Event事件篇 - Nginx的Event事件模块概览(17)

目录一、event模块的概览二、重要数据结构1. ngx_listening_s 侦听结构2. ngx_connection_s socket连接对象结构3. ngx_event_s 事件数据结构前一章,我们讲解了《Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理 》中实际上已经涉及到了一部分事件模块的概念。细心的可以发现,Nginx的事件都是由nginx_event.c文件中的ngx_process_events_and_timers进程事件分发器这个函数开..

2021-05-12 22:59:08 638

原创 Nginx源码分析 - Event事件篇 - Event模块和配置的初始化(16)

目录一、Event模块的数据结构1. event事件模块的配置2. ngx_events_module 事件模块3. ngx_event_core_module 事件核心模块4. ngx_event_conf_t 事件conf结构二、Event模块结构图三、Event模块的初始化1. ngx_event_module_init 模块初始化函数四、Event模块配置的初始化1. ngx_events_module 模块配置初始化2. ngx_conf_parse 解

2021-05-12 22:57:24 405

转载 Nginx源码分析 - 主流程篇 - 多进程的惊群和进程负载均衡处理(15)

目录Nginx解决惊群和进程负载均衡处理的要点具体的实现1. ngx_process_events_and_timers 进程事件分发器2. ngx_trylock_accept_mutex 获取accept锁3. ngx_enable_accept_events 和 ngx_disable_accept_events4. ngx_event_process_posted 事件队列处理5. ngx_process_events 事件的核心处理函数Linux2.6版本之前还存在

2021-05-12 22:54:01 174

原创 Nginx源码分析 - 主流程篇 - 多进程实现(14)

目录一、Nginx多进程实现的流程图二、Nginx多进程具体实现1. ngx_master_process_cycle 进入多进程模式2. ngx_start_worker_processes 创建工作进程3. ngx_spawn_process fork工作进程4. ngx_worker_process_cycle 子进程的回调函数5. ngx_worker_process_init 工作进程初始化默认情况下,Nginx都是多进程的运行模式。Nginx和Memcached不

2021-05-12 22:51:44 324

转载 Nginx源码分析 - 主流程篇 - 解析配置文件(13)

目录一、Nginx的配置文件nginx.conf二、数据结构逻辑关系图三、相关数据结构1. ngx_cycle_s的conf_ctx和modules2. ngx_module_s的index和commands3. ngx_command_s 命令集的结构四、核心模块的定义1. 核心模块在nginx.c的文件头部2. 核心模块的配置结构ngx_core_conf_t五、具体解析流程1. 创建核心模块配置文件数据结构ngx_core_conf_t2. 创建一个临时

2021-05-12 22:49:30 694

转载 Nginx源码分析 - 主流程篇 - 模块的初始化(12)

目录一、模块的数据结构1. ngx_module_s 模块结构2. ngx_core_module 核心模块二、模块的初始化1. 模块编号处理ngx_preinit_modules2. 初始化cycle->modules 分配内存3. 每个模块进行初始化ngx_init_modules4. 统计有多少个模块ngx_count_modules5. 模块的工作进程初始化init_processNginx是高度模块化的,各个功能都会封装在模块中。例如core模块、HT

2021-05-12 22:43:52 256

原创 Nginx源码分析 - 主流程篇 - 全局变量cycle初始化(11)

目录一、数据结构1. ngx_cycle_t的数据结构2. ngx_core_conf_t的数据结构二、初始化过程1. 创建一个内存池。2. 拷贝配置文件的路径前缀(/usr/local/nginx)3. Nginx的路径前缀拷贝4. 拷贝配置文件信息5. 拷贝配置参数信息6. 路径信息初始化7. 初始化打开的文件句柄8. 初始化shared_memory链表9. 初始化listening数组10. 模块创建和核心配置结构初始化ngx_core_con

2021-05-12 22:39:33 347

原创 Nginx源码分析 - 主流程篇 - 平滑重启和信号控制(10)

目录一、平滑重启二、信号处理一、平滑重启上一篇文章我们分析了Nginx的启动流程。其中ngx_add_inherited_sockets主要用于继承Socket文件句柄。Nginx有平滑重启的功能,通过平滑重启,可以让用户无感知并且不中断。#平滑重启 sudo kill -HUP `cat /usr/local/nginx-1.4.7/nginx.pid` Nginx支持热切换,为了保证切换之后的套接...

2021-05-11 23:26:35 313

转载 Nginx源码分析 - 主流程篇 - Nginx的启动流程(09)

目录一、Nginx的启动过程二、重要流程分析1. ngx_get_options 解析外部参数2. init_cycle 初始化全局变量3. 变量保存方法ngx_save_argv和ngx_process_options4. 给模块打标ngx_preinit_modules5. 创建PID文件ngx_create_pidfile前几篇主要介绍了Nginx比较常用的一些基础数据结构,例如pool,buf,array,list等。通过对Nginx基础数据结构的理解,能更好的帮助我

2021-05-11 23:23:03 302

原创 Nginx源码分析 - 基础数据结构篇 - 字符串结构 ngx_string.c(08)

目录一、数据结构定义1. ngx_str_t 字符串结构2. ngx_keyval_t 字符串K V结构一、数据结构图三、具体函数实现1. 初始化一个字符串 ngx_string2. 设置字符串Nginx的ngx_str_t字符串结构非常简单和好用。nxg_string.c文件中包含了很多常用的字符串操作方法,具体我们就不讲解了,主要简单来看下Nginx的字符串数据结构一、数据结构定义1. ngx_str_t 字符串结构/** * 字符串结构 */typ.

2021-05-11 23:18:49 484

转载 Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)

目录一、数据结构定义1. ngx_hash_elt_t hash表的元素结构2.ngx_hash_t hash表结构3. ngx_hash_init_t hash表初始化结构二、数据结构图三、具体函数实现1. 查找一个元素 ngx_hash_find2. 创建一个hash表 ngx_hash_initNginx的hash表结构和我们之前阅读memcached的时候看到的会有很大的差别。笔者在阅读Nginx的hash模块的时候,阅读了好几天,比较不容易理解,但是Nginx.

2021-05-11 23:16:58 218

转载 Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)

目录一、数据结构定义1. ngx_list_part_t 链表节点定义2. ngx_list_t 链表结构二、数据结构图三、具体函数实现1. 创建一个list ngx_list_create2. 使用一个list元素 ngx_list_pushNginx的list单向链表的结构和Nginx的数组结构Array有点类似,总体来说,数据结构也是非常简单清晰的。Nginx的单向链表也是固定了每个元素的大小,并且用单向链表的方式连接。一、数据结构定义1. ngx_list_

2021-05-11 23:14:15 127

转载 Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c(05)

目录一、数据结构定义二、数据结构图三、具体函数实现1. 链表常用操作方法2. 获取链表的主体结构 ngx_queue_dataNginx的链表结构非常小巧和简单。设计的非常精巧。通过链表的简单和精巧的设计,让Nginx的链表的数据结构和具体业务依赖进行了解耦。一般我们在设计c语言程序的时候,完全可以学习Nginx的这种数据结构的设计方式。一、数据结构定义链表数据结构 ngx_queue_ttypedef struct ngx_queue_s ngx_queue_t;

2021-05-11 23:12:29 120

转载 Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c(04)

目录一、数据结构定义1. 缓冲区内存块的数据结构 ngx_buf_t2. 缓冲区链表结构 ngx_chain_t二、数据结构图三、具体函数实现1. 创建一个缓冲区buf ngx_create_temp_buf2. 创建一个缓冲区的链表结构 ngx_alloc_chain_link3. 批量创建多个缓冲区buf ngx_create_chain_of_bufs4. 拷贝缓冲区链表 ngx_chain_add_copy5. 获取一个空闲的buf链表结构 ngx_chain

2021-05-11 23:10:35 434

转载 Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c(03)

前面一章我们介绍了Nginx的内存池的数据结构。Nginx的内存管理都是围绕内存池来实现的,包括array数组类型也是基于Nginx的pool来实现数据结构。Nginx的Array结构设计得非常小巧,主要用于存储小块内存。Nginx的数组每个元素的大小是固定的。一、数据结构定义ngx_array_t 数组的基础数据结构/* 数组Array数据结构 */typedef struct { void *elts; /* 指向数组第一个元素指针*/ ngx_uin

2021-05-11 23:06:38 177

转载 Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c(02)

Nginx的内存管理是通过内存池来实现的。Nginx的内存池的设计非常的精巧,很多场景下,我们可以将Nginx的内存池实现抽象出来改造成我们开发中的内存池。一、内存池一般我们使用malloc/alloc/free等函数来分配和释放内存。但是直接使用这些函数会有一些弊端:虽然系统自带的ptmalloc内存分配管理器,也有自己的内存优化管理方案(申请内存块以及将内存交还给系统都有自己的优化方案,具体可以研究一下ptmalloc的源码),但是直接使用malloc/alloc/free,仍然会导致内存分配

2021-05-11 23:03:40 147

转载 Nginx源码分析 - 初探Nginx的架构(01)

Nginx是我们日常使用非常多的一款服务器。Nginx的源码写的非常漂亮,是c语言学习和进阶的最好的学习资料。我们这里分析的是1.13.1的版本。一、源码目录下面我们先看下Nginx的目录结构:Nginx的源码主要分布在src/目录下,而src/目录下主要包含三部分比较重要的模块。core:包含了Nginx的最基础的库和框架。包括了内存池、链表、hashmap、String等常用的数据结构。event:事件模块。Nginx自己实现了事件模型。而我们所熟悉的Memcached是使用了

2021-05-11 22:52:46 528

转载 Redis 6.0 源码阅读笔记(13 ) -- Redis 集群节点选举流程

1. 集群选举的处理在 RedisCluster 集群实现原理 中提到过从节点通过选举晋升为主节点的过程,其处理大致如下:Slave 节点在每个周期任务中都会检查 Master 节点是否 FAIL,如是则尝试进行 Failover,以期成为新的 Master。不过在此之前需要过滤可用的 Slave 节点,具体做法就是检查每个 Slave 节点与 Master 节点断开连接的时间,如果超过了cluster-node-timeout * cluster-slave-validity-factor,那这个S

2021-05-09 20:01:21 534

转载 Redis 6.0 源码阅读笔记(12) -- Redis 集群建立流程

1. Redis 集群在 RedisCluster 集群实现原理 中已经介绍过 Redis 3.0 版本以后使用 RedisCluster 作为分布式解决方案,其整个集群网络的建立依赖 Gossip 协议。以下为 Redis 集群建立的示意图,其大致处理流程为以下几个步骤:节点A 邀请 节点B 加入集群,节点A 与 节点B 建立连接节点A 邀请 节点C 加入集群,节点A 与 节点C 建立连接。二者通信时节点 A 将 节点B 的IP地址、端口号等信息发送给 节点C,节点C 保存并使用该信息去连接 节点

2021-05-09 19:52:08 281

转载 Redis 6.0 源码阅读笔记(11) -- 主从复制 Slave 节点流程分析

1. 主从复制中 Slave 节点的处理Slave 节点主从复制的处理从建立从属关系开始,以下为大致的处理步骤:Slave 节点接收 slaveof 、replicaof 命令,进行从属关系的处理根据命令参数处理命令,因为也有可能是移除从属关系的操作如果是建立从属关系的命令,经过初步校验,保存下主节点的相关信息,并将当前节点的同步状态设置为 REPL_STATE_CONNECT定时任务检查到当前节点的同步状态为 REPL_STATE_CONNECT,则需要与主节点建立连接,连接成功后开始进行数据

2021-05-09 19:45:14 620

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除