- 博客(58)
- 收藏
- 关注
原创 匿名函数lambda
1. 如果捕获列表为[&],则表示所有的外部变量都按引用传递给lambda使用;2. 如果捕获列表为[=],则表示所有的外部变量都按值传递给lambda使用;3. 匿名函数构建的时候对于按值传递的捕获列表,会立即将当前可以取到的值拷贝一份作为常数,然 后将该常数作为参数传递。Lambda捕获列表总结[]空捕获列表,Lambda不能使用所在函数中的变量。[names]names是一个逗号分隔的名字列表,这些名字都是Lambda所在函数的局部 变量。
2025-12-20 17:37:40
675
原创 右值引用和移动语义
可以从2个角度判断:左值可以取地址、位于等号左边;而右值没法取地址,位于等号右边。int a = 6;a可以通过 & 取地址,位于等号左边,所以a是左值。6位于等号右边,6没法通过 & 取地址,所以6是个右值。int a_;A a = A();同样的,a可以通过 & 取地址,位于等号左边,所以a是左值。A()是个临时值,没法通过 & 取地址,位于等号右边,所以A()是个右值。
2025-12-17 20:57:17
786
原创 1.2 互斥量
下面以 std::mutex 为例介绍 C++11 中的互斥量用法。std::mutex 是C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即不支持递归地 对 std::mutex 对象上锁,而 std::recursive_lock 则可以递归地对互斥量对象上锁。lock_guard1.std::lock_guard 在构造函数中进行加锁,析构函数中进行解锁。2.锁在多线程编程中,使用较多,因此c++11提供了lock_guard模板类;
2025-12-11 23:10:19
576
原创 1.3.1 智能指针
智能指针主要解决以下问题:1. 内存泄漏:内存手动释放,使用智能指针可以自动释放 malloc free;new delete2. 共享所有权指针的传播和释放,比如多线程使用同一个对象时析构问题C++里面的四个智能指针:auto_ptr,shared_ptr,unique_ptr, weak_ptr 其中后三个是C++11支持,并且 第一个已经被C++11弃用。几个指针的特点:unique_ptr独占对象的所有权,由于没有引用计数,因此性能较好。
2025-12-10 23:59:45
969
原创 1.2.2结构型设计模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。——《设计 模式》GoF为什么要有工厂模式而不直接使用new?除了new还有很复杂的构造流程。解决了什么问题?稳定点:创建同类对象的接口,对象创建接口;同类对象有一个相同的职责,功能接口。变化点:创建对象的扩展设计原则:最小知道原则;面向接口编程;提供一个接口,让该接口负责创建一系列“相关或者相互依赖的 对象”,无需指定它们具体的类。——《设计模式》GoF解决了什么问题?
2025-12-07 00:10:05
947
原创 1.2.1创建型设计模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。——《 设计模式》 GoF稳定点:算法的骨架变化点:子流程需要变化代码结构:基类中有骨架流程接口;所有子流程对子类开放并且是虚函数;多态使用方式。定义对象间的一种一对多(变化)的依赖关系,以便当一个对 象(Subject)的状态发生改变时,所有依赖于它的对象都得到通 知并自动更新。——《 设计模式》 GoF。
2025-12-04 23:41:44
981
原创 1.3海量数据去重的Hash与BloomFilter
根据 key 计算 key 在表中的位置的数据结构;是 key 和其所在 存储地址的映射关系;注意:散列表的节点中 kv 是存储在一起的;
2025-12-03 23:27:01
947
原创 1.2磁盘存储链式的B树与B+树
B树是一种自平衡的多路查找树,它将数据存储在节点中并按顺序排列。B树的每个节点可以包含多个子节点和多个元素,因此它在存储大量数据时非常高效。
2025-12-01 20:52:18
825
原创 1.1-随处可见的红黑树
红黑树(Red-Black Tree)是一种自平衡的二叉搜索树(Binary Search Tree,BST),它通过规定一系列的约束和操作来保持树的平衡性,从而确保查找、插入和删除操作的时间复杂度始终保持在 O(log n) 级别。5、对每个结点,从该结点到其子孙结点的所有路径上的 包含相同数目的黑结点。父结点是祖父结点的左子树的情况 2. 叔结点是黑色的,而且当前结点是右孩子。父结点是祖父结点的左子树的情况 3. 叔结点是黑色的,而且当前结点是左孩子。4、 如果一个结点是红的,则它的两个儿子都是黑的。
2025-12-01 16:48:15
355
原创 10.2.6 TrinityCore 战场模块设计
采用模板方法封装战场逻辑。基类抽象算法(框架)骨架,通过子类复写骨架子流程来实现战场的 变化。魔兽世界中的战歌峡谷是一个10v10的夺旗型战场,具体的规则如下:1. 战场目标: 玩家的主要目标是夺取对方的旗帜并将其带回自己的基地三次。先达到这一目标的阵营将获得 胜利。2. 如何进入: 10级以上的玩家可以通过各大主城内的战争大师排队进入战歌峡谷。3. 等级分段: 战歌峡谷设有不同的等级阶段,不同等级的玩家会被分配到相应的阶段进行匹配,具体分段如 下: 10-19级 20-29级 30-39级 40-49级
2025-10-22 17:43:43
233
原创 10.2.5 TrinityCore AI 模块设计
在游戏的世界里,那些诸如 NPC(非玩家角色)、怪物等各类游戏对象,倘若能被玩家真切地感 知到具备一定的智能,进而让玩家在游戏过程中的体验更具沉浸感,同时还增添了挑战性,那么这 些内容所依托的便是游戏中的 AI 技术了。游戏中所呈现出来的 AI 通常属于弱 AI 的范畴。举例来说,当玩家与 NPC 进行交互时,依据玩家 所做出的不同选项,NPC 能够相应地展开不同的对话分支,仿佛有着自己的思考逻辑一般。
2025-10-22 09:16:17
804
原创 10.2.4 TrinityCore 技能模块实现
一般在项目 DEMO 阶段,战斗系统就要开始搭建,但起步阶段又不可能就把所有的技能效 果规划好,尤其是内容游戏,你永远不知道战斗策划下一个“奇怪”创意是什么。目的是减少开发成本。比如两个A、B技能,技能效果都是造成减速,只是触发条件不 同,这时候无需做个全新的减速技能,只要新增触发条件类型即可。聪明的老师们已经发现了,这种思 路其实是将一个技能拆分成多个模块,只实现缺失的模块,然后和已有的其他模块快速拼装成一个新的 技能。
2025-10-21 11:23:54
905
原创 10.2.3 TrinityCore 网络模块封装
完成端口不是指物理上的端口,也不是指网络中的端口,而是指操作系统所提供的一种机制。这种机制是操作系统提供一种高效处理 io 操作结果的通知机制。总之,完成端口是一种实现高效 异步 io 的机制。
2025-10-16 17:44:32
792
原创 10.2.2 TrinityCore 中基础组件的应用
定时器由两个部分构成。容器和驱动方式。TrinityCore 中基于 multimap 封装实现了两种类型的定时器模块:EventProcessor 和 TaskScheduler。
2025-10-08 17:00:59
821
原创 10.2.1 TrinityCore
Secure Remote Password (安全远程密码)。使用 SRP 协议的双端可以在不传送明文密码的情况下 安全验证。通过这种做法可以避免密码在传输过程中被劫持。
2025-10-07 17:25:57
178
原创 10.3.2 Fireware内核空间架构实现
static bool check_port_rule(__ul6 port, struct port_rule rule);static bool check_ip_rule(__be32 ip, struct ip_rule rule);static bool check_rule_match(struct packet_info packet, struct firewall_rule rule);static bool check_permission(void);unsigned int fire
2025-10-06 16:55:00
332
原创 11.2.4 聊天记录拉取设计与实现
发送端:比如用户名:小鸭子米奇,用户id:5发送的消息,此时会携带cookie经过服务端处理后转发给其他接收者的消息,此时消息类型type 变为“serverMessages”,message字段增 加了消息id,并增加了用户信息 "user": { "id": 5, "username": "小鸭子米奇"},,以及时间戳timestamp。
2025-09-19 23:09:43
874
原创 11.2.3 固定话题聊天实现
1. 握手: 客户端发送 HTTP 升级请求。服务器响应 101 状态码,完成握手。2. 数据传输: 客户端和服务器通过数据帧(Text/Binary Frame)传输数据。3. 心跳检测: 通过 Ping/Pong 帧维持连接。4. 关闭连接: 通过 Close Frame 优雅关闭连接。
2025-09-18 21:54:28
948
原创 11.2.2 注册登录接口设计与实现
RESTful API 是应用程序接口 (API) 的一种架构风格,它使用 HTTP 请求来访问和使用数据。该数据可用于 GET、PUT、POST 和 DELETE 数据类型,这些数据类型是指有关资源的操作的读取、更新、创建和删除。RESTful API(也称为 RESTful Web 服务或 REST API)基于表示状态传输 (REST),它是一种架构风格和经常 用于 Web 服务开发的通信方法。
2025-09-17 20:26:24
765
原创 11.2.1.项目整体架构和技术选型及部署
11-02-0时间戳部分必须大于 Stream 中已有的最大时间戳。序列号部分必须大于同一时间戳内的最大序列号。Redis Stream 的消息 ID 格式为<毫秒时间戳>- <序列号>- ,用于唯一标识和排序消息。时间戳部分表示消息 的创建时间,序列号部分用于区分同一毫秒内的多条消息。
2025-09-07 16:54:50
995
原创 11.1.7 cpp客户端上传测试和文件引用计数测试
基于以上原因,这个md5这个字段改为完整的唯一索引。修改user_file_list,添加 user , md5 , file_name 唯一约束将KEY idx_user_md5_file_name ( user , md5 , file_name ) 改为UNIQUE KEY idx_user_md5_file_name ( user , md5 , file_name ),主要是将其改成UNIQUE 唯一索引,即是同一个 人,不允许有多个文件名同样,并且文件内容一样的的多条记录。
2025-09-05 20:35:25
955
原创 11.1.6 产品上云和性能测试
fastdfs本身不会去检测文件内容是否重复(这里只是简单拓展)。storage.conf 配置= 0这里需要依赖FastDHT(也是fastdfs作者写的组件)去处理,本质而言就是对上传的文件内容进行hash计算 或者md5计算出来唯一值,并保存,然后每次上传文件统计出来的唯一值都去存储的数据里面查找,如果有同样的则认为文件重复。但这种方式导致。
2025-09-02 11:23:37
769
原创 11.1.3 完善注册登录,实现文件上传和展示
1. 涉及的数据库表单:user_info2. 引用MySQL线程池,Redis线程池3. 完善注册功能4. 完善登录功能。
2025-08-22 17:29:25
651
原创 11.1.2 文件传输和接口设计
了,当外部调用 poll 方法的时候,该方法底层其实是通过 epoll_wait 获取 这个事件监听器上发生事件的fd及其对应发生的事件,我们知道每个fd都是由一个Channel封装的,通过哈希表 channels_ 可以根据fd找到封装这个fd的Channel。理论上MD5是不可逆的,而且MD5本来也不是作加密使用,而是用来校验数据的完整性,只是因为其不可逆 且稳定、快速的特点,被广泛用于对明文密码的加密。Token 的中文有人翻译成 “令牌”,意思就是,你拿着这个令牌,才能过一些关卡。
2025-08-21 17:37:44
857
原创 11.1.1 FastDFS架构分析
主要的功能包括:文件存储,同步和访问,。FastDFS非常适用于基于文 件服务的站点。FastDFS由(storage server)和(client)三个部分 组成,主要解决海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的 在线服务,例如图片分享和视频分享网站。FastDFS架构如下所示:FastDFS服务有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)
2025-08-20 16:41:31
832
原创 8.1.2 TiDB存储引擎的原理
TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据 库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布 式数据库产品,具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数据库、兼容 MySQL 5.7 协议和 MySQL 生态等重要特性。
2025-08-01 19:08:53
747
原创 8.1.1 不一样的kv存储RocksDB的使用场景
RocksDB 是 Facebook 的一个实验项目,目的是希望能开发一 套能在服务器压力下,真正发挥高速存储硬件性能的高效数据 库系统。这是一个 C++ 库,允许存储任意长度二进制 KV 数据。支持原子读写操作。RocksDB 依靠大量灵活的配置,使之能针对不同的生产环境进 行调优,包括直接使用内存,使用 Flash,使用硬盘或者 HDFS。支持使用不同的压缩算法,并且有一套完整的工具供生 产和调试使用。RocksDB 大量复用了 levedb 的代码,并且还借鉴了许多 HBase 的设计理念。
2025-07-31 19:38:10
1091
原创 7.3.3 文件系统组件
通常一个完整的Linux系统由数千到数百万个文件组成,文件中存储了程序、数据和各种信息。层次化的目录结构用于对文件进行编排和分组。文件系统类型一般可以分为 3 种:基于磁盘的文件系统( Disk-based Filesystem)虚拟文件系统( Virtual Filesystem)网络文件系统( Network Filesystem)a、inode。
2025-07-25 22:03:20
934
原创 7.3.2 内核内存管理运行机制
1、内存管理架构内存管理子系统架构可以分为:用户空间、内核空间及硬件部分3个层面,具体结构如下所示:a、用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源。b、内核空间:内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。c、硬件:处理器包含一个内存管理单元(Memory Management Uint,MMU)的部件,负责把虚拟地址转换为物理地址。
2025-07-24 21:41:17
688
原创 7.3.1 进程调度机制那些事儿
1、进程有两种特殊形式:没有用户虚拟地址空间的进程叫内核线程,共享用户虚拟地址空间的进程叫作用户线程。共享同一个用户虚拟地址空间的所有用户线程叫线程组。
2025-07-23 19:09:19
853
原创 内核bpf的实现原理
bpftrace能帮我们干什么?1、统计 tcp连接的生命时长、2、统计mysql执行一条sql语句的时间3、统计redis执行命令的时间、 4、对文件进行一次读或者写的时间。常用命令:}'}'}'}'}'}'bpftrace实现:获取到每一个连接的源IP、源端口、目的ip、目的端口。执行方式。
2025-07-21 13:50:52
348
原创 5.6.3 ZeroMQ无锁队列
这中机制使用了一种被称之为CAS(比较和交换)的特殊操作,这个特殊操作是一种特殊的指 令,它可以原子的完成以下操作:它需要3个操作数m,A,B,其中m是一个内存地址,操作将m指向的内存 中的内容与A比较,如果相等则将B写入到m指向的内存中并返回true,如果不相等则什么也不做返回false。back_chunk需要chunk有元素插入的时候才指向对应的chunk。整个chunk的元素都被取出队列才去回收chunk,而且是把最后回收的chunk保存到spare_chunk,然后释放 之前保存的chunk。
2025-07-09 16:48:42
1005
原创 5.6.2、ZeroMQ源码分析
简单来说,就是对象A将命令发出到目标对象B所在线程绑定的mailbox,然后poller监听收到命令的信号, 以通知线程处理命令,线程将命令交给对象B如果一个类想要使用线程收发命令的功能,那么这个类就必须继承自object_t。源码中可以看到,object_t 定义了一个uint32_t变量tid,tid(thread id)表示该object_t对象所在的线程,即应该使用哪个线程的 mailbox。
2025-07-08 17:41:55
660
原创 5.6.1 ZeroMQ
1. io_thread 创建时向 poller 注册自己的mailbox fd,以及 this 指针,用于事件回调。2. 在 ctx_t 中,通过 slots [i] = io_thread->get_mailbox ();注册I/O线程的邮箱。然后通过 slots [tid_]->send (command_);可以向该邮箱发送指令。3. 上述 send() 调用的是mailbox 的 send() ,他会向管道 cpipe 写入数据,并发送信号 signaler- >send()。
2025-07-08 16:39:47
886
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