自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Cmake 使用教程

CMake是一个开源、跨平台的构建系统,主要用于软件的构建、测试和打包。CMake 使用平台无关的配置文件来控制软件的编译过程,并生成适用于不同编译器环境的项目文件。例如,它可以生成 Unix系统的MakefileWindows下 的 Visual Studio项目文件或Mac的Xcode工程文件,从而简化了跨平台和交叉编译的工作流程。CMake并不直接构建软件,而是产生标准的构建文件,然后使用这些文件在各自的构建环境中构建软件。CMake有以下几个特点:

2025-05-21 20:06:14 865

原创 RabbitMq C++客户端的使用

AMQP-CPP是用于与RabbitMq消息中间件通信的c++库。它能解析从RabbitMq 服务发送来的数据,也可以生成发向 RabbitMq的数据包。AMQP-CPP库不会向 RabbitMq 建立网络连接,所有的网络io由用户完成。当然,AMQP-CPP 提供了可选的网络层接口,它预定义了TCP模块,用户就不用自己实现网络 io,我们也可以选择libeventlibevlibuvasio等异步通信组件,需要手动安装对应的组件。AMQP-CPP。

2025-05-18 13:13:26 1017

原创 ODB 的安装及使用

ODB)在数据元结构定义时,使用预处理器指令(#pragma)来提供元数据,这些元数据指示如何将 C++类型映射到数据库模式。这些#pragma指令是在 C++代码中使用的,它们不是C++语言的一部分,而是特定于ODB编译器的扩展。以下是 ODB中常用的一些#pragma指令:

2025-05-16 10:29:21 970

原创 websocketpp 安装及使用

这种情况下服务器是属于被动的一方,如果客户端不主动发起请求服务器就无法主动给客户端响应。TCP 这种级别的通信方式,一旦连接建立完成客户端或者服务器都可以主动的向对方发送数据。请求不同,包含了一些附加头信息,通过这个附加头信息完成握手过程并升级协议的过程。的形式,即客户端给服务器发送了一个 HTTP 请求,服务器给客户端返回一个。建立连接后,数据可以即时传输,无需重复建立连接(HTTP 每次请求需握手)。仅客户端发送给服务端的消息需要设置。的方式实现, 而轮询的成本比较高并且也不能及时的获取到消息的响应。

2025-05-12 16:01:38 1337

原创 ES C++客户端安装及使用

简称ES,它是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB级别的数据。es也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。是面向文档的,这意味着它可以存储整个对象或文档。

2025-05-11 23:11:13 844

原创 Docker Compose(容器编排)

是Docker官方的开源项目,使用python编写,实现上调用了 Docker 服务的API进行容器管理及编排,其官方定义为定义和运行多个Docker容器的应用。docker-compose 中有两个非常重要的概念服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。项目( project ):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml 文件中定义整个定义一个项目。Compose。

2025-05-09 14:42:39 1276

原创 brpc 安装及使用

brpc(Baidu Remote Procedure Call)是百度开源的一个高性能、通用的 RPC(远程过程调用)框架,其目标是让使用者能轻松构建高并发、分布式的应用程序。

2025-05-05 22:21:19 1020

原创 Docker Network(网络)

容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP。而言,桥接网络使用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离。共享其他容器的网络环境,则至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离。网络的容器共享宿主机的网络栈,容器的网络配置与宿主机完全一样。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络环境。

2025-05-02 23:00:27 795

原创 Docker Volume(存储卷)

这就意味着,当我们在容器中的这个目录下写入数据时,容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。因为未持久化数据的容器根目录的生命周期与容器的生命周期一样,容器文件系统的本质是在镜像层上面创建的读写层,运行中的容器对任何文件的修改都存在于该读写层,当容器被删除时,容器中的读写层也会随之消失。这样我们就创建了 bindnginx 容器,并将宿主机的 /test/docker/bind 目录和容器里的 /usr/share/nginx 绑定在一起,建立映射,这两个目录下的文件保持一致。

2025-04-30 16:14:48 743

原创 etcd 的安装及使用

Etcd是一个golang编写的分布式、高可用的一致性键值存储系统,用于配置共享和服务发现等。它使用 Raft一致性算法来保持集群数据的一致性,且客户端通过长连接 watch 功能,能够及时收到数据变化通知,相较于Zookeeper框架更加轻量化。

2025-04-28 19:42:20 1297

原创 Spdlog 日志组件的安装及使用

spdlog是一个高性能、超快速、零配置的C++日志库,它旨在提供简洁的API和丰富的功能,同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安 全以及异步日志记录。以下是对 spdlog的详细介绍和使用方法。

2025-04-27 21:27:48 834

原创 Docker Container(容器)

通俗地讲,容器是镜像的运行实体。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。虽然容器的本质是主机上运行的一个进程,但是容器有自己独立的命名空间隔离和资源限制。也就是说,在容器内部,无法看到主机上的进程、环境变量、网络等信息,这是容器与直接运行在主机上进程的本质区别。容器是基于镜像创建的可运行实例,并且单独存在,一个镜像可以创建出多个容器。不过该镜像文件与其源镜像文件 nginx:1.27.5 的区别就是,该文件的配置均没有设置,如 Cmd,Env 均为空。

2025-04-27 12:29:54 1511 4

原创 gtest 安装及使用

GTest是一个C++单元测试框架,由google公司发布。gtest是为了在不同平台上为编写 C++单元测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化等等测试所需的宏,以及全局测试,单元测试组件。

2025-04-26 13:21:11 864

原创 gflags 安装及使用

使用。

2025-04-25 00:19:48 725

原创 Docker Image(镜像)

我们以日常的地板为例,开发商的房子提供给用户的时候一般是做好了地暖,而这些地暖其实是一层一层添加的,最底层的钢筋水泥层,然后添加保温层,采暖管,再铺设水泥层,到最后交付的时候家家户户都是水泥面,这一层一般是不可修改的,最上层用户一般会再铺设商木地板或者地板砖每家每户的选择不一样,相当于我们镜像的容器层。构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。

2025-04-21 00:30:11 1140

原创 Docker Registry(镜像仓库)

Web服务器,一般是指网站服务器,是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向Web浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览,更可以放置数据文件,让全世界下载。例如百度就是一个 web服务器,提供搜索服务。Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个 IMAPPOP3SMTP代理服务器;Nginx可以作为一个HTTP 服务器进行网站的发布处理,另外 Nginx 可以作为反向代理进行负载均衡的实现。

2025-04-20 12:04:09 1021 3

原创 cgroups

Docker 及 k8s 中的 pod 就使用了 cgroups 提供的资源限制能力来完成 cpu,内存等部分的资源控制。比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算模块。,通过程序运行时对资源的调度触发相应的钩子以达到资源追踪和限制的目的。:确保一个进程组不会消耗过多的系统资源,从而影响到其他进程组的正常运行。:为进程组设置不同的优先级,确保关键进程获得更多的资源。

2025-04-11 17:46:53 1014

原创 NameSpace 隔离

Namespace 隔离是一种用于实现系统资源隔离的技术,广泛应用于容器化环境和多租户场景中。Namespace 是 Linux 内核提供的一种资源隔离机制,允许将系统资源分隔成多个虚拟的“空间”,每个命名空间内的进程只能访问该命名空间下的资源,而不能访问其他命名空间中的资源。通过 Namespace,不同的进程可以在同一个操作系统内共享硬件资源,但又能感知到各自独立的环境。:隔离文件系统的挂载点,确保每个容器拥有独立的文件系统视图。:隔离主机名和域名,每个容器可以拥有独立的主机名。

2025-04-11 12:48:34 628

原创 服务端八大架构的演进

想象一下,银行管理的账户金额,如果收到一笔转账之后,一份数据库的数据修改了,但另外的数据库没有修改,则用户得到的存款金额将是错误的。随着业务增长,然后发现系统的资源利用率不高,很多资源用来应对短时高并发,平时又闲置,需要动态扩缩容,还没有办法直接下线服务器,而且开发、测试、生产每套环境都要隔离的环境,运维的工作量变的非常大。数据库设计到这种结构时,已经可以称为分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来实现的,如分库分表的管理和请求分发,由 Mycat。

2025-04-09 00:45:39 551

原创 Protobuf 的快速使用(四)

搭建 Httplib 库Protobuf 还常⽤于通讯协议、服务端数据交换场景。那么在这个⽰例中,我们将实现⼀个⽹络版本的通讯录,模拟实现客⼾端与服务端的交互,通过 Protobuf 来实现各端之间的协议序列化。需求如下:客⼾端可以选择对通讯录进⾏以下操作:新增⼀个联系⼈删除⼀个联系⼈查询通讯录列表查询⼀个联系⼈的详细信息为了将代码简化,我们只具体实现新增联系人的功能,服务端则相应提供增删查能⼒,并需要持久化通讯录(为了将代码简化,

2025-04-05 11:37:24 255

原创 Protobuf 的快速使用(三)

升级通讯录 2.1 版本在(三)中,我们将新增联系⼈属性,共包括:姓名、年龄、性别、电话信息、地址、其他联系⽅式、备注。enum 类型语法⽀持我们定义枚举类型并使⽤。在.proto⽂件中枚举类型的书写规范为:枚举类型名称:使⽤驼峰命名法,⾸字⺟⼤写。例如: MyEnum常量值名称:全⼤写字⺟,多个字⺟之间⽤ _连接。例如:要注意枚举类型的定义有以下⼏种规则:0 值常量必须存在,且要作为第⼀个元素。这是为了与 proto2 的语义兼容:第⼀个元素作为默认值,且值为 0。

2025-03-31 15:26:44 902

原创 Protobuf 的快速使用(二)

创建通讯录 2.0 版本这个部分会对通讯录进⾏多次升级,使⽤ 2.x 表⽰升级的版本,最终将会升级如下内容:不再打印联系⼈的序列化结果,⽽是将通讯录序列化后并写⼊⽂件中。从⽂件中将通讯录解析出来,并进⾏打印。新增联系⼈属性,共包括:姓名、年龄、性别、电话信息、地址、其他联系⽅式、备注。字段规则消息的字段可以⽤下⾯⼏种规则来修饰:singular :消息中可以包含该字段零次或⼀次(不超过⼀次)。proto3 语法中,字段默认使⽤该规则。

2025-03-29 13:47:48 404

原创 Protobuf 的快速上手(一)

序列化概念序列化概念序列化:把对象转换为字节序列的过程称为对象的序列化。反序列化:把字节序列恢复为对象的过程称为对象的反序列化。什么情况下需要序列化存储数据:当你想把的内存中的对象状态保存到⼀个⽂件中或者存到数据库中时。⽹络传输:⽹络直接传输数据,但是⽆法直接传输对象,所以要在传输前序列化,传输完成后反序列化成对象。例如我们之前学习过 socket 编程中发送与接收数据。我们可以通过等方式实现序列化,接下来,我们来介绍protobuf。

2025-03-29 12:03:29 1035

原创 Linux网络 多路复用epoll && Reactor 反应堆模式

epoll 是 Linux 内核为处理大批量文件描述符而设计的 I/O 事件通知机制,它提供了一种高效的方式,能够同时监控多个文件描述符的事件(如读、写等),并且回调那些就绪的文件描述符。相比于传统的 select 和 poll,epoll 在处理大量并发连接时具有更高的效率,特别适用于高并发服务器的开发。功能:创建一个 epoll 实例,返回一个文件描述符。size 参数已弃用,只需要大于 0 即可。成功:返回epoll文件描述符。失败:返回-1,并设置errno。

2025-03-19 15:21:50 779

原创 C++11 异步操作

std::future 和 std::shared_future 都是C++11标准库中的⼀个模板类,它表⽰⼀个异步操作的结果。当我们在多线程编程中使⽤异步任务时,其可以帮助我们在需要的时候获取任务的执⾏结果。其的⼀个重要特性是能够阻塞当前线程,直到异步操作完成,从⽽确保我们在获取结果时不会遇到未完成的操作。应用场景异步任务: 当我们需要在后台执⾏⼀些耗时操作时,如⽹络请求或计算密集型任务等,std::future可以⽤来表⽰这些异步任务的结果。通过将任务与主线程分离,我们可以实现任务的并⾏处理,从。

2025-03-17 15:34:29 672

原创 Muduo库的简介与使用

初始化:创建EventLoop,根据需要创建TcpServer或TcpClient,设置回调函数。事件循环:调用EventLoop的 loop() 方法,进入事件循环,等待事件发生。事件检测与分发:通过I/O多路复用检测事件,将事件分发给对应的Channel。网络事件处理连接建立/断开:触发连接回调,处理连接相关逻辑。数据收发:触发消息回调,处理数据接收和发送逻辑。多线程协作(如适用):在多线程环境下,主线程和子线程协同处理不同的连接事件。程序退出。

2025-03-14 19:25:04 1196

原创 Linux网络 五种 IO 模型

在计算机网络和操作系统中,I/O(输入/输出)模型描述了程序如何与外部设备(如磁盘、网络接口等)进行数据交互,不同的I/O模型在处理I/O操作时的行为和性能表现各有不同。以下是五种常见的I/O模型及其特点。

2025-03-11 23:49:10 672

原创 Linux网络 多路复用 select && poll

select 函数是 Unix 和类 Unix 系统中用于实现多路复用输入/输出(I/O)的一种系统调用。它允许程序同时监视多个文件描述符(file descriptors),以确定它们是否准备好进行读取、写入或异常条件检测,程序会停在 select等待,直到被监视的文件描述符有一个或多个发生了状态改变。它同时检查多个文件描述符是否准备好进行 I/O 操作,从而避免程序阻塞在单个 I/O 操作上,这使得程序能够同时处理多个 I/O 事件,例如同时监听多个网络连接或文件输入。

2025-03-06 18:24:07 862

原创 Linux网络 NAT、代理服务、内网穿透

IPv4协议中存在IP地址数量不充足的问题,而 NAT 技术是当前解决IP地址不够用的主要手段, 是路由器的一个重要功能。NAT 能够将私有 IP 对外通信时转为全局 IP,也就是就是一种将私有 IP 和全局 IP 相互转化的技术方法。这可以让很多学校,家庭,公司内部采用每个终端设置私有 IP,而在路由器或必要的服务器上设置全局 IP。全局 IP 要求唯一,但是私有 IP 不需要,在不同的局域网中出现相同的私有 IP 是完全不影响的。

2025-03-03 19:30:45 1168

原创 Linux网络 DNS

TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序但是IP地址不方便记忆。于是人们发明了一种叫主机名的东西,是一个字符串并且使用hosts文件来描述主机名和 IP地址的关系。最初通过互连网信息中心(SRI-NIC)来管理这个hosts文件的如果一个新计算机要接入网络,或者某个计算机IP变更都需要到信息中心申请变更 hosts文件其他计算机也需要定期下载更新新版本的 hosts文件才能正确上网这样就太麻烦了于是产生了DNS系统。

2025-03-02 14:29:22 991

原创 Linux网络 TCP全连接队列与tcpdump抓包

在 Linux 网络中,TCP 全连接队列(也称为 Accept 队列)是一个重要的概念,用于管理已经完成三次握手,即已经处于 established 状态但尚未被应用程序通过 accept( ) 函数处理的 TCP 连接,避免因为应用程序处理不及时而导致连接丢失。

2025-03-01 16:13:07 939

原创 Linux网络 数据链路层

在Linux网络中,数据链路层位于物理层之上,网络层之下,其主要职责是将网络层的IP数据包封装成帧,并通过物理链路发送到目标设备。以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等。MTU(Maximum Transmission Unit,最大传输单元)是指网络中能够传输的单个数据包的最大字节数,它是数据链路层的概念,用于限制链路层一次性转发的数据帧的最大尺寸。所以在以太网中,设备需要知道目标设备的MAC地址才能传输数据,而ARP协议通过广播机制实现IP地址到MAC地址的映射。

2025-02-28 22:20:24 924

原创 Redis 分布式锁

我们引⼊⼀组 Redis 节点. 其中每⼀组 Redis 节点都包含⼀个主节点和若⼲从节点. 并且组和组之间存储的数据都是⼀致的, 相互之间是 "备份" 关系. 加锁的时候, 按照⼀定的顺序, 写多个 master 节点. 在写锁的时候需要设定操作的 "超时时间". ⽐如 50ms. 即如果 setnx 操作超过了 50ms 还没有成功, 就视为加锁失败.同理, 释放锁的时候, 也需要把所有节点都进⾏解锁操作. (即使是之前超时的节点, 也要尝试解锁, 尽量保证逻辑严密).

2025-02-27 15:20:29 1002

原创 Redis 集群

表⽰的. 表⽰ 16384 (16k) 个 slots, 需要的位图⼤⼩是 2KB. 如果给定的 slots 数更多了, ⽐如 65536 个了, 此时就需要消耗更多的空间, 8 KB 位图表⽰了. 8 KB, 对于内存来说不算什么, 但是在频繁的⽹络⼼跳包中, 还是⼀个不⼩的开销的.围绕这个问题, 业界有三种⽐较主流的实现⽅式.缺点: ⼀旦需要进⾏扩容, N 改变了, 原有的映射规则被破坏, 就需要让节点之间的数据相互传输, 重新排列, 以满⾜新的映射规则. 此时需要搬运的数据量是⽐较多的, 开销较⼤.

2025-02-26 22:06:24 1076 2

原创 Redis 缓存

因此就需要提前把热点数据准备好, 直接写⼊到 Redis 中. 使 Redis 可以尽快为 MySQL 撑起保护伞. 热点数据可以基于之前介绍的统计的⽅式⽣成即可. 这份热点数据不⼀定⾮得那么 "准确", 只要能帮助 MySQL 抵挡⼤部分请求即可. 随着程序运⾏的推移, 缓存的热点数据会逐渐⾃动调整, 来更适应当前情况.如何让数据库能够承担更⼤的并发量呢?针对要查询的参数进⾏严格的合法性校验. ⽐如要查询的 key 是⽤⼾的⼿机号, 那么就需要校验当前 key 是否满⾜⼀个合法的⼿机号的格式.

2025-02-26 22:06:15 830

原创 Linux网络 网络层

4位版本号(version):指定IP协议的版本对于IPv4来说就是4.4位头部长度头部的长度是多少个32bit,也就是4 字节,4bit表示最大的数字是15,因此IP头部最大长度是60字节8 位服务类型位优先权字段已经弃用), 4位TOS字段和 1 位保留字段必须置为0). 4位TOS分别表示最小延时最大吞吐量最高可靠性, 最小成本.这四者相互冲突只能选择一个对于ssh/telnet这样的应用程序。

