自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 北京崭珀实习总结

安排了个程序bug,去进行测试修改。

2026-05-11 11:26:09 7

原创 singleflight

包是 Go 官方扩展库中的一个工具,主要用于。其经典场景是防止缓存击穿:当多个并发请求同时需要同一个资源(例如同一个 key 的数据库查询)时,只让第一个请求真正执行,其余请求则等待并共享第一个请求的结果。下面结合你给出的源码,从结构、核心流程、panic/goexit 处理等几个方面进行详细讲解。

2026-05-07 19:20:02 358

原创 SChill项目面试题整理

原子性 :Lua脚本在Redis中是原子执行的,不会被其他命令打断,可以保证多个操作的一致性。- 避免缓存击穿:旧缓存key仍然存在,直到过期,大量并发请求不会同时打到数据库。- 性能优化 :Redis操作很快,用户可以立即得到响应,数据库更新异步进行。- 缓存不一致窗口期:在版本号更新后,旧缓存仍然有效(短暂时间)

2026-04-26 17:24:58 302

原创 Agent笔记

保持简洁:在设计中维持简单性,不要为了"智能"而增加不必要的复杂性优先透明:明确显示智能体的规划步骤,让用户和开发者都能理解决策过程精心设计接口:通过彻底的工具文档和测试来优化 ACI一个 Skill 就是一个包含SKILL.md文件的目录。就像给新员工写的入职指南,它包含有序的说明、脚本和资源,赋予 Agent 额外的能力。嵌入 + BM25优于单独使用嵌入Voyage 和 Gemini嵌入模型表现最好传递前 20 个块比前 10 或前 5 个更有效向块添加上下文大幅提高检索准确性。

2026-04-20 11:25:17 418

原创 Redis的Cluster集群

Redis Cluster 是 Redis 官方在 3.0 版本(2015年) 推出的分布式解决方案,旨在突破单机 Redis 在内存容量、并发吞吐和网络带宽上的瓶颈。它采用无中心、去中心化的架构,每个节点都与其他节点保持互连,没有中心代理层。其核心特点如下:多主多从:区别于传统主从+哨兵的单主写瓶颈,Redis Cluster 支持多个主节点同时提供读写服务,每个主节点可挂载多个从节点(副本)。自动分片:数据按哈希槽(Hash Slot)划分为 16384 个区间,每个主节点负责一部分槽位。高可用:具备内

2026-04-19 21:53:42 408

原创 LangChain学习笔记

LangChain 是目前最成熟、生态最丰富的 LLM 应用开发框架。它的核心价值在于将 LLM 从"对话机器人"升级为"任务执行引擎"——通过模块化的链式编排、智能体的自主决策、以及与外部数据源和工具的无缝集成,让 AI 能够真正完成复杂的工作流。对于开发者而言,掌握 LangChain 意味着能够系统性地构建 RAG 知识库、多智能体协作系统、自动化工作流等生产级 AI 应用。

2026-04-16 23:03:36 423

原创 Kafka 全面技术笔记

Apache Kafka 是一个开源的分布式流处理平台,最初由 LinkedIn 开发,后捐赠给 Apache 基金会。Kafka 提供了一套统一的高吞吐、低延迟平台,用于处理实时数据流,本质上是一个分布式的、分区的、多副本的提交日志服务Kafka 的设计更像一个数据库日志,而非传统的消息系统。发布与订阅:以消息队列的方式发布和订阅流式数据存储:以容错的持久化方式存储数据流,消息保留时间可配置处理:在数据流产生时进行实时处理(通过 Kafka Streams)维度核心设计关键技术架构。

2026-04-12 13:18:17 1156 1

原创 SChill 分享社区项目

【代码】SChill 分享社区项目。

2026-03-18 17:33:18 206

原创 c语言 多文件开发

将一个完整的 C 语言程序,按照功能模块头文件(.h):存放函数声明、宏定义、结构体 / 枚举声明、全局变量声明等(“对外接口”)。源文件(.c):存放函数的具体实现、全局变量的定义等(“内部实现”)。优势:代码模块化、降低耦合度、方便多人协作、便于调试和复用。现象:编译报错。解决:头文件中用extern声明全局变量,只在一个.c文件中定义。分文件开发核心是 “头文件声明接口,源文件实现细节”,遵循 “声明与定义分离” 原则。头文件必须加保护机制,全局变量用extern声明、在单个.c。

2026-02-24 21:02:54 365

原创 延迟双删有什么问题?大厂是如何优雅避开 延迟双删 的?

(Delayed Double Delete)是一种用于缓解缓存与数据库不一致问题的常用策略,广泛应用于以 Redis 为缓存、MySQL 为持久化存储的系统架构中。延迟双删的核心问题在于 需要“猜测时间”。延迟双删 依赖的“时间窗口” 精确控制,但在真实高并发场景中,请求耗时波动大、网络延迟不可控、读写竞争复杂, 都无法确保第二次删除 需要延迟多长。这种基于“猜测时间”的机制本质上是脆弱且不可靠的。

