自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LangGraph持久化:从“记住这一轮对话“到“记住你是谁“

LangGraph的持久化能力分为线程级与跨会话两级。线程级持久化通过Checkpointer(如InMemorySaver或PostgresSaver)自动保存每步状态快照(Checkpoint),实现单次对话中断后恢复,支持状态回溯、重放与修改。跨会话持久化则借助Store(如InMemoryStore或PostgresStore)存储用户画像、偏好等长期数据,结合向量索引实现语义检索,使Agent能“记住你是谁”,支持个性化响应。二者协同,让AI应用具备真正意义上的记忆与连续性。

2026-09-13 15:03:51 255

原创 Redis进阶

Redis持久化与高可用架构解析 本文系统介绍了Redis的持久化机制和高可用架构方案。

2026-02-08 23:28:59 707

原创 Redis客户端

本文介绍了使用C++操作Redis的完整流程,重点讲解了redis-plus-plus库的安装和使用方法。主要内容包括:1. 环境搭建:安装hiredis和redis-plus-plus库;2. 基本操作:连接Redis服务器、ping测试、键值操作(get/set)和Optional类型处理;3. 五种数据类型的操作:字符串、列表、集合、哈希和有序集合的常用命令实现;4. 开发技巧:初始化列表和迭代器的使用、Optional类型处理等。文章通过大量代码示例展示了redis-plus-plus库的统一接口风

2026-02-08 13:14:21 646

原创 Redis基础知识介绍

这是一篇Redis入门知识文章

2026-01-27 23:43:36 819 1

原创 CMake

CMake作为C/C++项目的跨平台构建工具,解决了传统构建方式的痛点。文章介绍了CMake的优势、安装配置、基本使用流程和工程实践。

2026-01-18 21:41:40 635

原创 仿照muduo库实现一个高并发服务器

本项目实现了一个基于C++的高性能Reactor模式网络库,采用主从Reactor模型实现高并发TCP服务器

2025-12-20 12:02:55 903

原创 五种I/O模型与多路转接

阻塞式I/O是最传统、最简单的I/O模型。应用程序发起I/O调用后,进程会被挂起(阻塞),一直等待数据就绪且数据从内核拷贝到用户空间后才会返回,整个过程应用程序处于完全等待状态。(所有的套接字默认都是阻塞方式)这种I/O模型就像一个人去钓鱼然后一直盯着鱼竿看鱼儿是否上钩了。特点:编程简单、一个进程/线程只能处理一个连接、资源利用率低,CPU大量时间在等待。

2025-12-15 20:06:52 769

原创 网络编程套接字之UDP

本文介绍了基于UDP协议的网络编程基础知识与应用实现。主要内容包括:1)网络基础概念:IP地址和端口号的作用、UDP协议的无连接特性及数据报特点;2)套接字编程接口:socket创建、bind绑定等核心函数的使用方法;3)地址转换函数:inet_pton、inet_ntop等现代安全转换函数;4)实践应用:实现了一个简单的UDP服务器/客户端通信模型,并扩展为远端命令行工具和聊天室系统。其中,聊天室功能通过维护用户列表实现了消息广播和用户上线通知,展示了UDP在实际应用中的灵活性和高效性。文章还重点讨论了网

2025-09-23 11:26:09 1026 1

原创 生产者消费者模型

本文介绍了生产者消费者模型的原理与实现。该模型通过阻塞队列解耦生产者和消费者,利用互斥锁和条件变量实现线程同步。文章详细分析了基于阻塞队列的实现方案,解释了while循环防止虚假唤醒的重要性,并给出多线程示例。随后引入更高效的环形队列方案,通过信号量控制资源访问,实现生产消费并行。最后展示了多生产多消费场景下的环形队列实现,强调了信号量操作应在加锁前完成以提高并发性能。两种方案均有效解决了生产消费速率不匹配问题,为多线程编程提供了可靠同步机制。

2025-09-16 23:47:42 1067 5

原创 线程分离和线程同步互斥

本文主要介绍了线程分离、线程互斥和同步,阐明了锁的重要性和锁的使用场景。

2025-09-12 10:40:40 1005 7

原创 Linux认识线程和线程控制

回顾我们之前对进程的理解,我们认为“进程 = 内核数据结构 + 代码和数据”。站在内核的角度,进程是操作系统分配资源的基本单位,由PCB(进程控制块)、独立的虚拟地址空间、页表、被分配的物理内存页面以及属于该进程的一个或多个线程组成。(执行流也是资源)线程是进程内部的执行流资源!Linux实现线程的方法。

2025-09-09 10:54:26 800 5

原创 Linux之信号

Linux信号,通过生活中的信号引出什么是信号,然后介绍了信号是如何产生、如何被保存、如何被处理、如何被捕捉,同时就补充了一些其他小知识点。

2025-08-30 09:35:59 869 1

原创 Linux进程间通信之命名管道

本文介绍的是命名管道是什么、如何使用,并且比较了匿名管道和命名管道的区别。

2025-08-25 10:04:26 623 3

原创 Linux进程间通信之匿名管道

进程池是一种预先创建好一定数量的子进程,统一管理和调度的技术。主进程将任务分配给空闲的子进程,子进程处理完任务后返回结果并回到空闲状态,等待下一个任务。进程池可以避免频繁创建和销毁进程带来的性能开销,提高资源利用率。进程池内部通常也会用管道、消息队列、共享内存等 IPC 机制来实现任务分发和结果收集。std::cout << "lol 刷新日志" << std::endl;std::cout << "lol 更新野区,刷新出来野怪" << std::endl;

2025-08-22 11:54:01 852

原创 静态库和动态库

