- 博客(44)
- 收藏
- 关注
原创 作为后端开发你不得不知的 AI 知识——RAG
我们知道,大模型的知识都是固化的,它不认识你公司的最新产品,而 RAG 就是为模型提供知识库的一种有效方法。基于构建知识库,是大模型兴起之后最快被采纳接收的架构范式之一。当前,RAG 系统已经被广泛地应用在客服问答、个性化推荐、智能对话助手等场景中。RAG 技术能够弥补大模型因知识截止而无法获取最新信息的问题,并有效降低其产生幻觉的风险,而且 RAG 技术相比于大模型后训练或微调方式,以更加成本低的方式与企业的专有数据对接,以实现大模型快速技术验证和商业化尝试。
2026-02-06 21:08:25
680
原创 作为后端开发你不得不知的 AI 知识——Prompt(提示词)
最近作者在阅读阿里出品的《AI 原生应用架构白皮书》,毕竟未来也是从事后端开发相关工作,多学点 AI 知识肯定是有所裨益的。今天作者就来为大家详细解释一下这个概念,这是从事 AI 工作必须知道的一个基础性概念。在 AI 原生应用中,我们的编程方式发生了根本性的变化。不再编写复杂的代码,而是使用一种更接近人类语言的方式与 AI 沟通,这就是。Prompt 的质量很大程度上影响了 AI 应用的输出效果。
2026-02-06 11:57:09
577
原创 从《守望先锋》2026前瞻,看大型分布式系统的“重构”与“并发挑战”
看前瞻时,其实我心里作为一个游戏爱好者,本质上还是沉浸于这场视觉盛宴,既有是对新内容“引爆互联网”的期待,也有对于支持战队能否快速适应新版本的担忧这次守望先锋的“重启”,本质上是一次对旧架构的致敬与重构。系统永远是动态的。无论是代码还是游戏,最核心的竞争力在于如何在高压环境下,通过优雅的架构设计,既保留经典的逻辑,又快速响应用户的需求。
2026-02-05 18:27:00
899
原创 告别慢 SQL:MySQL 百万级数据深分页优化策略
普通分页(前几页):直接LIMIT。管理后台深分页(跳页):用延迟关联。App 瀑布流(无限滚动):用游标法 (WHERE id >?
2026-01-21 19:59:48
438
原创 警惕!ThreadLocal 内存泄露的真相与最佳实践
ThreadLocal 并不拥有数据,它只是线程取数据的“索引”。内存泄露的根源是线程池线程复用 + Value强引用。黄金法则:用完即删(remove),放在finally块里最安全。
2026-01-21 19:53:25
493
原创 --- title: “源码读不懂?那是你姿势不对!—— GitHub 开源项目高效拆解指南“ date: 2026-1-20 21:40 categories: [技术] tags: [学习方法,分
阅读开源项目是程序员进阶最快的方式,没有之一。不要被那些 Star 数过万的项目吓倒。它们也是由一行行普通的if-else和for循环组成的。保持好奇心,善用调试器,先跑通,再拆解,最后重构。源码之前,了无秘密。加油!
2026-01-20 21:58:50
733
原创 Agent 项目遇到数据安全问题怎么办?手把手教你面试回答
简单来说就是:不信 AI(AST 解析校验)、不给权限(数据库只读)、关进笼子(Docker 沙箱)。通过这套组合拳,即使 AI 被攻击者诱导生成了恶意代码,系统也能像 Seata 的 AT 模式 回滚事务一样,确保核心数据资产的绝对安全。
2026-01-20 21:33:13
1207
原创 阅读 Netty 源码关于 NioEventLoop 和 Channel 初始化部分的思考
启动:Netty 很懒,你把任务扔进去它才启动线程。分配:一个线程(EventLoop)像是包工头,手下管着几千个工人(Channel)。每个工人只听这一个包工头的话。异步:包工头接活时,先给你开个收据(Future),然后让你一边玩去。活干完了,他再按收据上的电话通知你。队列:如果你想指挥工人干活,但你不是包工头,你不能直接吼工人。你得写个纸条(Task)塞进包工头的信箱(Queue)。包工头忙完手头的活(IO),会去信箱拿纸条执行。
2026-01-18 21:42:33
817
原创 Netty 灵魂拷问:为什么有了 Head 和 Tail,还需要 ChannelInitializer?
为什么需要?解决时机问题: 在连接尚未建立时,提供一个回调钩子(Callback),让我们可以定义“将来要做什么”。解决独立性问题: 它作为一个工厂,利用new关键字,确保每个连接都拥有自己专属的、全新的业务 Handler 实例。理解了它,你就理解了 Netty 线程模型中“配置”与“运行”的分界线。
2026-01-18 21:16:20
1162
原创 进程、线程、协程,还在傻傻分不清楚?
简单来说,进程是操作系统分配资源的最小单位,线程是操作系统CPU调度的最小单位,而协程则是用户态级别的一种轻量级线程,它的调度不由操作系统控制,而是由应用程序自己控制。进程是抢地盘的。线程是抢 CPU 的。协程是聪明地利用“等待时间”来干私活的。
2026-01-17 21:42:59
1234
原创 Java NIO:Buffer、Channel和Selector
Channel 经常翻译为通道,类似 IO 中的流,用于读取和写入。它与前面介绍的 Buffer 打交道,读操作的时候将 Channel 中的数据填充到 Buffer 中,而写操作时将 Buffer 中的数据写入到 Channel 中。至少读者应该记住一点,这两个方法都是 channel 实例的方法。
2026-01-15 18:02:51
970
原创 PriorityQueue 源码阅读
是 Java 中的一种队列数据结构,被称为。它和普通队列不同,普通队列都是遵循先进先出(FIFO)的原则,即先添加的元素先出队,后添加的元素后出队。而则是按照元素的优先级来决定出队的顺序,默认情况下,优先级越小的元素先出队。而优先队列的逻辑存储结构和普通队列有所不同,以为例,其底层实际上是使用形式的二叉堆,即值最小的元素优先出队。
2026-01-15 16:08:09
597
原创 ArrayBlockingQueue 源码阅读
总结一下:阻塞队列就说基于非空和非满两个条件实现生产者和消费者之间的交互,尽管这些交互流程和等待通知的机制实现非常复杂,好在 Doug Lea 的操刀之下已将阻塞队列的细节屏蔽,我们只需调用puttakeoffferpoll等 API 即可实现多线程之间的生产和消费。这也使得阻塞队列在多线程开发中有着广泛的运用,最常见的例子无非是我们的线程池,从源码中我们就能看出当核心线程无法及时处理任务时,这些任务都会扔到workQueue中。
2026-01-14 00:05:33
1055
原创 CopyOnWriteArrayList 源码阅读
在 JDK 1.5 之前,如果想要使用并发安全的List只能选择Vector。而Vector是一种老旧的集合,已经被淘汰。Vector对于增删改查等方法基本都加了,这种方式虽然能够保证线程同步,但这相当于对整个Vector上了一把大锁,使得每个方法执行的时候都要去获得锁,导致性能非常低下。JDK 1.5 引入了(JUC)包,其中提供了很多线程安全且并发性能良好的容器,其中唯一的线程安全List实现就是。
2026-01-13 16:22:08
935
原创 IO多路复用
这就是全部内容,下面是一个小结表格。特性SelectPollEpoll底层数据结构Bitmap(数组)链表/数组红黑树(存储FD)+ 双向链表(存储就绪FD)时间复杂度O(n)O(n)O(1)(与活跃数有关)最大连接数1024(默认)无限制无限制(受系统内存限制)IO 效率随连接数增加而显著下降随连接数增加而显著下降不随总连接数线性下降数据拷贝每次调用都需要拷贝全部 FD每次调用都需要拷贝全部 FDFD 仅在注册时拷贝一次。
2026-01-12 16:08:20
672
原创 虚拟机假死?SSH 能连却卡 Logo 界面
如果你的虚拟机很久没开,突然出现各种“灵异”的显示问题,不要急着改配置文件。只要 SSH 能连上,先试着。
2026-01-11 21:24:39
920
原创 LinkedHashMap 源码阅读
是 Java 提供的一个集合类,它继承自HashMap,并且在HashMapHashMap在HashMap基础上在各个节点之间维护一条双向链表,使得原本散列在不同 bucket 上的节点、链表、红黑树关联起来。
2025-12-28 16:47:49
1074
原创 ConcurrentSkipListMap 源码阅读
中有一个final类NodeNode中key不可被修改,这一点很好理解,键值对的key只有值是可以改变的,所以key用final修饰。value用volatile保证了并发操作修改的可见性。next指向Node的后继节点,同样用volatile修饰保证可见性。//略底层是由跳表构成,为了维护跳表的多级索引,封装了Index//指向被索引的节点//指向下一等级的索引//指向后继索引//略node:指向需要被索引的键值对,用final修饰,所以一旦Index。
2025-12-27 17:41:03
971
原创 八股篇(1):LocalThread、CAS和AQS
变量内存地址,V表示旧的预期值,A表示准备设置的新值,B表示执行 CAS 操作的时候,只有当V=A时,才会去用B去更新V的值,否则不会执行更新操作。CAS 是一条 CPU 的原子指令(cmpxchg),不会造成数据不一致的问题。Java 的 Unsafe 提供的 CAS 操作()底层实现即为CPU指令cmpxchg。
2025-12-26 22:38:02
1498
原创 ConcurrentHashMap 源码阅读
Java7 中使用的分段锁,也就是每一个Segment上同时只有一个线程可以操作,每一个Segment都是一个类似HashMap数组的结构,它可以扩容,它的冲突会转化为链表。但是Segment的个数一但初始化就不能改变。Java8 中的使用的锁加 CAS 的机制。结构也由 Java7 中的 Segment数组 +HashEntry数组 + 链表进化成了Node 数组 + 链表 / 红黑树,Node 是类似于一个 HashEntry 的结构。
2025-12-26 17:16:27
1085
原创 HashMap 源码阅读
HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。HashMap可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后的HashMap。
2025-12-25 23:40:15
924
原创 ArrayList 源码阅读
ArrayList的底层是数组队列,相当于一个动态数组。与 Java 中的数组相比,它的容量能动态增粘,并且支持随即插入。在添加大量元素前,可以使用操作来增加ArrayList实例的容量。这样可以减少递增式再分配的次数。ArrayList继承于,实现了ListCloneable这些接口。
2025-12-25 17:36:33
930
原创 线程池在 IM 系统中的应用:从 RocketMQ 到 AI 处理
高性能:RocketMQ 异步发送,响应时间从 50ms 降到 < 10ms高可用:AI 处理独立线程池,不阻塞其他消息资源控制:通过参数调优,合理利用系统资源优雅关闭:应用关闭时正确清理资源关键要点选择合适的线程池参数:根据实际场景计算和调优资源隔离:不同业务使用不同的线程池监控和调优:持续监控线程池状态,及时调整参数优雅关闭:确保应用关闭时资源正确释放适用场景高并发系统异步处理场景耗时操作(AI、IO 等)需要资源控制的场景。
2025-12-24 23:24:41
648
原创 Spring Boot Starter 自定义开发:封装中间件配置
配置统一管理:所有中间件配置集中在 framework 模块开箱即用:引入依赖即可使用,无需手动配置代码复用:多个项目共享同一套配置和工具类易于维护:配置变更只需修改 Starter,所有项目自动生效关键要点Spring Boot 3.x 使用替代使用进行配置绑定和验证合理使用条件装配注解,提高灵活性封装工具类,简化使用方式统一异常处理和日志输出适用场景多项目共享的中间件配置需要统一封装的工具类复杂的第三方服务集成需要条件装配的功能模块。
2025-12-24 13:21:08
885
原创 反射机制在 IM 系统中的应用:从消息识别到 Handler 自动注册
只在初始化时使用反射@Overrideinit();// 只在初始化时执行缓存反射结果异常处理try {// 反射操作LOGGER.error("反射操作失败: {}", ex.getMessage(), ex);// 不要忽略异常,记录日志便于排查性能监控init();LOGGER.info("初始化耗时: {}ms", endTime - startTime);反射机制在 IM 系统中发挥了重要作用:✅ 自动发现:无需手动配置,自动建立映射关系。
2025-12-23 22:33:01
770
原创 WebSocket vs HTTP:为什么 IM 系统选择长连接?
✅适合场景* 实时通讯(IM、游戏、协作工具)* 实时数据推送(股票、监控)* 双向通信频繁* 低延迟要求❌不适合场景* 简单的 CRUD 操作* 静态资源服务* 偶尔的查询请求核心优势✅ 实时性:消息延迟 < 10ms✅ 双向通信:服务端可以主动推送✅ 资源高效:连接复用,开销小✅ 用户体验好:即时响应,流畅交互关键要点WebSocket 适合实时通信场景心跳机制是长连接的必需品合理设计心跳间隔和超时时间混合使用 WebSocket 和 HTTP。
2025-12-23 14:33:47
986
1
原创 阿里云 OSS + STS:安全的文件上传方案
安全性✅ 临时凭证,自动过期✅ 权限最小化,精确控制✅ 主账号密钥不暴露性能✅ 客户端直传,不经过服务端✅ 凭证缓存,减少 API 调用✅ 响应速度快,用户体验好可维护性✅ 路径组织清晰,便于管理✅ 日志完整,便于审计✅ 配置灵活,易于扩展关键要点使用 STS 而非永久密钥:保证安全性实现凭证缓存:提升性能和降低成本合理组织文件路径:便于管理和权限控制遵循安全最佳实践:多层防护,降低风险希望本文能帮助大家更好地理解和实现安全的文件上传方案。
2025-12-22 19:30:00
928
原创 从零到一:如何设计一个 IM 系统的消息协议?
简洁性(Simplicity)协议结构简单明了,易于理解和实现避免过度设计,只包含必要的字段命名规范统一,语义清晰可扩展性(Extensibility)支持新增消息类型,不影响现有功能支持字段扩展,向后兼容预留扩展空间,避免频繁重构性能优先(Performance)选择高效的序列化格式(如 Protobuf)减少消息体积,降低网络传输成本支持批量操作,提高吞吐量类型安全(Type Safety)使用强类型定义,避免运行时错误编译时检查,提前发现问题明确的字段类型和约束。
2025-12-22 12:31:19
654
原创 消息去重机制设计:如何保证幂等性?
先检查后处理:在处理消息前先检查是否已存在原子操作:使用 Redis 原子操作保证并发安全多层防护:Redis 去重 + 数据库唯一约束降级方案:Redis 故障时的降级处理定期清理:避免 Set 无限增长消息去重机制是保证 IM 系统幂等性的关键设计。通过使用 Redis Set 和SISMEMBER命令,我们可以以 O(1) 的时间复杂度高效地实现消息去重。同时,需要考虑并发场景、故障降级、数据清理等边界情况,才能构建一个健壮的去重系统。
2025-12-21 15:37:12
712
原创 IM 系统开发中的 5 个常见问题及解决方案
问题解决方案关键技术消息重复处理Redis 去重机制死连接内存泄漏心跳检测 + 连接清理消息丢失RocketMQ 持久化 + 重试消息持久化 + 自动重试高并发性能异步处理 + Redis 缓存AI 响应阻塞独立线程池幂等性设计:消息去重保证幂等性资源管理:及时清理无效连接,避免内存泄漏可靠性保障:多重保障机制,确保消息不丢失性能优化:异步处理 + 缓存,提升系统性能错误隔离:独立线程池,避免相互影响。
2025-12-21 12:32:44
595
原创 责任链模式实战:多 AI 助手的消息路由
使多个对象都有机会处理请求,从而避免请求的发送者与接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。责任链模式:每个 Handler 独立判断,不匹配则传递零配置扩展:新增 Handler 只需添加@Component注解统一接口:所有 Handler 实现方法支持复杂判断:每个 Handler 可以有独立的判断逻辑责任链模式适合:多个处理器、不同判断逻辑、需要灵活扩展的场景零配置扩展:利用 Spring 的自动发现机制,无需手动注册。
2025-12-20 16:44:31
660
原创 AI 流式响应实战:从同步等待到实时推送
关键点流式响应:使用回调函数模式,实时推送每个数据块IAiservice统一不同 AI 平台的接口WebSocket 推送:通过实时推送异步处理:使用 RocketMQ + 独立线程池,不阻塞主流程优化效果指标同步流式响应提升首字延迟10秒1-2秒5-10倍用户体验差好显著提升资源占用高低降低经验总结流式响应能显著提升性能统一接口便于多平台集成异步处理避免阻塞回调函数模式适合流式场景。
2025-12-20 14:00:37
786
原创 Netty 连接管理优化:如何支持 10万+ 并发连接?
/ 1. 在Pipeline中添加IdleStateHandler// 参数说明:// - readerIdleTime: 读空闲时间(0表示不检测)// - writerIdleTime: 写空闲时间(0表示不检测)// - allIdleTime: 读写空闲时间(10分钟)@Component@Resource@Resource@Override// 10分钟无读写,触发超时if (userId!= null) {
2025-12-19 16:03:17
1054
原创 从 50ms 到 < 10ms:IM 系统性能优化实战
优化策略总结1.异步化耗时操作通过 RocketMQ 异步处理立即返回响应,提升用户体验2.缓存化热点数据存入 Redis减少数据库查询,降低延迟3.序列化优化使用 Protobuf 替代 JSON减少体积,提升速度4.数据结构优化Redis Hash 存储房间信息Redis Set 实现消息去重优化效果响应时间:从 50ms 降到 < 10ms(实际 < 5ms)吞吐量:提升 10 倍以上数据库压力:降低 80%CPU 使用率:降低 40%
2025-12-19 14:58:38
1045
原创 设计模式在 IM 系统中的应用:工厂模式、策略模式、责任链模式
工厂模式:解决对象创建问题,实现命令处理器的自动注册策略模式:解决算法选择问题,不同命令使用不同处理策略责任链模式:解决请求传递问题,AI 消息按优先级依次处理实际使用建议1.工厂模式:适用于需要根据类型创建对象的情景2.策略模式:适用于有多种处理方式且需要动态选择的场景3.责任链模式:适用于需要按优先级一次处理请求的场景注意事项避免过度设计:简单场景不需要引入复杂模式性能考虑:反射和责任链遍历有开销,需权衡代码可读性:模式应提升可读性,而非增加复杂度。
2025-12-19 09:30:00
597
原创 IM 系统架构设计:从单机到分布式的演进思考
1.Channel 路由:通过 Redis 路由表 + MQ 转发实现跨机器消息推送2.状态共享:Redis 存储路由信息,所有服务器共享3.消息路由:RocketMQ Tag 路由,支持精确路由到目标服务器4.负载均衡:通过网关和负载均衡器分配用户到不同服务器5.状态同步:事件驱动 + 定期同步,保证最终一致性。
2025-12-18 09:30:00
741
原创 Protobuf vs JSON:为什么 IM 系统选择二进制协议?
Protobuf 相比 JSON 的优势:1.性能:体积小 30-50%,序列化速度快 3-5 倍2.类型安全:编译时检查,避免运行时错误3.向后兼容:支持字段扩展,不影响旧版本4.代码生成:自动生成代码,减少手写代码在 IM 系统这种高并发、低延迟的场景下,Protobuf 是更好的选择。虽然 JSON 更易读、更简单,但在性能要求高的场景下,Protobuf 的优势更明显。选择建议高并发、低延迟场景:选择 Protobuf简单场景、可读性要求高:选择 JSON。
2025-12-16 15:20:35
821
原创 Redis 在 IM 系统中的 5 种应用场景:从缓存到去重
Redis 在 IM 系统中的 5 种应用场景:1.用户信息缓存:String 结构,30 分钟过期,提升查询性能 20-30 倍2.房间信息存储:Hash 结构,减少 Key 数量,支持部分更新3.消息去重:List 结构(可优化为 Set),保证消息幂等性4.OSS 凭证缓存:String 结构,1 小时过期,减少 API 调用成本5.房间号映射:String 结构,永久存储,快速查询房间ID场景数据库查询Redis 查询性能提升用户信息20-30ms< 1ms。
2025-12-15 09:30:00
540
原创 RocketMQ 在即时通讯系统中的应用:异步解耦与性能优化
RocketMQ 在 IM 系统中的价值:1.性能优化:响应时间从 50-60ms 降到 < 10ms,性能提升 5-6 倍2.系统解耦:广播和持久化通过不同消费者处理,互不影响3.可靠性保障:消息持久化到 MQ,支持重试,保证不丢失4.灵活扩展:轻松增加新的消费者处理消息5.延迟消息:支持延迟消息,实现定时任务功能通过 RocketMQ 的异步处理,IM 系统在保证功能完整性的同时,大幅提升了性能和可扩展性。
2025-12-14 09:30:00
1665
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