C++开发
文章平均质量分 93
Linux技术狂
C/C++Linux后台服务器开发高级架构师内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。只要备注【TTT】即可获得,不备注没有哦
展开
-
2023年【零声教育】13代C/C++Linux服务器开发高级架构师课程体系分析
C/C++Linux后台服务器开发高级架构师内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。原创 2023-08-01 19:56:17 · 2093 阅读 · 0 评论 -
设计模式第八讲:观察者模式和中介者模式详解
(1). 定义指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式模型-视图模式,它是对象行为型模式。PS: 观察者模式是 【1对多】的关系,后面的中介者模式是 【多对多】的关系。(2). 优点:A. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。B. 目标与观察者之间建立了一套触发机制。(3). 缺点:A. 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。原创 2023-02-23 20:38:07 · 785 阅读 · 0 评论 -
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
(1). 定义是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。(2). 优点A. 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。B. 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。原创 2023-02-17 14:39:22 · 610 阅读 · 0 评论 -
设计模式第六讲:责任链模式和迭代器模式详解
(1). 定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。PS:责任链模式也叫职责链模式。在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。(2). 优点:A. 降低了对象之间的耦合度。原创 2023-02-15 15:11:08 · 466 阅读 · 0 评论 -
设计模式第五讲-装饰器模式和代理模式详解
(1). 定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。(2). 优点:A. 采用装饰模式扩展对象的功能比采用继承方式更加灵活。B.可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。(3). 缺点装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。(1). 定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。原创 2023-02-14 14:32:47 · 1010 阅读 · 0 评论 -
设计模式-值类型与引用类型、深拷贝与浅拷贝、原型模式详解
(1). 值类型有更好的效率,但不支持多态,适合用作存储数据的载体。而引用类型支持多态,适合用于定义程序的行为。(2). 引用类型可以派生新的类型,而值类型不能。定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。原创 2023-02-11 17:46:43 · 721 阅读 · 0 评论 -
设计模式-组合模式和建筑者模式详解
(1). 定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。(2). 优点:A. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;B. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;(3). 缺点A. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;B. 不容易限制容器中的构件。原创 2023-02-10 20:33:24 · 1080 阅读 · 0 评论 -
设计模式-策略模式详解
(1) 定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。(2) 优点:A. 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句。B. 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。原创 2023-02-09 14:24:43 · 363 阅读 · 0 评论 -
设计模式-工厂方法模式和抽象工厂模式
(1) 定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。抽象工厂需要满足下面条件:A. 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。B. 系统一次只可能消费其中某一族产品,即同族的产品一起使用。(2).优点。原创 2023-02-08 17:10:00 · 947 阅读 · 0 评论 -
单线程 Redis 如此之快的 4 个原因
综上所述,单线程架构是Redis团队经过时间考验的深思熟虑的选择。尽管是单线程的,Redis 仍然是性能最高和最常用的内存数据存储之一。原文链接:单线程 Redis 如此之快的 4 个原因。原创 2023-02-07 16:30:53 · 482 阅读 · 0 评论 -
「AVL平衡树专项」带你领略常用的AVL树与红黑树的奥秘(规则篇)
满足下列条件的二叉搜索树是红黑树每个结点要么是“红色”,要么是“黑色”所有的叶结点都是空结点,并且是“黑色”的。如果一个结点是“红色”的,那么它的两个子结点都是“黑色”的。(注:也就是說,如果結點是黑色的,那么它的子節點可以是紅色或者是黑色的)。结点到其子孙结点的每条简单路径都包含相同数目的“黑色”结点根结点永远是“黑色”的之所以称为红黑树的原因就在于它的每个结点都被“着色”为红色或黑色。这些结点颜色被用来检测树的平衡性。原创 2023-02-04 14:49:08 · 687 阅读 · 0 评论 -
一文揭晓,我是如何在Linux中查找自如
以上操作我们能够通过 find 命令来查找结果,但更多时候我们真正想做的是对结果执行某些特殊操作。当我们想要删除 /Users/cbuc/testdir/dir2 这个目录时,我们可以通过以上认识到的操作先进行查找然后使用 -delete 命令来删除当前匹配的文件可以发现, /Users/cbuc/testdir/dir2 这个目录已经被删除了删除当前匹配的文件对匹配的文件执行相当于 ls -dils 命令的操作将匹配文件的完整路径名输出至标准输出一旦发现匹配就退出。原创 2023-02-01 16:55:50 · 383 阅读 · 0 评论 -
树与二叉树深度剖析(二)
(1). 第一个节点先成为表示树的根(2). 第二个结点插入时变为根,原根结点变为新结点的左孩子。(3). 插入节点为数字时,沿根结点右链插入到最右端。(4). 插入节点为操作符时,先与根结点操作符优先级对比。a.优先级不高时,新结点成为根结点,原表达式成为新结点的左子树。b.优先级高时,新结点成为根结点的右孩子,原根结点的右孩子成为新结点的左子树。代码分享:/// 树节点类set;} //左孩子set;} //右孩子set;} //数据} //是否为操作符/// 数据构造。原创 2023-01-29 14:53:07 · 656 阅读 · 0 评论 -
树与二叉树深度剖析(一)
本身是有序树,树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2。二叉树有五中基本形态:空二叉树,仅有根节点的二叉树,右子树为空的二叉树,左子树为空的二叉树,左右子树均非空的二叉树。原创 2023-01-28 16:12:12 · 745 阅读 · 0 评论 -
从状态机的角度async和await的实现原理
(1).含义:通常我们所说的状态机(State Machine)指的是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型,可以理解成一个状态转换图。(状态机是计算机科学的重要基础概念之一,也可以说是一种总结归纳问题的思想,应用范围非常广泛)(2).例子:自动门有两个状态,open 和 closed ,closed 状态下,如果读取开门信号,那么状态就会切换为 open。原创 2023-01-13 14:30:50 · 1348 阅读 · 0 评论 -
TiDB 底层存储结构 LSM 树原理介绍
LSM 树(Log-Structured-Merge-Tree) 日志结构合并树由 Patrick O’Neil 等人在论文《The Log-Structured Merge Tree》(www.cs.umb.edu/~poneil/lsm…LSM 树的核心特点是利用顺序写来提高写性能,代价就是会稍微降低读性能(读放大),写入量增大(写放大)和占用空间增大(空间放大)。原创 2023-01-11 15:02:41 · 671 阅读 · 0 评论 -
高性能网关基石——OpenResty
OpenResty 通过实现 ngx_lua 和 stream_lua 等 Nginx 模块,把 Lua/LuaJIT 完美地整合进了 Nginx,从而让我们能够在 Nginx 内部里嵌入 Lua 脚本,用 Lua 语言来实现复杂的 HTTP/TCP/UDP 业务逻辑,同时依然保持着高度的并发服务能力。这边推荐使用 xxx_by_lua_file,它彻底分离了配置文件与业务代码,让两者可以独立部署,而且文件形式也让我们更容易以模块的方式管理组织 Lua 程序。原创 2023-01-04 14:59:19 · 924 阅读 · 0 评论 -
说透IO多路复用模型
在说IO多路复用模型之前,我们先来大致了解下Linux文件系统。在Linux系统中,不论是你的鼠标,键盘,还是打印机,甚至于连接到本机的socket client端,都是以文件描述符的形式存在于系统中,诸如此类,等等等等,所以可以这么说,一切皆文件。来看一下系统定义的文件描述符说明:从上面的列表可以看到,文件描述符0,1,2都已经被系统占用了,当系统启动的时候,这三个描述符就存在了。其中0代表标准输入,1代表标准输出,2代表错误输出。当我们创建新的文件描述符的时候,就会在2的基础上进行递增。原创 2022-12-29 15:31:44 · 887 阅读 · 0 评论 -
内网穿透你真的了解吗?
本文所介绍的内网穿透技术相关的实现方式其实在我们的日常开发生活中有更多的使用场景,当我们深入了解了当前 IP 地址以及内外网的实现方式后,我们不难发现,当我们将内网穿透的图片稍加修改后就成为了我们常用的另一种功能的实现方式(VPN实现原理):原文作者:内网穿透你真的了解吗?- 掘金。原创 2022-12-28 15:44:18 · 32985 阅读 · 16 评论 -
Redis架构演变之主从、Sentinel哨兵、Cluster(通信、分片、路由等机制)
(1). 客户端分片方案A. 哈希取模:hash(key)% N,hash代表一种散列算法,N代表redis服务器的数量。这种算法实现起来非常简单,但是缺点也是非常明显的,当服务器数量N增加或者减少的时候,原先的缓存数据定位几乎失效,缓存数据定位失效意味着要到数据库重新查询,这对于高并发的系统来说是致命的。B. 一致性哈希算法:将key和server都进行hash,分配在闭环上,采用临近原则,key 找 离它最近的server节点进行存储。原创 2022-12-22 15:09:43 · 462 阅读 · 0 评论 -
数据存储,消息队列的高可用保障
理解好RabbitMQ 中 Broker 存储的组成要素 CommitLog,ConsumeQueue,IndexFile。当 Broker 收到消息存储请求时,通过调用 CommitLog 对应的 MappedFile,把消息写入MappedFile的MeppedByteBuffer(内存映射)。原创 2022-12-20 14:49:50 · 194 阅读 · 0 评论 -
性能优化-内存泄漏、内存溢出、cpu占用高、死锁、栈溢出、FullGC频繁检测手段-总结与分享
含义:内层溢出通俗理解就是内存不够,程序要求的内存超出了系统所能分配的范围。危害:内存溢出错误会导致处理数据的任务失败,甚至会引发平台崩溃等严重后果。应用程序CPU使用率高,甚至超过100%死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。Java 里的 StackOverflowError。抛出这个错误表明应用程序因为深递归导致栈被耗尽了。原创 2022-12-17 14:53:14 · 1741 阅读 · 1 评论 -
介绍四大并发集合类并结合单例模式下的队列来说明线程安全和非安全的场景及补充性能调优问题。
背景:我们目前使用的所有集合都是线程不安全的。:就是利用线程槽来分摊Bag中的所有数据,链表的头插法,0代表移除最后一个插入的值.(等价于同步中的List):线程安全的Stack是使用Interlocked来实现线程安全, 而没有使用内核锁.(等价于同步中的数组): 队列的模式,先进先出(等价于同步中的队列): 字典的模式(等价于同步中的字典)以上四种安全的并发集合类,也可以采用同步版本+Lock锁(或其它锁)来实现。原创 2022-12-16 15:05:46 · 197 阅读 · 0 评论 -
socket是并发安全的吗?
1. 多线程并发读/写同一个TCP socket是线程安全的,因为TCP socket的读/写操作都上锁了。虽然线程安全,但依然不建议你这么做,因为TCP本身是基于数据流的协议,一份完整的消息数据可能会分开多次去写/读,内核的锁只保证单次读/写socket是线程安全,锁的粒度并不覆盖整个完整消息。因此建议用一个线程去读/写TCP socket。2. 多线程并发读/写同一个UDP socket也是线程安全的,因为UDP socket的读/写操作也都上锁了。原创 2022-12-15 16:23:03 · 283 阅读 · 0 评论 -
时间复杂度和空间复杂度
算法,即解决问题的方法。同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的。就比如要拧一个螺母,使用扳手还是钳子是有区别的,虽然使用钳子也能拧螺母,但是没有扳手好用。“条条大路通罗马”,解决问题的算法有多种,这就需要判断哪个算法“更好”。原创 2022-12-12 15:13:00 · 184 阅读 · 0 评论 -
线性表→顺序表→链表 逐个击破
顺序表,全名"顺序存储结构",是线性表的一种。我们知道线性表是用来存储逻辑关系为 "一对一" 的数据,顺表也不例外。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如下图:由此我们可以得出,将“具有 '一对一' 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组。原创 2022-12-10 14:14:29 · 591 阅读 · 0 评论 -
Redis 为什么这么快,你知道 I/O 多路复用吗?
现在,我们知道啦,Redis 为什么快了吧。Redis 单线程是指在网络 I/O 和 键值的读写操作是有一个线程来完成的,采用单线程的好处是避免了多线程并发需要竞争获取锁。单线程之所以性能高效是因为其选择了 I/O 多路复用模型。搞懂了 select/epoll 这这些,慢慢会发现自己会逐渐比身边的伙伴优秀一些。原文链接:https://juejin.cn/post/7170712250880606221。原创 2022-12-09 14:38:58 · 203 阅读 · 0 评论 -
Redis缓存雪崩、击穿、穿透、双写一致性、并发竞争、热点key重建优化、BigKey的优化 等解决方案
在Redis中,一个字符串最大512MB,一个二级数据结构(例如hash、list、set、zset)可以存储大约40亿个(2^32-1)个元素,但实际中如果下面两种情况,我就会认为它是bigkey。(1). 字符串类型:它的big体现在单个value值很大,一般认为超过10KB就是bigkey。(2). 非字符串类型:哈希、列表、集合、有序集合,它们的big体现在元素个数太多。一般来说,string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。原创 2022-12-08 14:49:48 · 872 阅读 · 1 评论 -
Redis数据持久化机制(备份恢复)、缓存淘汰策略、主从同步原理、常见规范与优化详解
Redis 提供了 RDB 和 AOF 两种持久化方式,默认开启的是RDB,如果需要AOF,需要手动修改配置文件进行开启。 RDB:是一种对Redis存在内存中的数据周期性的持久化机制,将内存中的数据以快照的形式硬盘,实质上是fork了一个子进程在执行数据存储,采用的是二进制压缩的存储模式。如图: AOF:是以文本日志的形式记录Redis的每一个写入、删除请求(查询请求不处理),它是以追加的方式(append-only)写入,没有磁盘寻址的开销,所以写入速度非常快(类似mysql的binlog)。如图:(原创 2022-12-07 15:20:59 · 537 阅读 · 0 评论 -
Redis事务、pub/sub、PipeLine-管道、benchmark性能测试详解
(1). 原子性一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 Redis的事务并不是我们传统意义上理解的事务,我们都知道 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会原创 2022-12-06 14:55:08 · 613 阅读 · 0 评论 -
Linux之基于Centos系统安装Redis、MySQL、Nginx
(1). 宿主机:centos 8.0(2). Redis源码:【压缩包: redis-5.0.0.tar.gz】 需要自行编译。 (PS:这个压缩包可以直接Centos系统中在线下载 或者去Redis官网先下载,然后copy到Centos系统中)下载地址: 官网:https://redis.io/ 中文版:http://www.redis.cn/注:Redis的安装需要下载源码,自行准备环境,进行编译安装。(3). gcc环境:redis是C语言开发的,安装redis需要先将官网下载的源码进行编译,编原创 2022-12-05 16:54:48 · 376 阅读 · 0 评论 -
Nginx动静分离、缓存配置、性能调优、集群配置
1个web程序:部署在7061端口,启动 【dotnet NginxWeb.dll --urls="http://*:7061" --ip="127.0.0.1" --port=7061】Nginx程序:监听7000端口 比如单独启动部署在7061端口下的web程序,进行访问,我们会发现,除了请求的加载,还有很多静态 css、js、图片等资源的加载,这些资源的加载也是占服务器带宽的,假设带宽为1m,几个大图片直接就占满了。所以这里引入动静分离,将静态资源单独隔离出来,不占据主服务器的带宽,同时也有利于静态原创 2022-12-03 14:53:12 · 355 阅读 · 0 评论 -
Redis之String类型和Hash类型的介绍和案例应用
典型的Key-Value集合,如果要存实体,需要序列化成字符串,获取的时候需要反序列化一下。原创 2022-12-02 14:49:55 · 378 阅读 · 0 评论 -
MySQL索引的底层数据结构原理剖析(二叉树、 红黑树、Hash、B-Tree、B+Tree)
我们平时所说的:聚集索引(主键索引),次要索引,覆盖索引,复合索引,前缀索引,唯一索引在MySQL5.7和 8.0版本默认都是使用索引,除此之外还有。至于MySQL5.7之前版本,这里就不过多探究了。原创 2022-12-01 15:25:45 · 2438 阅读 · 1 评论 -
深究用户模式锁的使用场景(异变结构、互锁、旋转锁)
本章节,将结合多线程来介绍锁机制, 那么问题来了,什么是锁呢?为什么需要锁?为什么要结合多线程来介绍锁呢?锁的使用场景又是什么呢?DotNet中又有哪些锁呢?在接下来的几个章节中,将陆续解答这些问题。PS:多个线程对一个共享资源进行使用的时候,会出问题, 比如实际的业务场景,入库和出库操作同时进行,库存量就会存在并发问题。所以锁就是用来解决多线程资源竞用的问题。原创 2022-11-30 15:13:15 · 204 阅读 · 0 评论 -
从多个角度分析顺序表和链表区别和特点
顺序表和链表由于存储结构上的差异,导致他们有不同的特点,从而适用于不同的场景。虽然他们都属于线性表,但他们的存储结构有着本质的不同:1. 线性表存储数据,需要,然后将数据按照次序逐一存储,数据之间紧密贴合,不留一丝空隙, 如下图:2. 链表的存储方式与顺序表截然相反,原创 2022-11-29 14:55:41 · 553 阅读 · 0 评论 -
链表剖析及自己手撸“单链表“实现基本操作(初始化、增、删、改等)
存储数据元素时,除了存储数据元素本身的信息外,还有一个指针,指向他的后继节点,最后一个元素的指针不指向任何元素。:在单链表的基础上加一个前驱指针,指向前一个元素,是链表可以双向查找,这种结构成为双链表。:将链表最后一个节点的指针指向第一个节点,这样就形成了一个环,这种数据结构叫做单向循环列表.另外还有双向循环列表.原创 2022-11-28 16:36:08 · 423 阅读 · 0 评论 -
linux常用服务配置、网络配置 和 基于FTP的上传和下载的几种方式
一. 网络服务配置1. 主机名配置 hostname: 查看主机名 hostname xxx: 修改主机名(重启后无效)PS: 如果想要永久生效,可以修改/etc/sysconfig/network文件2. 静态IP的配置(1). 查看ip地址 : ifconfig原创 2022-11-26 14:42:45 · 957 阅读 · 0 评论 -
ThreadPool的线程开启、线程等待、线程池的设置、定时功能
ThreadPool简介:ThreadPool是一个线程池,当你需要开启n个线程时候,只需把这个指令抛给线程池,它将自动分配线程进行处理,它诞生于.Net 2.0时代。ThreadPool与Thread的区别:①:Thread每开启一个异步任务,就需要使用一个Thread,具有专一性,即使Thread已经死掉,仍然需要占用资源。②:ThreadPool能实现n个线程处理n+m个异步任务,且没有死线程,默认都是初始化的。原创 2022-11-25 14:03:46 · 672 阅读 · 0 评论 -
Nginx负载均衡配置、限流配置、Https配置详解
通过proxy_pass 可以把请求代理至后端服务,但是为了实现更高的负载及性能, 我们的后端服务通常是多个, 这个是时候可以通过upstream 模块实现负载均衡。原创 2022-11-24 15:17:31 · 5889 阅读 · 0 评论