2026-02-23 01:16:41 347

原创 Golang的Channel

通道(channel)是 Go 语言中用于goroutine 之间通信的核心机制,是 CSP(Communicating Sequential Processes)模型在 Go 中的具体实现。“不要通过共享内存来通信,而应通过通信来共享内存。通道允许一个 goroutine 将值发送到另一个 goroutine,实现了内存的无锁同步访问。通道本身是并发安全的,内置了同步语义,使得并发编程更加简洁和健壮。通道是 Go 语言并发编程的基石,理解其工作原理和使用模式对于编写正确、高效的并发程序至关重要。

2026-02-22 17:38:40 1098

原创 Golang的Map

map 是 Go 中高效的键值存储结构,使用时必须初始化(make或字面量),避免对nilmap 赋值。键的类型必须可比较,值可以是任意类型(包括函数、切片等)。底层基于哈希表,通过桶和溢出链表解决碰撞,并支持渐进式扩容。并发访问需加锁或使用sync.Map。遍历顺序随机,不可依赖;可通过提取键排序后遍历实现有序。注意内存管理:删除元素不会释放内存,预分配容量可提升性能。理解底层原理有助于写出更高效、更健壮的代码。

2026-02-22 05:14:07 1048

原创 Golang的切片Slice

切片是 Go 中灵活、高效的序列类型,理解其内部结构(slice header)是正确使用的基础。注意区分长度和容量,避免越界。共享底层数组的特性容易导致意外副作用,需谨慎处理截取和传递。扩容机制随 Go 版本变化,了解当前版本的规则有助于容量预估和性能优化。切片非并发安全,多 goroutine 操作需加锁。使用copy创建独立副本,避免内存泄漏。掌握切片的底层原理和常见陷阱,能帮助开发者写出更健壮、高效的 Go 代码。

2026-02-22 04:39:45 791

原创 Redis分布式锁

由于增加次数以及减少次数是多个操作,这里需要再次使用lua脚本来实现,同时由于这里需要在Redis中存入加锁的次数,所以需要使用到Redis中的Map数据结构*Redis分布式锁原理如上图所示,当有多个Set命令发送到Redis时,Redis会串行处理,最终只有一个Set命令执行成功,从而只有一个线程加锁成功。到此,我们最终实现了一个加锁和解锁功能较为完整的redis分布式锁了,当然作为一个锁来说,还有一些其他的功能需要进一步完善,例如。命令便可以简单的实现加锁功能,当多个线程去执行这个加锁命令时,

2026-02-20 05:47:21 786

原创 分布式锁

比如库存管理,当多个线程操作同一条库存记录的时候,需要加锁来保证互斥;加分布式锁是因为再分布式集群部署的情况下,并发指的不是多个线程,二是多个进程或多个服务器;如果只是加线程锁只能保证一个JVM下的线程互斥,而其他的JVM还是可以进行访问的,从而造成数据不一致!所以可以理解为zookeeper是公平锁,但是可以是实现非公平锁,比如只创建一个临时有序节点,其他进程进行争抢!监听节点变更,比如B节点监听A节点,当A节点状态发生变更或删除,则B节点就会收到通知!商业转载请联系作者获得授权,非商业转载请注明出处。

2026-02-20 05:04:43 313

原创 IM开发遇到的问题和解决方案

从去年到现在,开发IM办公软件已近1年,期间从IM小白开发到现在可以独立开发一个IM客户端,期间虽有平台切换的因素,另一部分因素则是对IM开发不够熟悉,需要从技术方面解决一些问题。下面我对IM开发过程遇到的问题做一个总结。

2026-02-10 03:26:56 908

原创 IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?

IM系统的MQ消息中间件选型:Kafka还是RabbitMQ?-IM开发/专项技术区 - 即时通讯开发者社区!

2026-02-09 01:34:59 384

原创 分布式IM聊天系统的消息可靠性

分布式 IM 消息不丢 =客户端本地持久化 + 阶梯重试服务端先落盘多副本再 ACK全局唯一 ID + 幂等去重离线存储 + 分层回执兜底任何环节,没拿到可靠确认,就当没完成;重试必须幂等。

2026-02-08 21:20:49 986

原创 即时通讯项目--Gateway

包含获取用户聊天会话列表、创建多人聊天会话、获取消息会话成员列表、发送新消息、获取指定时间段消息列表、获取最近 N 条消息列表、搜索关键字历史消息,包含用户名 / 手机号码注册、用户名 / 手机号码登录、短信验证码获取、用户信息获取、用户头像 / 签名 / 昵称 / 绑定手机号修改,所有接口的实现均基于 HTTP 请求处理,核心流程围绕。仅需基础鉴权与子服务调用,

