自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis相关命令详解及其原理

Redis 是 Remote Dictionary Service 的简称;即远程字典服务;Redis 是;

2025-08-26 17:48:50 824

原创 无锁队列的设计与实现

有锁队列:有所队列通过互斥锁或其他同步机制的保证线程安全,因为存在对临界变量的加锁和解锁,所以可能会发生阻塞,因此属于阻塞队列。无所队列:无所队列通过原子操作来实现线程安全,因为不需要加锁,因此属于非阻塞队列。

2025-08-25 17:31:29 677

原创 延时任务定时器的实现

使用IO 多路复用系统调用如select/poll/epoll最后一个参数,将定时器的触发时机与网络事件的触发时机相同,从而将定时器何时触发交给IO多路复用while (!i<nevent;i++) {// ... 处理网络事件// 处理定时事件// 网络事件和定时事件在不同线程中处理while (!

2025-08-19 10:06:00 306

原创 用户态网络缓冲区设计

在网络通信中,调用系统API收发数据实际上是从内核的缓冲区读取和发送,比如read/write,而数据何时收发到网络对端由内核协议决定。

2025-08-18 11:38:59 767

原创 原子操作及基于原子操作的shared_ptr实现

在多线程或并发编程中,对于某个原子操作,该操作要么完全执行,要么完全不执行,不会处于中间状态,其也中间状态不会被看到。

2025-08-17 17:32:36 834

原创 redis主从同步与对象模型

redis 的数据全部在内存中,如果突然宕机,数据就会全部丢失,因此需要持久化来保证 Redis 的 数据不会因为故障而丢失,redis 重启的时候可以重新加载持久化文件来恢复数据;

2025-08-16 18:42:16 924

原创 redis存储原理与对象模型

redis的所有命令处理都在同一个线程中完成。

2025-08-16 17:07:24 770

原创 reids事务、lua脚本与异步连接

对于多条命令,一次性发送,从而减少网络传输的时间。

2025-08-16 15:12:44 791

原创 mysql索引原理以及sql优化

一种有序的存储结构,能够按照单列或多列的值进行排序。

2025-08-15 22:46:19 1040

原创 mysql数据库相关概念

即创建表,修改表,删除表等操作的语句,如create、alter、drop视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。其内容由查询定义。基表:用来创建视图的表叫做基表;通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成;

2025-08-15 18:58:02 967

原创 mysql 缓存策略

在数据库中存在用户定义的一些热点数据,这些热点数据的读需求远远大于写需求,用户希望读取这些热点数据在被使用时,能够被快速获取,而内存的访问速度远远大于磁盘,因此热点数据需要缓存到内存中,但是内存空间是有限的,因此需要实现缓存策略。虽然mysql有自己的数据缓冲池,但这是和业务无关的,即其采用的缓存策略与用户需求不同,因此需要实现自己的缓存策略。

2025-08-14 16:09:41 701

原创 mysql 事务原理

mvcc,也就是多版本并发控制,是为了在读取数据时不加锁来提高读取效率和并发性的一种手段。

2025-08-13 17:06:58 1035

原创 基于线程池的mysql连接池实现

维持并管理一定数量数据库连接的池式结构。

2025-08-10 21:53:38 1098

原创 C++实现分布式场景下的分布式锁

一个分布式锁中应该存储3种信息,即:加锁的资源、当前锁所属对象唯一标识和当前锁的有效时间。//初始化//资源//对象//有效时间/*获取当前的系统时间*///system_clock为系统时间,可以被修改/*生成唯一标识符*//*添加锁的存储节点host:服务器ipport:服务器端口*/// 检查 redis 服务器是否已经存在//与redis服务器建立连接} else {//加入到vector中。

2025-08-08 17:34:19 321

原创 内存泄漏检测组件实现

栈上的内存分配和释放完全由编译器和程序运行时的调用栈机制控制,比如函数调用时,它的参数、返回地址和局部变量所需的内存被压入 (push)​​ 栈顶。函数结束时,这块内存被弹出 (pop)​​ 释放。因此栈内存不存在泄漏。但是堆内存是在程序运行时根据需求动态申请的(通过malloccallocnewalloc等),同时堆上对象的生命周期不由其创建时所在的作用域决定,它何时该被释放取决于程序逻辑和开发者正确的管理。因此,如果忘记释放申请的内存就会导致内存泄漏。

2025-08-07 18:05:14 572

原创 基于C语言的内存池的实现

于线程池类似,内存池是一个管理一段连续内存块的池式结构。

2025-08-02 19:54:32 389

原创 C++线程池实现

通过一个池式结构维持并管理一定数量的线程。

2025-08-02 11:15:30 972

原创 linux项目:kv存储引擎

本项目的目的是在已有实现的网络通信服务器的基础上,增加数据存储功能。最终实现的功能应该包括客户端能够通过特定的数据协议,向服务器进行增删改查数据,而服务器的数据存储,则是通过key-value的方式进行存储。

2025-07-25 19:45:06 1001

原创 基于iouring的tcp服务器

首先说一下我对于同步IO和异步IO的理解。同步IO:IO请求和IO操作是在同一个线程中完成的,即当在一个线程中触发了IO请求时,对应的IO操作也在该线程中完成。比如当前线程想要发送数据,那么这个发送数据的具体操作也要在该线程中进行。异步IO:IO请求和IO操作是在不同线程中完成的,即当在一个线程中触发了IO请求时,对应的IO操作在其他线程中完成。比如当前线程想要发送数据,那么这个发送数据的具体操作交给线程中进行。对于一个工作的epoll,它的工作流程是这样的:loop{获取有IO请求的fd;

2025-07-24 21:26:42 373

原创 基于setjmp、ucontext和汇编方法的函数切换

void makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...):该函数会修改ucp指向的任务,而对应的ucp用来保存对应任务的上下文环境,当下次再次切换到该任务时,会从上次切换的地方继续执行。setjmp虽然具有更好的平台兼容性,但是对于循环的跳转实现起来却较为复杂,比如对于上面的代码,如果想要再切换回func1,只能依靠判断setjmp的返回值,并且需要对代码进行大改。设置ucp指向的context为运行上下文,并开始执行。

2025-07-22 23:10:31 1021

原创 linux网络编程:TCP协议、POSIX网络API

为什么一定是3次,两次不行吗。首先,我们需要明白三次握手的目的是为了让双方知道对方已经准备好了。假设客户端不发送确认报文,那么服务器端就不知道客户端是否准备好(因为对于服务器端发送的确认报文,客户端可能没有接收到),如果服务器端此时直接发送数据,因为客户端还在等待确认报文,会忽略后续的报文,从而导致发送的数据无效。

2025-07-13 16:50:34 948

原创 linux网络编程基础:简单的httpserver

其中的recv_call_back和send_call_back为函数指针,因为不同的sockfd的函数操作可能不同,比如在server中一种sockfd是专门用来接收客户端的连接的,而另一种sockfd则是进行通信的,因此这两种不同的scokfd的recv_call_back显然也不同。http_respone中我们是静态的读取一张图片,然后基于http协议发送到客户端,需要注意的地方就是对于一张图片可能会多次读取,因此需要保存对应的文件fd和已经读取的数据大小,方便下次读写。并将当前fd置为可写。

2025-07-07 20:19:45 941

原创 linux网络编程基础:网络IO select/poll/epoll

通过以上三种方式,我们已经实现了一个服务器与多个服务器的连接,那么他们存在哪些缺点呢,首先,对于一请求一线程来说,每有一个客户端连接,就需要申请一个线程,这肯定是非常耗费资源的;而对于select方法和poll方法来说,对于一个fd,不管它有没有请求,我们都会去检查它,这在客户端较少时可能没什么影响,但如果客户端的数量非常庞大时,每一次的轮询,都会耗费海量的时间,主要原因就在于我们并不知道fd是否有请求,如果我们能够只处理有请求的fd,那么将会节省我们许多的时间。其次我们需要知道select是如何工作的,

2025-07-05 20:36:18 918

原创 解决笔记本外接显示器后无法设置内部显示器为独显的问题

若是不能直接设置,可以进入more settings里的configuration中进行设置。当没有外接显示器时我们可以通过nvidia控制面-管理显示模式 来自主选择集显还是独显。但是外接显示器后,nvidia控制面板就只剩外接显示器了,无法找到内置显示器。我的电脑是联想拯救者2023,所以是按F2,不同电脑可能不一样。此时可以在系统看到,内置显示器为集显,外置显示器为独显。可以看到现在无论是内置显示器还是外接显示器都是独显了。笔记本外接显示器后无法设置内部显示器为独显的问题。

2025-03-27 15:49:59 12136 1

空空如也

空空如也

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

TA关注的人

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