- 博客(27)
- 收藏
- 关注
原创 关系型数据库MYSQL(续)
比如在有索引的用户表中,某条记录索引值为 5,临键锁会锁定小于等于 5 的范围,既保护该记录,也防止其他事务在其前面间隙插入数据,增强数据一致性和隔离性。:即写锁,一个记录被加 X 锁后,其他事务不能再对其加任何锁,加 X 锁事务可读写记录,保证写操作原子性,防止其他事务干扰。例如:一个表 的姓名是唯一键,如果一个事务对姓名进行修改,但是在事务 提交或事务回滚后,表中的姓名变得不唯一了,这样就破坏了。:也叫读锁,多个事务可同时对同一记录加 S 锁,用于并发读场景,加锁事务能读取记录。
2025-04-18 11:19:33
583
原创 探索关系型数据库 MySQL
按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合;
2025-04-17 19:33:35
1107
原创 高性能内存kv数据库Redis(续)
系统调用创建一个子进程。从节点接收并执行主节点发送的写操作后,也会更新自己的偏移量。在网络出现问题后,replica 保存有同步位置(通过复制偏移量 ),当网络恢复时,可依据该位置继续从 master 拉取数据,实现断点续传式的数据同步。主节点将自身的所有数据发送给从节点,从节点接收并加载这些数据,以此来和主节点数据保持一致。Redis 集群中主节点宕机后,从节点经故障检测与选举成为新主节点,丢弃旧缓存、更新集群状态,通过持久化恢复及后续复制同步数据,保障数据一致性,也可手动触发从节点替换主节点。
2025-04-15 11:34:19
881
原创 高性能内存kv数据库Redis
事务:用户定义一系列数据库操作,这些操作视为一个完整的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。MULTI开启事务,事务执行过程中,单个命令是入队列操作,直到调用EXEC才会一起执行;乐观锁实现,所以失败需要重试,增加业务逻辑的复杂度;acid①原子性②一致性③隔离性④持久性不能有耗时的操作:cpu运算和阻塞的io对于redis而言会影响性能。
2025-04-14 23:40:22
1696
原创 protobuf的应用
我们通过上述编译代码可以生成.pb.cc和.pb.h的文件 提供给我们c/c++开发语言使用使用。我们版本选择proto3 引用的是谷歌的protobuf包。我们可以选择java和C#的版本来使用protobuf包。类似于C++创建类的方法。
2025-04-11 20:58:03
256
原创 如何深入理解protobuf
用于定义客户端和服务器之间交互的接口规范,独立于具体编程语言,清晰描述服务提供的方法、参数及返回值等,像 gRPC 使用的.proto 文件就是典型的 IDL 文件。
2025-04-11 20:24:55
979
原创 spdlog高速日志系统
①.spdlog是一款高效的C++日志库,特别适用于使用C++和需要引入日志库的项目。②.spdlog以极高的性能和零成本的抽象而著称,通过模板和内联函数实现零成本的抽象。③.spdlog支持异步和同步的日志输出和记录日志的作用:追踪程序运行的状态,出现问题提供现场运行信息,分析性能瓶颈和潜在的系统故障spdlog提供多种日志级别,如info、debug、trace、error、critical等。public://formatter标识绑定。
2025-04-10 16:09:18
392
原创 分布式锁阿
①分布式锁是在分布式场景中使用的锁,用于保证数据的一致性②分布式系统由多个节点组成,节点可能分布在不同机器和网环境当中③分布式锁的概念和互斥锁几乎一样,使用的环境是在分布式场景之中④分布式的应用通常在raft算法和rpc框架中经常出现。
2025-04-09 22:02:34
270
原创 内存泄露 手写内存泄露检测工具
①.内存泄露在面试和工作中常见,尤其是C和C++项目。②.内存泄露的核心原因是调用了malloc但没有调用free,导致堆内存无法被释放。③.内存泄露的判断方法和泄露位置的定位是解决内存泄露的关键。#define _GNU_SOURCE //这个b玩意要放所有头文件最上面#if 0if(flag){// 使用 snprintf 将文件路径格式化到 buff 中,//文件路径包括内存地址(p),并将该内存地址存储在“./mem/”目录下,以.p作为扩展名if(!fp){
2025-04-08 15:54:35
790
原创 死锁 手撕死锁检测工具
for(i;i<MAX;for(i;i<MAX;return -1;for(i;i<MAX;return -1;#if 1//有向图uint64 id;int num;return tex;int i = 0。
2025-04-08 15:23:48
1508
1
原创 定时器(续):时间轮
时间轮(Time Wheel)是一种用于高效处理定时任务的数据结构,它可以有效地解决大量定时任务的调度问题,特别是在高并发的情况下。时间轮通常被应用于需要周期性、定时触发任务的系统中,例如缓存过期机制、网络请求重试、定时任务调度等场景。
2025-04-07 11:41:47
258
原创 网络缓冲区
用户态网络缓冲区通过减少内核与用户空间之间的交互、避免内存复制、提高数据处理效率,成为高性能网络应用中的关键技术。它被广泛应用于低延迟、高吞吐量的场景,如高频交易、网络虚拟化和流媒体等。不过,使用用户态网络缓冲区也带来了一些挑战,如内存管理和安全性问题,需要开发人员在设计时谨慎处理。
2025-04-07 11:37:05
207
原创 无锁队列No lock
①lock-free(至少有一个线程往前走)系统作为一个整体无论如何都向前移动,不能保证每个线程的进度(可能出现线程饿死的情况)。通常使用compare_exchange原语实现....可以有循环,但类似compare_exchange实现的自旋锁不行②wait-free(每个线程都必须往前走)考虑到其他线程争用,阻塞等情况下,每个线程向前移动,每个操作在有限步骤中执行。通常使用exchange,fetch_add等原语实现,并且不包含可能被其他线程影响的循环③blocking。
2025-04-07 11:24:03
448
原创 原子操作(cpp atomic)
只有我们要极致提升性能的时候才有考虑原子操作进行提升性能 ,在绝大部分时候我们只需要使用互斥锁和条件变量即可满足服务器开发的需求。
2025-04-07 10:14:54
971
原创 线程池/内存池/mysql连接池
维持和管理固定数量线程的结构,用于解决资源频繁创建和销毁的问题。固定数量的线程、队列、任务状态管理。避免频繁创建和销毁线程,管理线程状态,提高系统资源利用率。内存池是在程序运行开始时,预先分配一块较大的内存空间作为 “池”,当程序需要申请内存时,直接从这个池中分配小块内存给用户,而不是每次都向操作系统申请;当用户释放内存时,也不是直接归还给操作系统,而是将其放回内存池,以便后续再次使用。①.介绍了课程内容和目标,重点讲解了池化技术的概念及其重要性。
2025-04-06 22:09:44
595
原创 定时器的实现方案:红黑树、最小堆与时间轮
①.定时器定义组织大量定时任务模块,项目底层基础模块。②.定时器应用解决延时处理任务问题,如客户端与服务端连接检测。包括keep alive和应用层发送心跳包,区别在于检测范围和网络通畅性。技能冷却和倒计时,需要高性能定时器。
2025-04-06 21:24:29
942
原创 分布式KV存储的实现
KV 存储的核心是将数据抽象为键值对(Key-Value Pair)。键作为唯一标识符,值则承载任意格式的数据。这种设计摒弃了传统关系型数据库的复杂表结构,将数据存储简化为 “键→值” 的映射,从而实现了 O (1) 级别的读写效率。(如 LevelDB):数据写入磁盘,利用 LSM-Tree 结构优化读写性能。(如 Redis):将数据常驻内存,通过异步持久化保证可靠性。:将数据分散到多个节点,避免单点瓶颈。:每个分片保留多个副本,确保高可用性。
2025-04-01 21:00:03
127
原创 io_uring:高性能异步 I/O
操作通常用于在服务器端接受客户端的连接请求,当有新的客户端连接时,该操作会返回一个新的套接字描述符,用于与客户端进行通信。实例,包含了提交队列(Submission Queue,SQ)和完成队列(Completion Queue,CQ)。库中的一个关键操作,用于批量从完成队列(Completion Queue, CQ)中获取已完成的 I/O 操作条目。队列的各种行为和特性,例如提交队列(SQ)和完成队列(CQ)的条目数量、标志位、线程相关参数等。
2025-03-28 19:11:53
851
原创 浅入高性能网络框架DPDK
是一个高性能数据包处理开发框架,专为网络设备、数据中心和云计算环境设计。它通过绕过内核协议栈、优化硬件访问和提供高效数据结构,实现了低延迟、高吞吐量的数据包处理能力。核心特性用户空间驱动直接在用户空间操作物理网卡(通过 UIO 或 VFIO 技术),避免内核上下文切换和数据拷贝开销。支持轮询模式驱动(PMD),减少中断处理延迟。零拷贝与内存优化使用大页内存(Huge Pages)减少内存分页开销。通过环形缓冲区(Ring Buffer)实现无锁队列,降低线程间同步成本。多线程并行处理。
2025-03-26 23:45:28
1524
原创 深入浅出网络协议栈TCP/UDP/KCP/QUIC
发送方在未收到接收方确认(ACK)的情况下,可连续发送的数据量上限,通常以 “窗口大小” 表示。例如,TCP 中的滑动窗口允许发送方在等待 ACK 时持续发送多个数据包。
2025-03-21 23:27:01
1333
原创 服务器百万并发(基于reactor模式)
准备四台虚拟机 一台服务器配置高一些 三台客户机配置均衡配置 最后就是宿主机的性能比拼了。当我们用服务端对接客户端的时候遇到的第一个问题就是打开的文件过多 导致程序挂掉。本地端口范围,1024 到 65535,客户端常用动态端口。TCP 内存分配,分别是低、高、最大值,控制内存使用。:开启后,记录来源错误的 IP 包,1 表示启用。已建立 TCP 连接的跟踪超时时间,1200 秒。TCP 写缓冲区大小,默认、最小、最大值。TCP 读缓冲区,类似写缓冲区的三个值。系统全局最大打开文件数,控制资源。
2025-03-20 23:07:28
309
原创 Reactor 模式
int fd;int rlen;int wlen;定义一个 conn_item结构体 该结构体包含的成员分别有int fd :对应的文件描述符char rbuffer :接收客户端发送的数据并保存char wbuffer:发送给客户端的数据并保存三个函数指针分别为指向 accept_cb的函数指针accept_callback指向recv_cb的函数指针recv_callback指向send的函数指针send_callback。
2025-03-18 23:58:10
1475
原创 Linux 系统编程:文件、进程与线程的底层原理与实战优化
信号的最明显的特点是一次注册 永久生效信号这章节对我们最重要的是signal函数 以及 mask屏蔽集合 和 pending未决集合 需要我们牢牢掌握个人认为线程相比于进程最大的区别就是多个线程访问相同的共享资源 因此我们在用线程对各种区域的数据进行访问的时候 我们都需要加上锁来避免数据的污染 从而取得正确的结果。
2025-03-10 22:18:38
1021
原创 基于多线程的简单 TCP 服务器实现
在网络编程中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在实际应用场景中,我们经常需要实现一个 TCP 服务器来处理多个客户端的连接请求。本文将详细介绍如何使用 C 语言编写一个简单的基于多线程的 TCP 服务器,该服务器可以接收客户端发送的数据,并将数据原样返回给客户端。函数创建一个 IPv4 的 TCP 套接字,返回一个文件描述符。9.4连接成功 并发送消息到服务器 服务器接收数据。9.3用TCP/UDP助手进行远程连接。9.2查看端口号信息。
2025-02-27 13:32:18
475
1
原创 深入探究多线程并发中的同步机制:以 C 语言为例
多线程并发锁通过限制同一时刻对共享资源的访问线程数量,避免数据竞争和竞态条件,保障数据一致性,实现线程同步,保护临界区,从而简化多线程编程的复杂性 。
2025-02-24 18:30:26
567
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人