2025-02-24 17:33:37 1412

原创 C++ 互斥锁的使用

std::mutex 是C++标准库中用于线程同步的互斥锁机制,主要用于保护共享资源,避免多个线程同时访问导致的竞态条件。lock:阻塞当前线程,直到获取锁。unlock:释放锁,允许其他线程获取锁。try_lock:尝试获取锁,如果锁已被占用则立即返回。

2025-02-22 17:07:50 957

原创 C++ thread库的使用

在C++中,std::thread 是C++11引入的线程库的一部分,用于创建和管理线程。它提供了一个简单而强大的方式来实现多线程编程。thread库底层是对各个系统的线程库进⾏封装,如Linux下的pthread库和Windows下Thread库等,所以C++11 thread库的第⼀个特点是可以跨平台,第⼆个特点是Linux和Windows下提供的线程库都是⾯向过程的,C++11 thread是库⾯向对象的,并且融合了⼀些C++11语⾔特点,如右值引⽤的移动语义,可变模板参数等,⽤起来会更好⽤⼀些。

2025-02-22 15:18:15 499

原创 Linux System V - 消息队列与责任链模式

消息队列是一种以消息为单位的进程间通信机制,允许一个或多个进程向队列中发送消息,同时允许一个或多个进程从队列中接收消息。:发送方和接收方不需要同时运行,消息会存储在队列中。:支持消息的优先级排序。:每条消息都有一个类型,可以根据类型选择性地接收。:即使发送方或接收方意外退出,消息仍然保留在队列中。内核结构在其中是 System V IPC(进程间通信)机制中用于描述 IPC 对象(如消息队列、信号量集或共享内存段)权限和所有者信息的数据结构。

2025-02-21 00:16:44 1080

原创 Redis 客户端C++使用

安装 redis-plus-plus安装 redis-plus-plus在C++中使用Redis,通常需要借助第三方库来实现与Redis服务器的交互。目前比较流行的库有和。是基于实现的,是⼀个 C 语⾔实现的 redis 客⼾端,因此需要先安装直接使⽤包管理器安装即可。UbuntuCentos之后通过源码编译安装构建成功后, 会在。

2025-02-19 20:54:40 415

空空如也

空空如也

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

TA关注的人

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