- 博客(135)
- 收藏
- 关注
原创 docker网络相关内容详解
Docker 角色负责容器化(镜像构建、运行时隔离),是 K8s 的运行时基础(通过 CRI 接口与 K8s 集成,提供容器运行能力)。K8s 角色负责集群级编排(部署、伸缩、治理),构建云原生应用的运行时平台,通过声明式配置(YAML)和自动化控制器(如 Deployment),实现弹性、高可用、可扩展的应用部署。典型流水线。
2025-05-29 22:15:25
1059
原创 docker镜像与dockerfile
容器解决应用开发、测试和部署的问题,而镜像解决应用部署环境问题。镜像是一个只读的容器模板, 打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件,是启动容器的基础。镜像所打 包的文件内容就是容器的系统运行环境——rootfs(根文件系统或根目录)。容器与镜像类似对象与类的关系。ONBUILD ADD ./helloworld /go/src/helloworld/ # 下游构建时触发# 构建基础镜像。
2025-05-28 15:45:27
1195
原创 docker环境搭建与常用指令
根据官方的定义,Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为 开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。。
2025-05-27 19:08:54
1224
原创 消息队列kafka的基础概念和部署
消息队列(Message Queue,简称 MQ)本质是一个 FIFO(先入先出)的队列,存储单元为 “消息”,主要用于不同服务、进程、线程间的通信。
2025-05-25 18:14:23
799
原创 grpc搭建、原理以及使用案例
RPC 即远程过程调用协议(Remote Procedure Call Protocol),可以让我们像调用本地对象一样发起 远程调用。RPC 凭借其强大的治理功能,成为解决分布式系统通信问题的一大利器。gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用 PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2+PB 保证了的高性能。2. gRPC 核心特性2.1 基于服务的架构。
2025-05-22 17:50:07
1170
原创 计算机网络相关面试题
HTTP/1(主要指 HTTP/1.1)和 HTTP/2 是 Web 协议发展中的两个重要版本,二者在性能、协议机制和功能特性上有显著差异。资源按请求顺序处理,无法指定优先级(如先加载 CSS 再加载图片)。当发送方发现数据未被正确确认时,会触发重传。客户端需主动发起所有资源请求,服务器无法主动推送资源。一、HTTP1.1和HTTP2的区别。一、HTTP1.1和HTTP2的区别。在 HTTP/1.1 中,浏览器需。二、 TCP的重传机制。
2025-05-21 17:37:47
910
原创 protobuf原理和使用
类型Protobuf 类型编码方式适用场景VarintsBase128 变长小整数、非负数、枚举值Zigzag有符号整数(尤其是负数)固定 324 字节定长大整数(>28bit)、浮点数固定 648 字节定长极大整数(>56bit)、双精度浮点数长度分隔变长字符串、二进制数据、嵌套消息语法版本:proto3 语法需在文件首行声明,否则默认使用 proto2。示例语法// 必须以0开头(默认值)WEB = 1;IMAGES = 2;// 使用枚举字段注意。
2025-05-20 19:13:15
809
原创 spdlog高性能日志库
/ 定义格式模板(包含时间、级别、文件名、行号)// 输出示例:[2025-05-20 14:30:00] [info] [main.cpp:42] Hello, spdlog!// 扩展格式标识(如源文件路径)// %P 表示源文件完整路径// 实现自定义 Sink(继承 spdlog::sink)public:// 解析日志消息(msg.payload() 为格式化后的字符串)// 发送到网络服务器的逻辑void flush() override { /* 可选:刷新缓冲区 */ }
2025-05-20 17:38:12
626
原创 nginx模块使用、过滤器模块以及handler模块
作用:包含 Nginx 核心库和 HTTP 模块开发所需的头文件。:Nginx 编译相关的配置宏。ngx_core.h:Nginx 核心数据结构(如ngx_str_tngx_pool_t)和函数(如内存分配)。ngx_http.h:HTTP 模块开发的核心头文件(如、过滤器相关类型)。ngx_string("add_prefix"), // 配置指令名(在 nginx.conf 中使用)
2025-05-18 21:36:19
699
原创 nginx内存池以及使用
(内存池核心结构)(内存池块数据)(大块内存管理)(自定义清理机制)(创建内存池)/(内存分配)(新建内存池块)(销毁内存池)(重置内存池)2.ngx_pool.c3.main.c0voice · GitHub
2025-05-18 13:43:37
652
1
原创 nginx概念及使用
适合需要定制模块(如# 安装依赖# 或 sudo yum install gcc make pcre-devel zlib-devel openssl-devel -y (CentOS)# 下载源码(以1.24.0版本为例)# 配置编译参数(启用SSL、gzip等模块)--prefix=/usr/local/nginx \ # 安装路径--with-http_ssl_module \ # 启用HTTPS支持。
2025-05-18 11:47:06
1735
原创 gdb调试
命令名称命令缩写命令说明runr运行一个程序continuec让暂停的程序继续运行nextn运行到下一行steps如果有调用函数,进入调用的函数内部(相当于step intountilu运行到指定行停下来finishfi结束当前调用函数,到上一层函数调用处returnreturn结束当前调用函数并返回指定值,到上一层函数调用处jumpj将当前程序执行流跳转到指定行或地址printp打印变量或寄存器值backtracebt查看当前线程的调用堆栈。
2025-05-17 13:27:42
1240
原创 MySQL的缓存策略
由于 mysql 的缓冲层(buffer pool)不由用户来控制,也就是不能由用户来控制缓存具体数据;访问磁盘的速度比较慢,尽量获取数据从内存中获取;主要解决读的性能;因为写没必要优化,必须让数据正确的落盘;如果写性能出现问题,那么请使用横向扩展集群方式来解决;项目中需要存储的数据应该远大于内存的容量,同时需要进行数据统计分析,所以数据存储获取的依据应该是关系型数据库;缓存数据库可以存储用户自定义的热点数据;以下的讨论都是基于热点数据的同步问题。
2025-05-16 21:44:10
1182
原创 Linux运行时的参数、命令、网络、磁盘参数和日志监控
场景推荐工具核心指标 / 参数磁盘 I/O 性能分析iostat -xawaitsvctm%utilavgqu-sz交换分区状态查询swapon -s已用空间(Used)、分区路径磁盘空间占用统计df -hdu -h挂载点、目录大小、使用率(Use%)目录层级大小分析子目录大小、总和七、网络IO性能监控一、网络性能核心指标1. 带宽(Bandwidth)定义:链路的最大理论传输速率(物理极限),单位为b/s(比特 / 秒)。例:100M 带宽表示每秒最多传输 100×10^6 比特。
2025-05-16 12:27:20
1020
原创 Makefile与CMake
避免 Make 将目标视为同名文件,强制执行命令。三、Makefile和CMake的具体案例。与 Makefile 案例完全相同。二、CMake 核心内容。
2025-05-15 19:41:54
1062
原创 Mysql事务和原理
日志类型核心作用记录内容保证特性典型场景undo log事务回滚、MVCC数据修改前的旧版本原子性事务回滚、非锁定读(MVCC)redo log崩溃后恢复数据数据页的物理修改操作持久性系统崩溃后恢复未刷盘的修改二、 并发读异常数据库并发读异常主要包括脏读、不可重复读、幻读,本质是多事务并发时,一个事务的写操作影响了另一个事务的读结果。异常类型核心特征影响的事务操作数据状态(被读)脏读读取未提交的 “脏数据”写(未提交)→ 读未提交(可能回滚)不可重复读。
2025-05-15 15:56:48
994
原创 function/bind和异常处理
尽管标准异常类覆盖了常见错误场景,但实际开发中可能需要自定义异常类(如业务特定的错误)。自定义异常类通常继承自,并重写what()方法以提供具体错误描述。// 自定义异常类:余额不足private:string msg;// 错误信息public:// 构造函数:接收账户ID和当前余额msg = "账户 " + account_id + " 余额不足(当前余额:" + to_string(balance) + ")";// 重写 what() 方法,返回错误信息// 银行账户类。
2025-05-15 12:57:52
664
原创 匿名函数lambda、STL与正则表达式
捕获方式行为说明适用场景隐式值捕获[=]编译器自动值捕获所有被使用的外部变量(创建时拷贝,后续外部修改不影响内部)需要隔离外部变量修改,或变量拷贝成本低(如基本类型)隐式引用捕获[&]编译器自动引用捕获所有被使用的外部变量(与外部共享内存,外部修改直接影响内部)需要实时同步外部变量的修改,或变量拷贝成本高(如大对象)混合捕获[=, &a]部分变量值捕获,部分变量引用捕获(平衡隔离性与实时性)需要对个别变量特殊处理(如大对象引用捕获,小对象值捕获)特性传统捕获(C++11)
2025-05-14 19:58:50
1115
原创 右值引用和移动语义
左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。int a = 6;a可以通过 & 取地址,位于等号左边,所以a是左值。6位于等号右边,6没法通过 & 取地址,所以6是个右值struct A {a_ = a;int a_;A a = A();同样的,a可以通过 & 取地址,位于等号左边,所以a是左值。A()是个临时值,没法通过 & 取地址,位于等号右边,所以A()是个右值。可见左右值的概念很清晰,有地址的变量就是左值,没有地址的字面值、临时值就是右值。
2025-05-14 19:02:31
881
原创 C++新特性1:智能指针
一、智能指针智能指针主要解决以下问题:1. 内存泄漏:内存手动释放,使用智能指针可以自动释放 malloc free;new delete2. 共享所有权指针的传播和释放,比如多线程使用同一个对象时析构问题C++里面的四个智能指针: auto_ptr 第一个已经被C++11弃用。shared_ptr,unique_ptr, weak_ptr 其中后三个是C++11支持,并且 几个指针的特点:unique_ptr独占对象的所有权,由于没有引用计数,因此性能较好。
2025-05-14 10:40:48
812
原创 SQL语句,索引,视图,存储过程以及触发器
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。其内容由查询定义。基表:用来创建视图的表叫做基表;通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成;语句核心作用典型场景IF基础条件判断成绩等级、状态分类CASE多条件分支(更清晰)枚举值映射(如部门 ID 转名称)WHILE先判断条件,再执行循环已知循环次数或条件LEAVE提前终止整个循环满足特定条件时退出(如累加≥100)ITERATE跳过当前循环,继续下一次。
2025-05-13 16:04:03
1065
原创 进程相关面试题20道
优先级反转(Priority Inversion)高优先级任务被低优先级任务间接阻塞,且阻塞时间可能被中间优先级任务延长,导致高优先级任务的执行延迟远超预期。低优先级任务持有高优先级任务需要的共享资源(如互斥锁),而中间优先级任务抢占了低优先级任务的执行,导致低优先级任务无法及时释放资源,进而阻塞高优先级任务。
2025-05-12 17:14:55
877
原创 常用设计模式
一、什么是设计模式一、什么是设计模式设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的代码设计经验总结,旨在解决面向对象设计中反复出现的问题,提升代码的可重用性、可理解性和可靠性。
2025-05-11 22:18:25
1202
原创 redis主从同步于对象模型
一、redis持久化一、redis持久化redis的数据全部在内存中,如果突然宕机,数据就会全部丢失,因此需要持久化来保证Redis的 数据不会因为故障而丢失,redis重启的时候可以重新加载持久化文件来恢复数据;默认配置下,只开启rdb持久化;二、aofappendonlyfileaof日志存储的是Redis服务器的顺序指令序列,aof日志只记录对内存修改的指令记录;
2025-05-11 18:29:40
1052
原创 redis存储结构
Redis 中的哈希表(Hashtable)使用两个底层数组ht[0]和ht[1],正常情况下数据存储在ht[0]中。当ht[0]中的元素数量过多(达到扩容阈值,如负载因子超过 1),直接一次性将所有元素迁移到更大的ht[1]阻塞主线程:迁移大量数据需要大量计算,可能导致 Redis 长时间无法处理其他命令(如读写请求),影响响应速度。内存峰值:一次性创建新表并迁移数据,可能导致短期内内存占用激增。为解决上述问题,Redis 采用渐进式 Rehash。
2025-05-11 17:08:29
1563
原创 redis协议与异步方式
一、redis pipeline一、redis pipeline是一个客户端提供的机制,而不是服务端提供的;注意:pipeline不具备事务性;目的:节约网络传输时间;通过一次发送多次请求命令,从而减少网络传输的时间。二、redis事务事务:用户定义一系列数据库操作,这些操作视为一个完整的,要么全部执行,要么全部不执行,是不可分割的工作单元。MULTI 开启事务,事务执行过程中,单个命令是入队列操作,直到调用EXEC才会一起执行;
2025-05-11 16:28:53
1214
原创 Linux 内存映射机制:正向映射与反向映射深度解析
在 Linux 系统里,针对匿名映射的管理,需要一种机制来明确一个物理页page在不同进程的中的具体虚拟地址位置。这主要依靠反向映射机制,结合anon_vma和的信息达成。
2025-04-08 16:55:54
684
原创 Linux 虚拟内存访问流程:缺页异常处理与页表映射机制详解
从磁盘读取相应的数据,为其分配一个新的 vm_area_struct 来描述该虚拟内存区域,同时更新 address_space 结构体,将新读取的数据对应的 page 结构体添加到 address_space 的 xarray 中。这通常是通过 anon_vma 结构来管理的,它维护了匿名页的反向映射关系。通过逐层解析虚拟地址对应的页目录结构,找到最后一级页表项(PTE)的位置,将新分配或读取的物理页帧号(pfn)与相应的标志位组合后填充到该 PTE 中,从而建立起虚拟地址到物理地址的映射关系。
2025-04-08 01:24:35
1180
原创 Linux内核页回收机制与反向映射
当我们申请分配页的时候,页分配器首先尝试使用低水线分配页。如果使用低水线分配失败,说明内存轻微不足,页分配器将会唤醒内存节点的页回收内核线程,异步回收页,然后尝试使用最低水线分配页。如果使用最低水线分配失败,说明内存严重不足,页分配器会直接回收。 针对不同的物理页,采用不同的回收策略:交换支持的页和存储设备支持的文件页。 那我们根据什么的原则选择回收物理页呢? Linux 内核使用 LRU(Least Recently Used,最近最少使用)算法选择最近最少使用
2025-04-08 00:36:53
940
原创 Linux内核页表缓存(TLB)与巨型页
一、页表缓存(TLB)一、页表缓存(TLB)处理器厂商在内存管理单元 (MMU) 里增加一个 TLB (Translation Lookaside Buffer) 的高速缓存,TLB 直译为转译后备缓冲器,也被翻译为页表缓存。TLB 为 CPU 的一种缓存,由存储器管理单元用于改进虚拟地址到物理地址的转译速度。TLB 用于缓存一部分标签页表条目。TLB 可介于 CPU 和 CPU 缓存之间,或在 CPU 缓存和主存之间,这取决于缓存使用的是物理寻址或是虚拟寻址。1.TLB表项格式。
2025-04-06 22:42:28
1348
2
原创 不连续页分配器以及页表
一、不连续页分配器一、不连续页分配器1.系统接口vmallocvmapkmallocvmallocvmallocvfreekfreecallocreallocbrk/sbrkvmallocvmallocHIGHMEM2.内核源码数据结构vmap_areavmap_areavm_struct以下是vmallocvmalloc当调用内核通过 vmap_area管理器(全局红黑树)找到一个大小合适的。创建一个新的 struct vmap_area,记录该区域的起始和结束虚拟地址(va_start和。
2025-04-06 19:27:24
614
原创 Linux内核slab分配器
一、slab思想以及编程接口一、slab思想以及编程接口1、slab 核心思想为每种对象类型创建一个内存缓存,每个内存缓存由多个大块组成,一个大块是一个或多个连续的物理页,每个大块包含多个对象。slab 采用面向对象的思想,基于对象类型管理内存,每种对象被划分为一个类,比如进程描述符(task_struct)是一个类,每个进程描述符实现是一个对象。内存缓存组成结构如下:2.编程接口分配内存: void *kmalloc (size_t size,gfp_t flags);
2025-04-05 17:21:15
1194
原创 Linux内核伙伴分配器
当系统内核初始化完毕后,使用页分配器管理物理页,当使用的页分配器是伙伴分配器,伙伴分配器的特点是算法简单且高效。连续的物理页称为页块(page block)。阶(order)是伙伴分配器的专业术语,是页的数量单位,2的n次方个连续页称为n阶页块。满足以下条件的两个n阶页块称为伙伴(buddy --> 英 [ˈbʌdi]):1.两个页块相邻,物理地址连续;2.页块第一页的物理页号是2n的整数倍;3.若合并成(n+1)阶页块,第一页的物理页号需是2n+1的整数倍。
2025-04-05 15:33:46
1422
原创 Linux内核引导内存分配器原理
一、bootmem分配器一、bootmem分配器在内核初始化的过程中需要分配内存,内核提供临时的引导内存分配器,在页分配器和块分配器初始化完成之后,把空闲的物理页交给页分配器管理,丢弃引导内存分配器。bootmem 分配器定义的数据结构,内核源码如下:每个内存节点后一个bootmem_data实例:bootmem分配器的算法:a. 只把低端内存添加到 bootmem 分配器,低端内存是可以直接映射到内核虚拟地址空间的物理内存;
2025-04-05 14:23:12
753
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人