- 博客(79)
- 收藏
- 关注
原创 RAG 系统如何实现全链路追踪:AOP 埋点与流式调用追踪实践
本文介绍了一种自研的RAG系统全链路追踪方案,主要解决RAG问答系统中复杂调用链路的性能监控问题。方案采用AOP埋点和流式调用追踪相结合的方式: 设计Trace Run和Trace Node两级追踪模型,通过上下文传递维护调用关系 对同步阶段使用注解+AOP自动追踪方法执行 针对流式LLM调用的特殊性,提出手动Span+Callback收尾的追踪机制 通过包装StreamCallback捕获流式调用的完整生命周期 该方案能准确还原RAG请求的完整执行过程,包括问题改写、意图识别、知识检索等同步阶段和流式输出
2026-06-22 15:43:08
231
原创 使用 TtlExecutors 解决线程池中的 ThreadLocal 上下文丢失问题
本文介绍了使用 TransmittableThreadLocal (TTL) 解决线程池中 ThreadLocal 上下文丢失的问题。当 HTTP 请求线程通过 ThreadLocal 保存用户上下文时,直接提交到线程池的任务会因线程切换导致上下文丢失。通过使用 TTL 包装线程池 Executor,可以在任务提交时捕获当前线程的 TransmittableThreadLocal 值,并在任务执行时回放到工作线程中。关键步骤包括:1) 用 TransmittableThreadLocal 代替普通 Thre
2026-06-18 16:33:05
170
原创 长耗时请求场景下(RAG问答场景),如何基于 Redis 实现分布式公平限流?
本文介绍了一种基于Redis的分布式公平限流方案,适用于长耗时请求场景(如RAG问答)。方案通过Redis全局信号量控制并发,ZSET实现公平排队,结合定时轮询和Pub/Sub主动唤醒机制。关键设计包括:1) 全局信号量避免单机限流导致的集群并发失控;2) ZSET队列保证请求公平性;3) 本地Ticket状态机管理请求生命周期;4) entry存活标记防止僵尸请求;5) Lua脚本原子化操作;6) 主动通知+定时轮询的双重保障机制;7) 通知合并避免消息风暴。该方案兼顾了实时性和可靠性,可有效控制资源密集
2026-06-18 16:00:56
294
原创 AtomicBoolean + CAS实现本地乐观锁
摘要 本文介绍了使用AtomicBoolean和CAS机制实现本地乐观锁的几种典型模式,适用于解决分布式系统中本地对象的状态竞争问题。主要包括: 一次性门闩模式:通过compareAndSet确保关键业务动作(如取消操作)只执行一次 资源生命周期保护:为非线程安全资源(如SSE连接)提供并发关闭保护 请求取消幂等:为底层HTTP请求提供双重状态保护 终态一致性保证:确保流式回调的终态(完成/错误/取消)只记录一次 多终态状态机:使用AtomicReference处理复杂状态转换 通知合并:避免重复扫描带来的
2026-06-12 14:43:28
305
原创 【面经】缓存一致性全套解决方案:从旁路删除到延迟双删、MQ 补偿、binlog 监听与多级缓存
# 缓存一致性全套解决方案:从 Cache-Aside 到延迟双删、MQ 补偿、binlog 监听与多级缓存> 本文适合 Java 后端、Redis 缓存设计、面试复习和系统设计总结。 > 核心目标:彻底搞清楚 **数据库与缓存一致性** 到底有哪些方案、分别解决什么问题、适合什么业务场景。> 适合面试补差 和面试官吹水 缓存一致性的全套解决方案> 基于本人多次面试的经验 每次都会存在缓存一致性的场景解决问题 + GPT总结 后写下
2026-06-04 15:04:06
419
原创 流式大模型调用中的首包监测:解决流式调用大模型的异步问题
在大模型应用里,同步调用和流式调用的错误处理方式差异很大。同步调用比较好理解:调用模型 A 失败了,当前线程还能继续尝试模型 B;如果 B 成功,就直接返回结果。整个故障转移过程发生在return之前,调用方一直阻塞等待,完全不知道中间切换过几个供应商,最终拿到一个字符串结果即可。流式调用就不一样了。流式接口通常会立即返回一个取消句柄,真正的数据则在异步线程里通过回调持续推送。也就是说,方法返回时,回答并没有生成完,甚至可能还没有生成第一个 token。
2026-06-03 14:28:22
385
原创 调用多个AI 模型时,如何实现一个简单的熔断机制
文章摘要:AI模型服务熔断机制的轻量级实现 本文介绍了一种为AI模型服务设计的轻量级熔断机制实现方案。当调用Chat、Embedding等AI模型服务时,常会遇到超时、限流等问题,熔断机制可避免持续调用故障服务。方案采用三个状态(CLOSED、OPEN、HALF_OPEN)管理模型健康度,通过记录连续失败次数、熔断时间和半开探测标记,实现自动熔断和恢复。核心逻辑包括:调用前检查状态、成功时重置健康状态、失败时累计并触发熔断。该方案与模型路由结合,实现故障自动转移,属于被动健康监测方式,具有实现简单、无需额外
2026-05-28 17:12:29
407
原创 SynchronousQueue + CallerRunsPolicy 与 LinkedBlockingQueue + CallerRunsPolicy 对比
本文对比了Java线程池中两种常见配置组合:SynchronousQueue+CallerRunsPolicy和LinkedBlockingQueue+CallerRunsPolicy。前者不缓存任务,线程池满后立即触发反压,适合MQ消费等不允许本地堆积的场景;后者允许最多100个任务排队,适合普通异步任务。关键区别在于反压触发时机和任务堆积容忍度,选择取决于业务对延迟的敏感度。MQ场景推荐使用SynchronousQueue组合,因其能有效将压力传导回Broker,避免Consumer本地堆积风险。
2026-05-26 16:04:45
336
原创 基于数据库字段实现可续期分布式锁:从任务抢占到心跳续约
摘要:基于数据库字段实现可续期分布式锁 本文提出了一种轻量级的分布式锁实现方案,通过在任务表中添加lock_owner和lock_until两个字段,利用数据库的CAS机制实现任务抢占和锁续期。该方案适用于多实例部署的后台系统,避免任务重复执行问题。 核心机制包括: 使用UPDATE语句实现CAS抢锁 采用唯一token防止误释放 两层续期机制(启动前确认+后台心跳) 基于TTL的自动过期保障 方案优势在于无需引入额外中间件,适用于已有任务表的系统,且实现简单可靠。文中详细阐述了MySQL/PostgreS
2026-05-21 14:34:01
383
原创 Spring Boot 做 RAG 文档上传:为什么要用分布式信号量控制并发?
摘要 Spring Boot实现RAG文档上传时,需要采用分布式信号量控制并发。原因在于文档上传后还需进行文本解析、分片、向量生成等后续处理,这些操作会传递压力到整个系统。虽然文件大小限制能控制单个请求,但无法限制并发请求数。在多实例部署环境下,本地信号量会导致整体并发失控,因此需使用基于Redis的分布式信号量统一控制。实现方案包括:初始化信号量配置、请求时获取许可、超时拒绝及请求完成释放许可,确保无论部署多少实例都能维持可控的并发上传量。
2026-05-19 16:45:27
1132
原创 Spring Boot 做 RAG 文档上传:1GB 文件会不会打爆内存?
在常规 Spring MVC 上传里,文件大小限制会在 multipart 解析阶段生效。很多情况下,Controller 方法还没进入,请求就已经因为超限失败了。RAG 系统里,并发上传会带来临时文件、磁盘 IO、解析任务、embedding 请求和向量库写入压力。普通系统里,上传文件可能只是保存附件。如果文件是 50MB,并发 10 个请求,仅这一步就可能带来几百 MB 的内存压力。这种情况下,上传接口本身可能没问题,但解析任务仍然可能造成内存波动。只限制单个请求大小,它们不限制同时有多少人在上传。
2026-05-19 15:43:37
413
原创 大模型 + RAG 幻觉治理方案总结
本文总结了治理大模型+RAG系统幻觉问题的系统性方案。核心观点是:不能仅依赖Prompt解决幻觉问题,而应从完整链路进行治理,包括文档源治理、文本切分优化、检索召回质量提升、上下文合理组装、Prompt约束、拒答机制、答案校验等9个层面。文章详细分析了RAG幻觉的4种常见来源,并针对每个环节提出了具体优化建议,如文档版本管理、混合检索策略、reranker重排序、生成参数控制等。最终强调需要建立评估集和监控机制,通过数据驱动持续优化系统。
2026-05-12 17:11:28
434
原创 RAG 检索进阶:重排序方法通俗讲解
本文通俗讲解RAG系统中的重排序(Re-ranking)方法,重点介绍四种常用技术: RRF(倒数排序融合):通过融合BM25和Dense检索结果,像多个评委投票一样,只关注文档在各检索器中的排名而非原始分数,适合低成本混合检索场景。 RankLLM/LLM-based Reranker:让大语言模型直接阅读问题和文档进行语义理解排序,能处理复杂语义但计算成本较高。 Cross-Encoder:通过深度交互计算问题与文档的相关性分数,精度高但计算量大。 ColBERT:平衡效率与精度,独立编码问题与文档后计
2026-05-09 11:30:51
242
原创 RAG 文档切分、索引优化与 Reranker 学习笔记
RAG系统优化关键点 本文讨论了RAG(检索增强生成)系统中的三个核心问题: 文档切分策略:指出固定长度切分的局限性,建议根据用户问题粒度、文档结构和语义边界进行切分,对比了递归切分、标题切分、语义切分等方法。 索引优化:强调metadata的重要性,建议根据业务场景选择合适的切分粒度,如FAQ采用问答对、表格数据按行切分等。 Reranker的作用:说明即使向量检索找到相关片段,仍需Reranker进行精排,介绍了常见排序方法。 文章提供了从业务场景出发的实用切分建议,帮助构建更高效的RAG系统。
2026-05-08 14:36:09
379
原创 向量数据库索引机制与选型总结:从 FLAT、IVF 到 HNSW、DiskANN
向量数据库索引机制与选型总结 本文系统介绍了向量数据库的核心索引技术,从基础的FLAT全扫描到高效的HNSW图索引,帮助开发者深入理解不同索引的工作原理和适用场景。 文章首先通过与传统数据库对比,解释向量数据库独特的相似性搜索特性。然后详细剖析FAISS作为向量检索库的定位与工作机制,包括其索引文件结构和与Milvus等完整向量数据库的区别。 核心部分逐一讲解5种主流向量索引: FLAT:暴力搜索,精度100%但速度慢 IVF_FLAT:基于聚类的倒排索引,搜索速度提升10倍 IVF_SQ8:在IVF基础上
2026-05-07 16:52:26
305
原创 魔改鱼皮的 AI 零代码应用:加入 LangGraph 工作流、思维链可视化、三层压缩和 TODO 任务规划
当上下文超过阈值后,会调用模型生成结构化摘要,把多轮历史压缩成一条摘要消息。已完成的操作当前项目结构用户核心需求尚未完成的任务关键修改的前后值用户消息 + AI 回复 + thinking + 工具请求 + 工具结果 + 多轮文件修改记录 ...[对话已压缩,完整记录保留在事件日志中]1) 已完成的操作- 创建了 package.json、vite.config.js、index.html、src/main.js 等文件- 将首页标题从「静夜思」修改为「测试」2) 当前项目状态。
2026-05-06 16:24:21
408
原创 RAG 文本分块策略总结:固定分块、语义分块、结构分块与父子分块
本文总结了RAG系统中常用的文本分块策略,从基础到高级逐步解析。首先阐述了分块的必要性:突破模型输入限制、提高检索精度、保持上下文完整性。然后详细介绍了固定分块、递归分块、语义分块等核心方法,分析各自优缺点及适用场景。特别强调了递归分块优先保留自然边界的优势,以及语义分块基于主题切分的特点。最后提供了实战建议:简单场景用递归分块,专业文档优先语义分块,结构化数据采用父子分块策略。文中包含大量代码示例和分块效果对比,为RAG系统构建提供了实用指南。
2026-05-06 16:17:37
392
原创 一文讲清楚: SSE、WebSocket 与 HTTP的关系
本文探讨了SSE、WebSocket与HTTP的关系及其应用场景。SSE基于HTTP协议实现服务端单向推送,适用于AI流式输出等场景;WebSocket通过HTTP握手升级为全双工通信协议,适合实时交互应用;普通HTTP采用请求-响应模式。三者底层均依赖TCP连接,SSE通过不关闭HTTP响应实现持续推送,WebSocket则建立独立帧协议。文章通过协议层次图、工作模式图解和代码示例,清晰展示了各技术的特点与适用场景。
2026-04-30 12:06:30
583
1
原创 Github高赞项目50K learn-claude-code 的学习笔记总结
这篇文章总结了GitHub高赞项目learn-claude-code的学习笔记,系统梳理了Claude Code的工作原理。笔记从S01到S12逐章解析核心知识点: S01基础骨架:展示最核心的4步循环结构(调用模型、检查工具需求、执行工具、返回结果) S02新增工具分发表:从单一工具扩展到可扩展工具系统 S03新增TodoManager:在基础loop上增加内存级任务规划功能 S04引入子agent:支持递归的、上下文隔离的子循环 S05增加SkillLoader:实现按需知识注入机制 S06新增上下文管
2026-04-27 17:30:47
710
原创 为什么 Claude Code 等主流 Agent 工具不使用 RAG,以及 RAG 的适用场景
Claude Code 等主流 Agent 工具为何不用 RAG? 核心原因:代码场景需要精确匹配而非语义相似,传统 RAG 会引入噪声干扰 替代方案:采用 Agentic Search(智能体搜索): 实时工具:Glob查路径、Grep查内容、Read读文件 无需预处理索引,像工程师一样动态探索代码库 RAG 缺陷:准确性不足、索引易过时、安全风险、运维复杂 RAG 适用场景: 大规模静态文档(企业知识库) 非结构化文本检索(客服/法律) 需要溯源合规的场景 多模态混合检索
2026-04-23 16:45:59
426
原创 Zero Code Studio:LangChain4j 工具调用 + LangGraph4j 工作流双模式的 AI 网站生成系统
Zero Code Studio是一个基于Spring Boot和AI技术的零代码网站生成平台,支持双模式(LangChain4j工具调用和LangGraph4j工作流)代码生成。核心功能包括:流式对话闭环、工具调用可视化、记忆系统(Redis+MySQL)、多模型切换(支持DeepSeek/Qwen等)、定点修改和本地一键部署。技术架构采用分层设计,包含前端交互层、AI运行层和存储交付层,通过工作流编排实现智能路由、代码生成和质量检查。项目亮点在于工程化落地能力,包括分布式限流、精选缓存和完整的数据流闭环
2026-04-10 12:03:16
391
原创 一篇讲透:Spring Boot + Redisson + 注解 + AOP 实现接口限流(可直接落地)
String message() default "请求过于频繁,请稍后再试";rate:窗口内允许的请求数:窗口大小(秒)limitType:按 API、用户、IP 限流key:业务自定义前缀(可选)message:触发限流后返回文案@Aspect@Component@Slf4j@Resource@Resourceif (!if (!
2026-04-02 15:56:14
210
原创 简历保险箱:一款本地存储、快捷填表的 Chrome 简历助手
摘要: ResumeVault是一款面向求职者的浏览器扩展工具,旨在解决校招季重复填写简历表单的痛点。用户只需一次录入个人信息(包括教育、实习、项目经历等),数据将100%本地存储,支持通过侧边栏或快捷键(Alt+Shift+V)快速访问,点击字段即可一键复制到招聘网站表单。核心功能涵盖PDF/Word简历解析(本地处理)、JSON数据备份与恢复,并采用React+TypeScript技术栈开发,严格保障隐私(无网络请求、无数据上传)。支持Chrome/Edge浏览器,开源MIT协议。 关键词: 简历管理、
2026-03-11 15:01:04
459
原创 设计模式:带你用真实业务方法+Spring源码去理解模板 + 回调
本文介绍了模板+回调的设计模式及其应用。该模式将固定流程封装为模板,变化部分通过回调函数注入,解决了传统模板方法模式依赖继承的问题。文章通过Spring框架的TransactionTemplate和JdbcTemplate两个典型案例,展示了该模式如何以函数式接口+Lambda的形式实现:前者处理事务管理,后者处理JDBC操作,都通过回调函数实现核心业务逻辑。这种设计分离了固定流程与变化逻辑,提高了代码复用性和灵活性,是现代Java项目中常用的设计模式实现方式。
2026-02-10 10:51:53
370
原创 代码重构: 用实际的例子去讲解模版方法
摘要:模板方法模式适用于流程固定但部分步骤可变的场景。该模式通过父类定义固定流程(如代码文件保存的校验、创建目录等),将可变部分(如文件内容处理)交给子类实现。示例中,CodeFileSaverTemplate父类用final方法锁定流程顺序,子类只需实现saveFiles方法。相比if/switch方案,模板方法更易扩展(新增类型只需添加子类),避免代码臃肿。适用条件为流程顺序严格且变化点明确,不适用于流程差异过大或需频繁切换逻辑的场景。(150字)
2026-02-06 15:08:55
276
原创 代码重构: 实际的例子去讲解如何使用【策略模式+单一职责】去重构不断增长的业务代码
本文针对集中式代码解析器存在的问题提出重构方案。原始设计中,CodeParser类集中处理多种解析逻辑,导致职责过重、耦合度高、难以扩展。重构方案将解析行为抽象为统一接口CodeParser<T>,并为每种解析类型(HTML、CSS等)创建独立实现类。这种拆分显著提升了可维护性,降低了扩展成本,同时为未来演进(如引入适配器模式)预留空间。重构后系统符合单一职责原则和开闭原则,解决了原始设计中类膨胀、测试困难等问题。
2026-02-06 09:59:47
721
原创 SpringAI+RAG向量库+知识图谱+多模型路由+Docker打造SmartHR智能招聘助手
Smart-HR 是一款基于AI技术的智能招聘与面试助手系统,整合了Spring AI、Milvus向量数据库和Neo4j知识图谱等核心技术。系统提供两大核心功能:HR端通过Neo4j技能图谱实现简历与岗位的智能匹配,面试官端利用Milvus RAG检索生成专业面试题。采用适配器模式支持多模型切换(阿里云百炼/OpenAI),前后端分离架构(React+Spring Boot),并支持Docker Compose一键部署。项目适合学习AI集成、知识图谱应用和微服务开发的开发者,代码已开源在GitHub。
2026-01-28 17:10:24
688
1
原创 设计模式:不再手动 set DTO,采用 Builder 模式
本文对比了手动set和Builder模式在构建复杂对象时的差异。手动set方式存在代码冗余、可读性差、容易产生半成品对象、必填字段依赖约定、扩展成本高等问题。而Builder模式通过链式调用提供更好的可读性,确保对象构建的原子性,避免半成品对象,且扩展时只需新增方法而不影响原有代码。通过@Builder注解可快速实现Builder模式,使代码更简洁、健壮且易于维护。Builder模式是复杂对象构建场景的更优选择。
2026-01-27 16:20:52
142
原创 项目里接了多个第三方 SDK 后,如何使用适配器模式+策略模式优化?(Adapter + Strategy)
本文探讨了如何通过适配器模式+策略模式优化多SDK接入问题。当系统需要接入功能相似但接口不统一的第三方SDK时,传统if-else写法会导致代码臃肿。解决方案包括:1) 定义统一适配器接口AIModelAdapter,各SDK实现该接口;2) 通过ModelRegistry集中管理适配器;3) 使用ModelRouter根据条件选择适配器。这种组合模式适用于支付渠道、短信服务、AI模型切换等场景,Spring Cache的实现也采用了类似思路。最终业务层只需两行代码即可完成调用,实现了代码解耦和扩展性。
2026-01-27 15:13:07
569
原创 带你从业务代码了解在使用分布式锁后为什么需要乐观锁兜底? Redis在单机、主从复制、集群情况下的潜在一致性问题
Redis分布式锁在高并发场景下并非完全可靠,主从切换或集群环境下可能出现锁失效问题。文章指出Redis不具备强一致性,当主节点宕机时,未同步的锁数据会导致多个实例同时获取锁。解决方案是采用乐观锁机制兜底,通过版本号或状态条件实现并发控制。示例代码展示了基于版本号的乐观锁实现,确保数据更新的原子性。文章强调Redis锁的核心作用是降低并发而非保证绝对正确,必须结合数据库乐观锁才能确保业务安全。
2026-01-23 15:23:55
394
原创 实际例子理解Redis 缓存与 MySQL 数据一致性 以及常见的细节
本文探讨了Redis与MySQL数据一致性的工程实践,重点分析了Cache Aside模式的读写流程。核心结论是写操作必须遵循"更新DB→删除缓存"的顺序,否则并发场景下会出现旧值回写问题。针对缓存删除后的缓存击穿风险,提出了SingleFlight解决方案:通过合并并发请求,确保同一key只有一个请求访问数据库。文章提供了Spring Boot实现示例,包含线程池管理、空值缓存等优化措施。该方案能有效降低数据库压力,保证数据一致性,适用于高并发场景。
2026-01-22 16:05:06
646
原创 为什么Java 接口中的存在 Static 和 Default 方法?
本文探讨了Java 8引入的接口static和default方法的作用与使用场景。default方法主要用于向后兼容,允许在不破坏现有实现类的情况下为接口添加新功能,同时解决了多重继承的冲突问题。static方法则提供了一种轻量级的工具方法组织方式,替代了传统的工具类模式。文章通过Vehicle接口等实例展示了这些特性的实际应用,并分析了它们在Java集合框架中的典型用法。最后指出这些特性虽然违背了纯接口理论,但在保持向后兼容性方面是个很好的折中方案。
2025-11-19 10:55:58
492
原创 一文带你看懂 Java 方法引用 (::) (: 有点难懂不怕用实际公司业务代码带你理解
[摘要] Java方法引用(::)是Lambda表达式的简化形式,主要用于简化只调用一个已有方法的Lambda写法。文章通过演变历程(匿名类→Lambda→方法引用)和实际业务代码,详细解析了四种方法引用:静态方法引用(类名::静态方法)、对象实例方法引用(对象::方法)、类实例方法引用(类名::实例方法)和构造方法引用(类名::new)。重点强调了参数个数由函数式接口决定,以及"类名::实例方法"中第一个参数自动成为this的特性。最后通过对比表展示了不同写法的等价关系。
2025-11-17 18:06:27
1017
原创 函数式接口+default接口+springAi 中的ducumentReader去理解为什么存在default接口的形式
本文介绍了Java 8中接口的两个重要特性:函数式接口和default方法。函数式接口是仅含一个抽象方法的接口,支持Lambda表达式,常见的有Supplier、Consumer等接口。default方法允许接口包含实现方法,主要用于向后兼容。文章通过DocumentReader接口案例展示了如何结合这两个特性设计灵活易用的API,既保持语义清晰又支持函数式编程。这些特性显著提升了Java的灵活性和代码可维护性。
2025-11-15 19:50:23
464
原创 缓存三大问题详解与工业级解决方案
缓存系统三大经典问题及解决方案摘要: 缓存系统面临三大核心问题:1)缓存穿透(查询不存在数据导致数据库压力)解决方案包括布隆过滤器、空值缓存和参数校验;2)缓存击穿(热点key失效时的并发冲击)可通过分布式锁、本地锁、数据预热和永不过期策略应对;3)缓存雪崩(大量key同时过期或缓存宕机)建议采用随机过期时间、多级缓存架构和缓存预热措施。工业级场景推荐组合方案:参数校验+布隆过滤器+多级缓存+分布式锁,并配合异步更新机制,可有效保障系统高可用性。
2025-07-09 15:03:37
929
2
原创 Redis的多并发实际业务场景下的使用分析:布隆过滤器
本文介绍了布隆过滤器的原理及其在Redis缓存中的实践应用。布隆过滤器是一种空间高效的概率数据结构,通过位数组和哈希函数快速判断元素是否存在。文章详细讲解了布隆过滤器的工作流程,包括插入和查询操作,并解释了"可能存在"和"一定不存在"的原理。通过Java代码示例展示了如何在项目中集成布隆过滤器,包括Redisson的配置和使用。重点阐述了布隆过滤器在缓存系统中的应用,提出"三级防护体系"的最佳实践方案,以商品详情页为例,说明如何通过布隆过滤器防止缓
2025-07-09 09:25:23
786
原创 Redis常用数据结构以及多并发场景下的使用分析:Sorted Set(ZSet)类型
这篇文章分析了Redis中的Sorted List(有序集合)数据结构。其底层实现根据数据量大小采用两种方式:元素较少时使用压缩列表(ziplist),元素较多时采用跳表(skiplist)结合哈希表的双结构设计。跳表通过多层索引实现高效的范围查询和排序,时间复杂度为O(log n),相比平衡树实现更简单且性能稳定。文章还通过示例演示了跳表的插入过程,并对比了跳表与其他数据结构的优势。
2025-07-08 16:00:20
1235
原创 Redis常用数据结构以及多并发场景下的使用分析:Set类型
本文分析了Redis中Set类型的底层实现与使用场景。Set底层采用整数集合(intset)和哈希表(hashtable)两种结构,当元素为整数且数量较少时使用连续数组存储,否则转为哈希表实现。Set具有高效的查找、插入和删除操作(O(1)时间复杂度),并支持集合运算。文中通过三个典型用例展示了Set的实际应用:在线用户统计(去重)、用户标签相似度计算(交集运算)和秒杀活动参与者去重(唯一性校验)。这些场景充分利用了Set的自动去重特性和集合运算能力,在保证数据唯一性的同时提高了系统性能。
2025-07-07 19:43:44
902
原创 Redis常用数据结构以及多并发场景下的使用分析:list类型
本文介绍了Redis中List数据结构的实现原理及其应用场景。Redis List在不同版本中的底层结构演变:早期使用ziplist+linkedlist,3.2版本后引入quicklist(ziplist+linkedlist组合),5.x后成为默认实现。quicklist结合了ziplist内存紧凑和linkedlist插入删除快的优点,通过多个ziplist节点双向连接实现。文章还列举了两个典型应用场景:1)维护用户最近访问记录(利用LPUSH和TRIM命令);2)构建简单消息队列(LPUSH/RPO
2025-07-07 15:02:25
947
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