静态库和动态库是两种不同的代码共享方式。静态库在编译时直接链接到可执行文件中,而动态库在运行时才加载。动态库支持多进程共享,节省磁盘和内存空间。开发者通过生成头文件和库文件(.o目标文件)来提供功能接口。使用静态库需指定路径和库名(-I、-L、-l选项),动态库还需额外配置加载路径(如环境变量或系统目录)。动态库采用位置无关码(-fPIC)实现灵活加载,其共享特性通过写时拷贝机制保证线程安全。程序加载时通过虚拟地址到物理地址的映射完成指令执行。

2025-08-16 20:57:36 1026 3

原创 Linux基础IO

Linux文件IO

2025-08-13 12:13:03 495 3

原创 自制简易SHELL

在这个环节中,我们调用了getenv来获取环境变量USER和PWD。因为debian版本的环境变量中没有hostname环境变量,我们调用gethostname函数来获取hostname。

2025-08-04 12:15:08 453 6

原创 Linux进程程序替换

程序替换的一些基础知识和实现原理

2025-08-01 20:55:36 606 2

原创 Linux进程等待

进程等待为何如此重要?

2025-07-30 19:36:19 812 1

原创 Linux进程控制

在Linux操作系统中,fork是一个非常重要的函数,它从已经存在的进程中创建一个新的进程,该新进程是原进程的子进程,原进程是父进程。进程调用fork,当控制转移到内核中的fork代码后,内核会做:1.分配内存块和内核数据结构给子进程2.将父进程部分数据结构内容拷贝至子进程3.添加子进程到系统进程列表中4.fork返回,开始调度器调度当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以 开始它们自己的旅程,看如下程序。

2025-07-29 12:49:31 808 5

原创 Linux进程地址空间

简单谈一下Linux的进程地址空间

2025-07-27 11:29:56 898

原创 C++的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型 转换和显式类型转换。1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败2. 显式类型转化:需要用户自己处理。

2025-07-16 12:05:25 851 1

原创 C++11之智能指针

为什么C++需要智能指针,我们new出来的资源用delete及时释放不就好了吗?为什么要去研究智能指针这种东西,当你看完下面的例子你就能有所感受了。为什么我们明明写了delete p1,但是在第二种情况下还是发生了内存泄漏呢?这是因为异常会改变执行流,这种不当的设计就会导致内存泄漏。当然我们可以对上面的代码进行些许更改,捕获异常释放管理的资源然后再将异常向外抛出,这样就不会内存泄漏了。尽管上述代码不太美观,但还是能处理以上的问题,但如果是像下面这样,我们就不太好处理了。

2025-07-11 18:41:37 901 2

原创 C++11

C++11新特性

2025-05-07 23:15:06 710

原创 AVL树概念知识及其实现思路

我们实现的是KV模型的AVL树,像二叉搜索树一样我们需要定义左右指针方便我们指向左右子树,此外我们还需要一个parent指针方便我们后续进行翻转操作和一个bf(balance factor)变量记录左右子树的高度差,从而判断哪一个节点出现了问题,需要我们进行调整。最后,我们需要编写一个构造函数来方便我们后续完成新节点的创建工作。int _bf;

2025-02-01 19:44:22 1054 2

原创 Linux权限

1.超级用户(root):拥有最高权限,可以再Linux系统下做任何事情,不受限制。2.普通用户(user):在Linux系统下做有限的事情值得注意的是普通用户和超级用户的命令提示符是不一样的,普通用户为”$“,而超级用户为”#“。在命令行使用whoami可以查看当前用户身份,同时可以使用su来从普通用户切换为超级用户(也可以su 用户名的方式切到普通用户,此时不需要密码),ctrl+d可以退回普通用户。普通用户之间的su需要输入对应账户的密码。以上说明了超级用户在用户切换上不受权限约束。

2024-09-09 19:18:06 959 1

原创 栈和队列基础知识和实现

首先我们需要定义一个结构体并将其命名为栈,我们需要从栈顶插入元素并且还要知道该栈的容积以方便后面空间不够完成扩容(如果我们一次开辟较多的空间就浪费了)。int top;}Stack;我们需要定义一个结构体QueueNode来让一个队列元素链接到下一个队列元素。同时我们定义一个Queue来包含一个队头和队尾来方便我们插入和删除。}QNode;int size;}Queue;

2024-09-04 21:50:26 1564 1

原创 二叉树基础知识和代码实现

节点:包含一个数据元素及若干指向子树分支的信息。节点的度:一个节点拥有子树的数目称为节点的度。叶子节点:也称为终端节点,没有子树的节点或者度为零的节点。分支节点:也称为非终端节点,度不为零的节点称为非终端节点。树的度:树中所有节点的度的最大值。节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。树的深度(高度):树中所有节点的层次最大值称为树的深度。父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点。子节点:一个节点含有的子树的根节点称为该节点的子节点。

2024-08-21 23:47:16 885 4

原创 快速排序之三路递归

快速排序在针对有大量重复数据的情况,时间效率不是非常理想,时间复杂度甚至可以接近N^2这个量级,因此就出现了三路递归这种优化。

2024-08-16 12:46:05 398 2

原创 常见的排序算法介绍(思路+代码+讲解时间复杂度+稳定性+一些可能出现的小错误小细节)

排序:排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。常见的排序分类。

2024-08-14 19:27:31 1859 10

原创 单链表(不含哨兵位)

这是一篇单链表的简单实现

2024-07-19 17:53:00 1695 2

原创 顺序表的实现

本人学习数据结构的一些草稿

2024-07-15 17:35:16 314 5

空空如也

空空如也

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

TA关注的人

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