2026-02-07 00:35:00 931

原创 RabbitMQ示例

Topic Exchange 核心:通过「点分隔的单词 + 通配符(*、#)」实现多维度路由,匹配 1 个单词,匹配 0 + 个单词;生产者关键操作:声明 Topic 交换器,指定符合规则的发布消息;消费者关键操作:创建临时排他队列,绑定多个 binding key 到 Topic 交换器,持续消费队列消息;灵活场景:Topic Exchange 可模拟 Fanout(#)和 Direct(无通配符),是 RabbitMQ 中最通用的交换器类型。

2026-02-06 19:21:12 664

原创 即时通讯项目--FriendService

FriendServer 负责好友及聊天会话相关管理,提供 9 个核心接口:

2026-02-05 20:54:32 946

原创 gtest

核心断言ASSERT_*(失败终止)和EXPECT_*(失败继续)是 gtest 的基础,根据场景选择;测试夹具:继承并重写SetUp()TearDown(),解决测试环境复用问题;进阶特性:参数化测试(多组参数)、死亡测试(崩溃场景)、测试过滤器(精准执行)能大幅提升测试效率;编译链接:通过 CMake 的找到库,链接时 Linux 需额外加pthread。掌握这些核心内容后,你可以为 C++ 项目编写规范、可维护的单元测试,大幅提升代码质量。

2026-02-02 14:41:42 931

原创 gflags

gflags 是 Google 开源的命令行参数解析库,核心优势是简化参数解析、自动生成帮助信息,比原生getopt更易用;核心使用流程:用DEFINE_*声明参数 →解析参数 →FLAGS_参数名访问参数;支持参数验证、别名、配置文件 / 环境变量加载等进阶特性,满足实际开发的多样化需求。掌握 gflags 可以让你快速实现规范、易维护的命令行参数解析,是 C/C++ 后端开发中非常实用的工具。

2026-02-02 14:12:13 399

原创 即时通讯项目--SpeechService

语音转换子服务,用于调用语音识别SDK,进行语音识别,将语音转为文字后返回给 网关即可,因此提供的功能性接口只有一个: 1. 语音消息的文字转换:客户端进行语音消息的文字转换。

2026-01-30 15:21:58 169

原创 即时通讯项目--FileService

文件的上传a. 单个文件的上传:该接口主要用于后台模块,后台收到文件消息后,将文件数据转发至文件子服务完成存储;b. 多个文件的上传:该接口主要用于后台模块,后台收到文件消息后,将文件数据转发至文件子服务完成存储。文件的下载a. 单个文件的下载:后台侧用于获取用户头像文件数据,客户端侧用于获取文件、语音、图片消息对应的文件数据;b. 多个文件的下载:后台侧用于大批量获取用户头像数据(如获取用户列表场景),前端侧用于实现批量文件下载。

2026-01-30 15:10:13 144

原创 即时通讯项目--UserService

_-_

2026-01-29 16:58:22 578

原创 Golang开发新手常犯的50个错误

Go 的所有坑,本质都是对 Go 设计理念和底层实现的不理解“不要共享内存来通信,要通过通信来共享内存”:优先使用 channel 实现并发同步,而非 sync.Mutex,减少数据竞争;“Slice 是引用类型,但其本身是值传递”:Slice 的底层是指向数组的指针,Slice 本身(指针 + len+cap)是值类型,传参时会复制,记住完整切片表达式和append 的 cap 判断;“理解 defer/recover/interface 的底层实现”

2026-01-26 18:28:37 705

原创 雪花算法Snowflake

雪花算法的核心可以用3 句话核心思想:将 64 位长整型拆分为固定位段,通过时间戳保证趋势递增、机器位保证分布式唯一、序列号保证单毫秒唯一,三者结合实现全局唯一 ID;高性能关键:纯内存位运算拼接 ID,无任何 IO 操作,是分布式 ID 生成方案中性能最高的类型之一;工业级落地:标准雪花算法需解决时钟回拨、位段适配、机器位分配三大问题,实际开发中推荐使用美团 Leaf、百度 UidGenerator 等工程化优化框架,而非重复造轮子。

2026-01-25 19:56:43 774

原创 即时通讯项目--(3)etcd二次封装

封装的时候,我们尽量减少模块之间的耦合度,本质上etcd是一个键值存储系统,并不是专门用于作为注册中心进行服务注册和发现的。提供两个设置回调函数的接口:服务上线事件接口(数据新增),服务下线事件接口(数据删除)提供一个设置根目录的接口:用于获取指定目录下的数据以及监控目录下数据的改变。二次封装:封装etcd-client-api,实现两种类型的客户端。2.服务发现客户端:从服务器查找服务信息数据,并进行改变事件监控。1.服务注册客户端:向服务器新增服务信息数据,并进行保活。1.封装服务注册客户端类。

2026-01-25 02:36:40 59

原创 即时通讯项目--(2)spdlog二次封装

3.封装出一个初始化接口,便于使用:调试模式则输出到标准输出,否则输出到文件中。2.因为日志输出没有文件名行号,因此使用宏进行二次封装输出日志的文件名和行号。1.避免单例的锁冲突,因此直接创建全局的线程安全的日志器进行使用。3.初始化接口接收一个参数:输出日志等级 -- 用于发布模式。2.初始化接口接收一个参数:输出文件名 -- 用于发布模式。对日志输出的接口,进行宏的封装,加入文件名行号的输出。封装出一个全局接口,用户进行日志器的创建与初始化。1.初始化接口接收一个参数:运行模式-bool。

2026-01-25 00:44:36 63

原创 即时通讯项目--UserServer

3. 短信验证码获取:当用户通过手机号注册或登录的时候,需要获取短信验证码。1. 用户注册:用户输入用户名(昵称),以及密码进行用户名的注册。4. 手机号注册:用户输入手机号和短信验证码进行手机号的用户注册。5. 手机号登录:用户输入手机号和短信验证码进行手机号的用户登录。6. 用户信息获取:当用户登录之后,获取个人信息进行展示。2. 用户登录:用户通过用户名和密码进行登录。10. 手机号修改:修改用户的绑定手机号。7. 头像修改:设置用户头像。8. 昵称修改:设置用户昵称。9. 签名修改:设置用户签名。

2026-01-24 20:33:18 54

原创 即时通讯项目--(1)环境搭建

我用的环境是Ubuntu20.04。

2026-01-16 19:58:07 64

原创 RPC框架:从原理到选型

gRPC是一个高性能、通用的开源RPC框架,其由Google 2015年主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf序列化协议开发,且支持众多开发语言。由于是开源框架,通信的双方可以进行二次开发,所以客户端和服务器端之间的通信会更加专注于业务层面的内容,减少了对由gRPC框架实现的底层通信的关注。如下图,DATA部分即业务层面内容,下面所有的信息都由gRPC进行封装。

2026-01-06 14:38:12 1036

原创 Docker-compose部署redis-cluster集群

替换宿主机 IP + 开放所有端口(7001-7006、17001-17006) + 初始化集群命令;必须是宿主机 IP,关闭保护模式;避坑点:添加避免容器网络隔离导致的通信失败,开启 AOF 持久化防止数据丢失。

2026-01-05 22:09:04 1030

原创 docker搭建kafka集群

,后续所有操作都在这个目录下进行。在电脑任意位置新建文件夹(比如。

2026-01-04 22:18:31 932

原创 Boost asio定时器

约束参数到完成处理程序(重复计时器实现)计时器5同步多线程程序中的完成处理程序。定时器4使用成员函数作为完成处理程序。计时器1 同步使用计时器。计时器2 异步使用计时器。

2025-12-20 16:17:21 183

原创 Redis源码刨析系列:四、字典dict

Redis 6.2 的字典(dict)是的工业级实现(结合「开放寻址」思想优化,核心为链式解决哈希冲突),是 Redis 最核心、最基础的数据结构 ——Redis 数据库的键值对存储、哈希(Hash)类型键、集群槽位映射、配置项管理等核心功能均基于字典实现。(避免全量 rehash 阻塞主线程)、动态扩容 / 缩容、自定义哈希 / 对比函数、安全迭代等特性,兼顾性能与稳定性。

2025-12-02 12:00:40 821

原创 Redis源码刨析系列:三、链表adlist

Redis 6.2 的链表(官方命名为adlist,A generic doubly linked list)是的工业级实现,作为 Redis 核心底层数据结构之一,支撑了列表键、发布订阅、慢查询日志、AOF 重写缓冲区等核心功能。相较于 C 标准库无通用链表实现,Redis 自研的链表具备「双向循环、O (1) 长度、类型无关、安全迭代」等特性,兼顾性能与灵活性。

2025-12-02 11:20:57 293

原创 Redis源码刨析系列:二、简单动态字符串SDS

SDS(Simple Dynamic String,简单动态字符串)是 Redis 自研的字符串实现,也是 Redis 最基础、最核心的数据结构 ——Redis 中所有字符串类型的键 / 值、AOF 缓冲区、客户端输入缓冲区等场景均基于 SDS 实现。Redis 6.2 对 SDS 做了极致的内存优化,核心目标是,解决原生 C 字符串的诸多缺陷。

2025-12-01 23:54:11 1098

原创 Redis源码刨析系列:一、概述

手写Redis系列:一、概述。

2025-12-01 20:31:05 121

空空如也

空空如也

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

TA关注的人

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