
010-Linux服务器
文章平均质量分 71
网络编程 linux系统编程
牛不才
c/c++ linux 后端 架构 搜索引擎
展开
-
使用dot来画流程图
Dot是一种图形描述语言,属于Graphviz软件的一部分。Graphviz是一个用于可视化图形(图表、网络图等)的开源工具集。使用Dot语言,你可以创建并描述节点和边,从而生成图形。原创 2024-07-02 14:18:39 · 1066 阅读 · 0 评论 -
C++协程
协程(Coroutine)是程序组件,可以在执行过程中暂停并在稍后继续执行。与传统的子例程(如函数或过程)不同,子例程一旦调用,必须等其返回后才能继续执行调用它的代码。协程则可以在执行过程中暂停,将控制权交还给调用者,并且可以在稍后从暂停的地方继续执行。可以在执行过程中暂停和恢复:这使得协程能够在需要的时候让出控制权,然后在适当的时候恢复执行。保持状态:协程在暂停时会保存其当前的执行状态(包括局部变量和程序计数器),在恢复时可以从上次暂停的地方继续执行。协同调度。原创 2024-06-08 17:41:17 · 1263 阅读 · 2 评论 -
Elasticsearch简介
Elasticsearch 是一个基于 Apache Lucene 的开源搜索引擎,旨在实现分布式搜索和数据分析。Elasticsearch 通常与 Kibana、Logstash 和 Beats 一起使用,形成 ELK Stack,用于日志和事件数据分析、应用性能监控和业务数据可视化。原创 2024-06-06 23:32:47 · 1389 阅读 · 2 评论 -
RapidJSON
要在项目中使用 RapidJSON 库,需要首先下载并包含该库的头文件。原创 2024-06-06 23:21:53 · 744 阅读 · 0 评论 -
python中的预编译正则表达式
预编译正则表达式指的是使用Python的re模块中的函数提前将正则表达式的字符串形式编译成一个正则表达式对象。这样,当你需要在多个地方或多次使用同一个正则表达式时,你可以重用这个编译后的对象,而不是在每次使用时重新编译表达式。这种做法可以提高效率,特别是在需要频繁使用同一正则表达式进行匹配的场景中。原创 2024-06-01 22:14:47 · 748 阅读 · 0 评论 -
python正则表达式中的分组功能
在Python的re模块中,group()方法是用于从一个匹配的对象(例如,re.match或re.search返回的对象)中提取匹配的字符串。当你使用正则表达式进行匹配时,匹配对象会包含原始字符串中与模式匹配的部分。group()方法可以用来访问这些匹配的部分。group(0)group()group(n)n()n=1n=2如果正则表达式中包含了括号(用于分组),那么你可以通过group(n)来访问每个分组的匹配内容。原创 2024-06-01 22:03:08 · 1063 阅读 · 0 评论 -
python中的正则表达式
Python中的正则表达式(Regular Expressions,简称regex)是一种强大的字符串处理工具,它通过定义搜索模式来匹配、查找、替换或拆分字符串。正则表达式在文本处理、数据清洗和验证等领域非常有用。Python通过内置的re模块提供了对正则表达式的支持。原创 2024-06-01 21:58:21 · 1050 阅读 · 0 评论 -
什么是gRPC?
首先,创建一个Proto文件(calculator.proto),定义服务和消息类型。// 定义请求消息// 定义响应消息// 定义计算器服务。原创 2024-06-01 21:26:09 · 1390 阅读 · 0 评论 -
RocksDb与LevelDb的区别
LevelDB 是一个开源的、嵌入式的键值存储引擎,由Google开发。它是一个轻量级的、高性能的数据库库,特别适合嵌入到需要高效读写操作的应用中。RocksDB 是一个高性能的键值存储引擎,它是由Facebook开发的,基于LevelDB。它专为需要高吞吐量和低延迟的场景而设计,特别适用于存储大量数据和需要快速访问的应用。无论是作为数据库的存储引擎、缓存系统还是日志系统,RocksDB都能够提供可靠和高效的解决方案。原创 2024-05-29 09:41:19 · 1032 阅读 · 0 评论 -
当redis的存储空间满了,会发生什么?
当Redis的存储空间满了时,它的行为取决于配置的最大内存策略(maxmemory-policy)。Redis的数据淘汰策略主要围绕两个关键因素展开:键是否设置了过期时间,以及键的使用频率或最近使用情况。这些策略之间的关系可以从它们是如何影响键的淘汰决策中看出。原创 2024-05-04 22:52:34 · 1206 阅读 · 0 评论 -
protobuf在配置文件管理上的应用
虽然Protobuf是一个强大的工具,但它通常不是用于简单配置文件的首选,因为它生成的是二进制文件,而不是人类可读的文本文件,如JSON或YAML。然而,对于需要高效传输和读取的复杂配置数据,或者在多个服务之间共享配置数据的情况,Protobuf是一个很好的选择。:在应用程序中,你可以使用生成的数据访问类读取(反序列化)配置文件中的数据,或者写入(序列化)新的配置数据。:首先,你需要使用Protobuf的语法定义你的配置文件的结构。:应用程序可以根据解析后的配置数据进行初始化或者根据当前的需求调整配置。原创 2024-05-03 20:58:37 · 702 阅读 · 1 评论 -
git简介
提交是项目历史的一个快照,包含了自上次提交以来对工作目录中文件的更改。远程仓库是位于网络上的服务器(如GitHub、GitLab或Bitbucket)上的版本库,它允许多个用户共享和协作。本地仓库是位于你的本地计算机上的一个目录,它由Git维护,并存储了项目的历史记录和变更数据。Git通过这些基本概念和操作,提供了一个强大的工具集,用于跟踪、共享和协作代码开发。目录下,它保存了下一次提交(commit)将包含的文件的信息。命令将本地的变更提交推送到远程仓库,以便其他人可以看到。分支是项目开发的不同线路。原创 2024-05-03 18:09:27 · 598 阅读 · 0 评论 -
doxygen 辅助阅读代码的神器
Doxygen是一个文档生成工具,主要用于编写编程语言的软件文档。它最初是为C++设计的,但后来增加了对C、C#、Java、Objective-C、Python、IDL(在某些情况下还有PHP、C#和D)的支持。Doxygen可以从一组带有文档注释的源代码文件中提取文档,并生成多种格式的可视化文档。这些注释通常遵循特定的格式,以便Doxygen能够解析它们并组织相关的文档信息。原创 2024-05-03 17:55:21 · 816 阅读 · 0 评论 -
什么是CI/CD流水线
在软件开发中,流水线系统(通常被称为CI/CD流水线或部署流水线)是一种自动化的过程,用以快速、可靠地将软件从开发阶段引向生产阶段。CI代表持续集成(Continuous Integration),而CD代表持续交付(Continuous Delivery)或持续部署(Continuous Deployment)。通过使用流水线系统,团队可以减少手动错误,提高生产效率,缩短产品上市时间,确保软件质量的同时,还能持续快速地响应市场变化。这种自动化的流程是现代敏捷软件开发不可或缺的一部分。原创 2024-05-03 16:45:38 · 1648 阅读 · 0 评论 -
什么是trace系统?
Trace系统,也常被称为分布式追踪系统,是一种用于监控、分析和优化复杂分布式系统(如微服务架构)中服务调用的工具。随着现代应用程序向微服务架构的转变,一个用户请求可能需要跨越多个服务来完成。这种架构带来了更好的可扩展性和灵活性,但同时也使得监控和故障排查变得更加复杂。Trace系统通过提供请求的完整生命周期视图,帮助开发者和运维人员理解服务之间是如何相互作用的,从而快速定位问题所在。原创 2024-05-03 16:37:15 · 1713 阅读 · 0 评论 -
Service Mesh 是什么?
随着聚会规模的扩大,你需要解决几个问题,比如如何确保每个人都能找到聚会地点(服务发现)、如何让食物和饮料供应均衡(负载均衡)、如果雨天怎么办(故障恢复)、如何确保只有被邀请的人进入(安全性)、如何了解大家是否都玩得开心(可观测性)以及如何灵活应对变化,比如突然多了很多人或有人有特殊需求(配置和流量管理)。他们知道如何引导客人到达,如何根据客人的数量和偏好调整食物和饮料的供应,如何应对下雨天气,确保只有受邀的客人能进入,监控大家的满意度,并且灵活应对任何突发情况。原创 2024-05-03 16:18:51 · 679 阅读 · 0 评论 -
长链接、短链接与连接池
在计算机网络中,“长连接”、"短连接"和"连接池"是常用的概念,尤其在客户端与服务器之间进行通信时。原创 2024-04-21 10:29:02 · 599 阅读 · 0 评论 -
Nginx简介
1. Nginx概述Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。它可以提供正向代理、反向代理、负载均衡、动静分离等功能。nginx通过配置文件来配置功能,路径一般是/usr/local/nginx/conf/nginx.conf配置文件的内容分为三部.原创 2021-08-08 11:02:08 · 547 阅读 · 0 评论 -
nginx在ubuntu系统上的安装
纯操作手册性的入门文章,按照步骤一步一步走就好了1. 下载安装包wget http://nginx.org/download/nginx-1.21.1.tar.gz依赖包wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gzsudo apt-get install build-essentialsudo apt-get install openssh-serversudo apt.原创 2021-08-07 21:06:34 · 453 阅读 · 0 评论 -
数据高可用之双机架构
在https://blog.youkuaiyun.com/niu91/article/details/112330339 中所提及的mysql双机热备份,本文算是此篇文章的一个延申。1. 什么是高可用高可用或者说容灾,就是说当系统遇到突发情况或者故障的时候,能够保重业务不中断。一般的实现方案都是将数据(可以文件、数据库甚至是操作系统)冗余备份到多个存储设备上,出现故障时,备胎转正。下面介绍几种常见的双机方案。2. 主备这可能是最简单最容易让人想到的方案,备机备份主机数据,当发生故障时备机改为主机,...原创 2021-06-23 00:15:30 · 404 阅读 · 0 评论 -
MySQL连接池
当程序中频繁访问数据库时,我们可以采用向内存池、线程池那样的池化技术,引入数据库连接池,减少申请和释放数据库连接的操作,从而提高性能。在很多C++库中都集成了连接池,下面以Poco的mysql连接池为例进行简要的介绍,下面是代码示例,其他数据库连接池的使用也是类似。需要指定数据库连接的参数、最大最小连接数还有空闲时间。...原创 2021-06-20 23:13:27 · 576 阅读 · 1 评论 -
redis简介 (六)整数集合、压缩列表
1. 整数集合1.1 基本用法[root@localhost redis]# redis-cli 127.0.0.1:6379> sadd numbers 10000 10086 10010(integer) 3127.0.0.1:6379> OBJECT encoding numbers"intset"127.0.0.1:6379> 如果我们创建一个纯数字的集合,那么它的内部编码方式将是intset,整数集合。1.2 数据结构typedef st原创 2021-05-21 20:39:26 · 214 阅读 · 0 评论 -
Linux中的IO体系结构
Linux内核一个的主要作用就是管理硬件,而像键盘、鼠标、显示器、网卡、硬盘、打印机、CD/DVD等等这么多设备,形状、用法、处理速度、功能都不一样,该怎么统一管理起来呢?1. 一切皆文件在linux中一切皆文件,设备也不例外,设备文件放在dev目录下。应用程序可以像访问普通文件一样访问设备,内核vfs下面的驱动程序层和硬件实现具体的功能。ubuntu@VM-0-16-ubuntu:~$ ls -l /dev/total 0crw-r--r-- 1 root root原创 2021-05-20 01:05:17 · 548 阅读 · 0 评论 -
redis简介 (五)动态字符串、链表
1. 动态字符串redis中使用动态字符串(sds)的对象类型,作为默认的字符串类型。1.1 基本用法127.0.0.1:6379> set mykey "hello world"OK127.0.0.1:6379> rpush animal "fish" "dog" "cat"(integer) 3127.0.0.1:6379> get mykey"hello world"127.0.0.1:6379> lrange animal 0 101) "fis原创 2021-05-19 22:16:15 · 152 阅读 · 1 评论 -
表设计中的陷阱与建议
1. 数字类型1.1 整型类型数量字段用 unsigned 还是signed? 一般来讲,数量不可能为负值,用unsigned是理所应当的事情。但是如下情况,做此类减法的统计,那么报错就来了。大意是计算值为负,超出了unsigned的范围。这个可以通过SET sql_mode='NO_UNSIGNED_SUBTRACTION';解决。但是如果有符号整型可以满足需求,那么就不要使用无符号整型,否则就会有类似不必要的麻烦。MariaDB [mysql]> CREATE TABLE Item原创 2021-05-14 22:05:58 · 300 阅读 · 0 评论 -
redis简介(四)哈希算法和rehash
1. hash算法添加一个键值对到redis时,首先要根据key算出hash值和索引,然后根据索引将新键值对的hash表节点关联索引。计算hash和索引,假设hash值为456(000111001000), 掩码为255(11111111)则得到的索引为200(11001000)#define dictHashKey(d, key) (d)->type->hashFunction(key)unsigned int h;dictEntry *he;h = dictH原创 2021-05-13 20:09:58 · 1231 阅读 · 0 评论 -
redis简介(三) redis中的存储数据结构
redis是一种基于key-value的内存数据库。所谓kv存储或者说kv数据库,就是说里面数据都是一对一对的存储的,其中key是唯一的一个索引。这种结构一般是基于哈希表,效率极高,查找复杂度为O(1)。不过hashmap也不是万能的,随着数据量的增多,造成的hash冲突也就越严重,复杂度增加,redis需要进行rehash,对hashmap进行扩容。如图所示,redis还支持丰富的数据结构类型,那么这些是怎么做到的呢?它们在内存中是怎么存储的呢?1. redis中的对象在redis中每原创 2021-05-13 08:32:56 · 1920 阅读 · 0 评论 -
redis简介(二) 位操作 订阅发布 事务 备份等
1. 字符串中位操作的应用场景1.1 字符串设置比特位场景一: 标识文章是否已经阅读。假设标识文章“协议”的内容如下 1bit 1bit 1bit 1bit 1bit 1bit 1bit 1bit 其他内容 是否阅读 是否收藏 是否点赞原创 2021-05-11 22:40:08 · 188 阅读 · 0 评论 -
指令重排和优化屏障
1. 优化带来的烦恼用过GCC编译的同学应该知道GCC有O0、O1、O2、O3等优化选项,启用这些选项往往可以提高程序的运行效率,但它并不是万无一失的,尤其是在多线程场景下。而这些优化背后的技术正是指令重排。因为编译器或处理器也很难确定代码逻辑的原本意图。锁能够保持原子性,但是经过编译器优化之后的代码,并不是绝对时序正确的,况且处理器还有可能进一步优化。这里面最经典的一个例子就是单例模式,Double-Checked Locking is Fixed In C++11 。2. 内核提供的解决方案原创 2021-04-30 19:14:44 · 918 阅读 · 3 评论 -
RCU
1. 什么是RCURCU(Read-Copy-Update),是一种同步机制,它虽然对内存有一定的开销,但是它的性能非常好。在Linux内核中随处可见它的身影。2. RCU的工作机制RCU下,会记录指向共享结构体指针的所用使用者。这个结构体将要被修改时,首相将会创建一个副本,然后把改动写入副本当中。当所有的读操作使用者访问结束之后,指针指向新的修改后副本的指针,副本就这么上位了,修改也就是最新的了。基本原理是很简单的,一个备胎而已,空闲时上位而已。要是支持多任务读写并发,就复杂些了。3. 适原创 2021-04-30 19:09:09 · 1316 阅读 · 1 评论 -
eventfd
1. 简介eventfd - create a file descriptor for event notificationeventfd是通过事件通知机制。int eventfd(unsigned int initval, int flags);eventfd创建一个“eventfd对象”,可以用作事件等待/通知机制由用户空间应用程序和通知用户空间应用程序事件的内核。这个对象包含由内核维护的无符号64位整数计数器。此计数器已初始化使用参数initval中指定的值。eventfd()返回一原创 2021-04-27 19:49:06 · 1921 阅读 · 0 评论 -
内核模块
Linux模块概述Linux内核是宏内核,除了基本功能之外,文件系统和驱动程序都集成在一起管理,这样做呢,相对于微内核而言少了很多切换的消耗,效率很高,但是扩展性和可维护性就较差了,为了弥补这一不足,就诞生了模块机制。模块可以在内核启动的过程中加载,也就是所说的静态加载,也可以在运行过程中加载,动态加载和卸载,不需要重新编译内核,扩展和维护性就提高了。一个模块加载到内核中之后,就成了内核的一...原创 2020-03-24 10:43:50 · 221 阅读 · 0 评论 -
linux常用命令
查找find根据文件名find / -name filename.txt -print0 | xargs -o ls -l根据文件大小find ./ -size +10M根据文件类型find ./ -name config -type d --查找文件夹根据修改时间find . -ctime -1 --一天内find . -ctime 1 --当前时间是第一天find . ...原创 2020-03-24 10:05:16 · 179 阅读 · 0 评论 -
进程间通信 IPC 概述
Linux进程间通信,大致有五种原始的信号和管道,还有共享内存,消息队列和信号。1. 管道管道分为两种 pipe和fifopipe可用有亲缘关系的进程,比如父子进程,兄弟进程fifo可用不同进程之间,不限于亲缘关系pipe半双工,一端读一端写,数据在一个方向上流动。可以看成是一种特殊的文件,只不过它只在内存里,不落地到文件系统。管道的缓冲区有限制,PIPE_BUF 一般是一个页面的...原创 2020-03-24 09:47:20 · 196 阅读 · 0 评论 -
gdb调试
GDB调试其实并不复杂,最主要的就是断点和堆栈,掌握了这两个点,其他的几乎都是围绕着这两而来的扩展,记忆起来也就很简单了。断点断点的设置,其实代码位置的确定,比如某个函数,某个文件的某个函数,某个文件的第几行,当前光标偏移行等等都可以用来设置断点,命令如下1.设置断点 break或者bbreak func_namebreak 行号break filename:行号break fil...原创 2020-03-24 09:20:10 · 141 阅读 · 0 评论 -
TCP如何进行拥塞控制
拥塞控制和流量控制不一样,后者是端对端的问题,它则是一个全局的问题,涉及主机,路由器等等通信设备,还有些和降低传输性能有关的问题。主要涉及三个算法慢开始算法如图所示,拥塞窗口cwnd在最开始时,值为1,然后按照*2翻倍的形式增长直到这个值大于等于 慢开始门限之后,从这个门限16开始,以+1的形式增长直到发生超时,那么cwnd变为1,再按照*2翻倍的形式增长但是这次慢开始门限变了...原创 2020-03-27 12:12:39 · 1272 阅读 · 0 评论 -
TCP如何进行流量控制
TCP中的流量控制和拥塞控制不同,它只解决端到端之间的问题。往往是要通过降低发送端发送数据的速率,以便接收端能够处理,而不造成拥塞。在TCP的首部,有一个标识窗口大小的16位字段,这个字段越大,说明滑动窗口(缓冲区越大),网络的吞吐量也就越大。接收端在收到ACK请求之后,也会把自己的窗口大小填进去,回应发送端,两端取一个最小的窗口尺寸进行数据发送。如果,接收端这边网络拥堵,状况不佳,那么这个窗...原创 2020-03-27 11:48:37 · 4173 阅读 · 0 评论 -
TCP如何保证可靠性
TCP是基于IP协议的传输层协议,但是IP协议本身是不可靠的,那么就得从TCP上做文章。1.校验和 保证传输数据正确这个校验和和UDP中的校验和基本一致,伪首部+TCP首部+数据 一起计算出校验和,一个16位的整数伪首部组成如下:源IP地址(32位)| 目的IP地址(32位)|填充0(8位)|协议号(8位)|UDP包长度(16位)那么为什么要把这个伪首部加进来呢?TCP/IP通信中有...原创 2020-03-27 11:31:38 · 436 阅读 · 0 评论 -
TCP首部格式
源端口号(16位) 目 的 端 口 号(16位) 序列号(32位) 确认应答号(32位) 偏移 ...原创 2020-03-26 14:30:11 · 459 阅读 · 0 评论 -
UDP首部格式
TCP和UDP首部格式UDP首部格式 源端口号 目标端口号 包长度 校验和 数据部分 源端口号表示发送端端口号,长度16位,可选项,如果不需要返回数据数据,可以不设置。目标端口号表示接收端端口号,长度16位。包长度该字段保存了UDP首部+数据的...原创 2020-03-26 10:26:39 · 1718 阅读 · 0 评论