


[{"content":" 项目简介 # 智库RAG是一个基于私有知识库的企业级智能对话平台，允许用户上传文档构建专属知识空间，并通过自然语言交互方式查询和获取知识。结合大语言模型和向量检索技术，用户可以通过对话的形式与自己的知识库进行高效交互。\n技术栈 # Spring Boot、MySQL、Redis、Apache Tika、Ollama、Elasticsearch、MinIO、Kafka、Spring Security、WebSocket\n核心技术亮点 # BitMap分片状态管理 — 使用 Redis BitMap 存储文件分片上传状态，1000个分片仅需125字节 双引擎搜索 — Elasticsearch + IK分词器 + 豆包Embedding（2048维）实现「关键词+语义」双引擎搜索，KNN向量召回 + BM25重排序 大文件断点续传 — Redis + MinIO 实现，1GB文件上传从15s降至3s Kafka异步流水线 — 文档上传、解析、向量化全流程异步解耦，500M文件上传仅需200ms 多轮对话管理 — 基于Redis的会话机制，7天过期，保障多轮对话上下文完整性 ","date":"July 1, 2025","externalUrl":null,"permalink":"/projects/smartpai/","section":"Projects","summary":"项目简介 # 智库RAG是一个基于私有知识库的企业级智能对话平台，允许用户上传文档构建专属知识空间，并通过自然语言交互方式查询和获取知识。结合大语言模型和向量检索技术，用户可以通过对话的形式与自己的知识库进行高效交互。\n技术栈 # Spring Boot、MySQL、Redis、Apache Tika、Ollama、Elasticsearch、MinIO、Kafka、Spring Security、WebSocket\n核心技术亮点 # BitMap分片状态管理 — 使用 Redis BitMap 存储文件分片上传状态，1000个分片仅需125字节 双引擎搜索 — Elasticsearch + IK分词器 + 豆包Embedding（2048维）实现「关键词+语义」双引擎搜索，KNN向量召回 + BM25重排序 大文件断点续传 — Redis + MinIO 实现，1GB文件上传从15s降至3s Kafka异步流水线 — 文档上传、解析、向量化全流程异步解耦，500M文件上传仅需200ms 多轮对话管理 — 基于Redis的会话机制，7天过期，保障多轮对话上下文完整性 ","title":"智库RAG知识库系统","type":"projects"},{"content":" 项目简介 # 技术派是一个前后端分离的、面向互联网开发者的技术内容分享与交流平台，包括前端PC和管理后台，通过文章、教程、AI助手等产品和服务，旨在打造一个激发开发者创作灵感的技术社区。\n技术栈 # Spring Boot、MyBatis-Plus、MySQL、Redis、RabbitMQ、Elasticsearch\n核心技术 # 扫码登录 — 验证码 + 公众号扫码回调实现自动登录 消息异步 — RabbitMQ 处理评论、点赞、收藏消息，提升系统效率 缓存优化 — 自旋锁防缓存击穿，Caffeine + Redis 多级缓存，单节点 QPS 提升至 3000+ 轻量级白名单 — Redis Set 实现作者白名单，提升发布体验 链路追踪 — AOP + TraceID 记录接口访问日志，实现全链路监控 ","date":"September 1, 2024","externalUrl":null,"permalink":"/projects/tech-community/","section":"Projects","summary":"项目简介 # 技术派是一个前后端分离的、面向互联网开发者的技术内容分享与交流平台，包括前端PC和管理后台，通过文章、教程、AI助手等产品和服务，旨在打造一个激发开发者创作灵感的技术社区。\n技术栈 # Spring Boot、MyBatis-Plus、MySQL、Redis、RabbitMQ、Elasticsearch\n核心技术 # 扫码登录 — 验证码 + 公众号扫码回调实现自动登录 消息异步 — RabbitMQ 处理评论、点赞、收藏消息，提升系统效率 缓存优化 — 自旋锁防缓存击穿，Caffeine + Redis 多级缓存，单节点 QPS 提升至 3000+ 轻量级白名单 — Redis Set 实现作者白名单，提升发布体验 链路追踪 — AOP + TraceID 记录接口访问日志，实现全链路监控 ","title":"技术派社区","type":"projects"},{"content":"","date":"March 10, 2026","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"March 10, 2026","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"March 10, 2026","externalUrl":null,"permalink":"/tags/spring-cloud/","section":"Tags","summary":"","title":"Spring Cloud","type":"tags"},{"content":"","date":"March 10, 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"March 10, 2026","externalUrl":null,"permalink":"/tags/%E6%9E%B6%E6%9E%84%E9%87%8D%E6%9E%84/","section":"Tags","summary":"","title":"架构重构","type":"tags"},{"content":"","date":"March 10, 2026","externalUrl":null,"permalink":"/tags/%E5%AE%9E%E4%B9%A0/","section":"Tags","summary":"","title":"实习","type":"tags"},{"content":"","date":"March 10, 2026","externalUrl":null,"permalink":"/categories/%E5%AE%9E%E6%88%98%E7%BB%8F%E9%AA%8C/","section":"Categories","summary":"","title":"实战经验","type":"categories"},{"content":"","date":"March 10, 2026","externalUrl":null,"permalink":"/tags/%E5%BE%AE%E6%9C%8D%E5%8A%A1/","section":"Tags","summary":"","title":"微服务","type":"tags"},{"content":" 背景 # 2025年6月到2026年3月，我在亚信科技实习，参与了公司核心号卡业务系统的微服务重构项目。\n这个项目是将一个基于 Spring Boot 的单体应用，逐步迁移至 Spring Cloud 微服务架构。作为实习生，我主要负责网关层优化、服务间通信、分布式事务等模块的设计与开发。\n一、网关统一管理与路由优化 # 系统重构的第一步是建立统一的API网关。我们基于 Spring Cloud Gateway 对所有外部请求进行统一管理。\n核心工作 # 路由转发优化：对原有路由规则进行二次封装，提升网关转发效率 全局过滤器：自定义全局过滤器，统一处理接口鉴权和请求耗时统计 异常处理：排查并修复空指针异常、请求404、网关转发失败等问题 @Component public class AuthGlobalFilter implements GlobalFilter, Ordered { @Override public Mono\u0026lt;Void\u0026gt; filter(ServerWebExchange exchange, GatewayFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); // 白名单路径直接放行 if (isWhiteList(path)) { return chain.filter(exchange); } // Token 校验 String token = exchange.getRequest() .getHeaders().getFirst(\u0026#34;Authorization\u0026#34;); if (token == null || !validateToken(token)) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } // 耗时统计 long start = System.currentTimeMillis(); return chain.filter(exchange).doFinally(signal -\u0026gt; { long cost = System.currentTimeMillis() - start; log.info(\u0026#34;[Gateway] {} cost: {}ms\u0026#34;, path, cost); }); } @Override public int getOrder() { return -1; } } ⚠️ 实际生产中，全局过滤器的 order 值要合理设置，确保鉴权过滤器优先于业务过滤器执行，同时要处理好白名单和健康检查接口的放行逻辑。 二、服务间通信与熔断降级 # 微服务拆分后，服务间调用变得频繁。我们基于 OpenFeign 封装外部请求接口进行远程调用，并使用 Sentinel 实现自定义降级策略。\n@FeignClient( name = \u0026#34;card-service\u0026#34;, fallbackFactory = CardServiceFallbackFactory.class ) public interface CardServiceClient { @GetMapping(\u0026#34;/card/query\u0026#34;) Result\u0026lt;CardVO\u0026gt; queryCardInfo(@RequestParam(\u0026#34;cardNo\u0026#34;) String cardNo); } @Component public class CardServiceFallbackFactory implements FallbackFactory\u0026lt;CardServiceClient\u0026gt; { @Override public CardServiceClient create(Throwable cause) { return new CardServiceClient() { @Override public Result\u0026lt;CardVO\u0026gt; queryCardInfo(String cardNo) { log.warn(\u0026#34;卡服务降级触发: {}\u0026#34;, cause.getMessage()); return Result.fail(\u0026#34;服务繁忙，请稍后重试\u0026#34;); } }; } } 降级策略的核心思路：当某个服务不可用时，不直接抛异常，而是返回一个兜底结果，保证用户侧的体验不受影响。\n三、Seata 分布式事务保障一致性 # 在微服务场景下，任务审批流程涉及多个服务协同操作。为保障数据一致性，我们采用 Seata AT 模式 实现分布式事务：\nsequenceDiagram participant Client as 客户端 participant GW as Gateway participant Approve as 审批服务 participant Project as 项目服务 participant TC as Seata TC Client-\u0026gt;\u0026gt;GW: 提交审批请求 GW-\u0026gt;\u0026gt;Approve: 创建审批单 Approve-\u0026gt;\u0026gt;TC: 开启全局事务 Approve-\u0026gt;\u0026gt;Project: 更新项目状态 Project-\u0026gt;\u0026gt;TC: 注册分支事务 Project--\u0026gt;\u0026gt;Approve: 操作成功 Approve-\u0026gt;\u0026gt;TC: 全局提交/回滚 Approve--\u0026gt;\u0026gt;GW: 返回结果 GW--\u0026gt;\u0026gt;Client: 响应 Seata AT 模式最大的好处是对业务代码零侵入，只需要加一个 @GlobalTransactional 注解，框架会自动管理事务的提交和回滚。\n四、LiteFlow 可视化业务编排 # 在号卡业务中，很多流程涉及多个步骤的串联。我们引入 LiteFlow 框架，通过可视化配置界面来编排业务逻辑：\n\u0026lt;chain name=\u0026#34;cardProcessChain\u0026#34;\u0026gt; THEN( validateParams, checkCardStatus, doBusiness, sendNotification ); \u0026lt;/chain\u0026gt; 这样做的好处是业务人员可以通过界面拖拽调整流程顺序，不需要每次都改代码重新发布。\n实习收获 # 这9个月让我从「能写CRUD」成长为「能参与微服务架构设计」：\n能力维度 成长 架构思维 理解微服务设计原则，能参与技术方案评审 排错能力 独立排查生产环境的空指针、404、网关转发等问题 工程实践 LiteFlow编排、Docker部署、CI/CD流程 沟通协作 与产品、测试、前端团队高效协作 ","date":"March 10, 2026","externalUrl":null,"permalink":"/posts/asiainfo-internship/","section":"Posts","summary":"背景 # 2025年6月到2026年3月，我在亚信科技实习，参与了公司核心号卡业务系统的微服务重构项目。\n这个项目是将一个基于 Spring Boot 的单体应用，逐步迁移至 Spring Cloud 微服务架构。作为实习生，我主要负责网关层优化、服务间通信、分布式事务等模块的设计与开发。\n一、网关统一管理与路由优化 # 系统重构的第一步是建立统一的API网关。我们基于 Spring Cloud Gateway 对所有外部请求进行统一管理。\n核心工作 # 路由转发优化：对原有路由规则进行二次封装，提升网关转发效率 全局过滤器：自定义全局过滤器，统一处理接口鉴权和请求耗时统计 异常处理：排查并修复空指针异常、请求404、网关转发失败等问题 @Component public class AuthGlobalFilter implements GlobalFilter, Ordered { @Override public Mono\u003cVoid\u003e filter(ServerWebExchange exchange, GatewayFilterChain chain) { String path = exchange.getRequest().getURI().getPath(); // 白名单路径直接放行 if (isWhiteList(path)) { return chain.filter(exchange); } // Token 校验 String token = exchange.getRequest() .getHeaders().getFirst(\"Authorization\"); if (token == null || !validateToken(token)) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } // 耗时统计 long start = System.currentTimeMillis(); return chain.filter(exchange).doFinally(signal -\u003e { long cost = System.currentTimeMillis() - start; log.info(\"[Gateway] {} cost: {}ms\", path, cost); }); } @Override public int getOrder() { return -1; } } ⚠️ 实际生产中，全局过滤器的 order 值要合理设置，确保鉴权过滤器优先于业务过滤器执行，同时要处理好白名单和健康检查接口的放行逻辑。 二、服务间通信与熔断降级 # 微服务拆分后，服务间调用变得频繁。我们基于 OpenFeign 封装外部请求接口进行远程调用，并使用 Sentinel 实现自定义降级策略。\n","title":"亚信科技实习总结：从单体到微服务的架构重构之路","type":"posts"},{"content":"","date":"March 9, 2026","externalUrl":null,"permalink":"/tags/azure/","section":"Tags","summary":"","title":"Azure","type":"tags"},{"content":"","date":"March 9, 2026","externalUrl":null,"permalink":"/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":"","date":"March 9, 2026","externalUrl":null,"permalink":"/tags/https/","section":"Tags","summary":"","title":"HTTPS","type":"tags"},{"content":"","date":"March 9, 2026","externalUrl":null,"permalink":"/tags/nginx/","section":"Tags","summary":"","title":"Nginx","type":"tags"},{"content":"","date":"March 9, 2026","externalUrl":null,"permalink":"/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/","section":"Categories","summary":"","title":"技术笔记","type":"categories"},{"content":" 从零开始，用学生福利白嫖云服务器，一步步踩坑把博客部署上线。 ☁️ Azure HK 🐳 Docker 🔒 HTTPS 💰 零成本 背景 # 搞后端开发，如果项目只能在本地跑，就像在健身房练卧推却从不参加比赛——练得再好也没人看到。这篇文章完整记录了我利用学生身份申请 Azure 免费云资源，一步步踩坑排雷，最终通过 Docker 容器化部署 + Let\u0026rsquo;s Encrypt SSL 证书，把 Hugo 博客跑上线的全过程。\n第一步：薅微软羊毛 —— Azure 学生服务器 # 利用学校教育邮箱，开通了 Azure for Students 福利：\n配置项 选择 区域 香港（低延迟，免备案） 系统 Ubuntu Server 认证 SSH 密钥对（.pem） 拿到公网 IP 后，本以为就能起飞了，结果真正的考验才刚开始。\n第二步：Windows 的 SSH 权限陷阱 # 拿到私钥后敲下 SSH 命令，直接被红字报错糊了一脸：\nWARNING: UNPROTECTED PRIVATE KEY FILE! Permissions for \u0026#39;my_hk_key.pem\u0026#39; are too open. 原因：Linux 对私钥文件权限要求极严，不允许其他用户读取。但 Windows 默认文件权限带有继承属性，非常宽泛，SSH 客户端出于安全机制直接拒绝连接。\n解决方法：\n右键 .pem 文件 → 【属性】→ 【安全】→ 【高级】 点击【禁用继承】，删除所有其他用户权限 仅保留当前 Windows 用户的【完全控制】权限 再次连接，终于看到了：\nazureuser@Huangzy-HK-Server:~$ 第三步：跨服搬砖 —— SCP 传输项目文件 # 连上服务器后敲 docker compose up -d，报错 no configuration file provided。用 find 一搜——服务器里根本没有我的代码。\n这是本地开发走向云端部署最容易犯的思维跳跃：服务器和本地电脑是物理隔离的，SSH 只是拿到了钥匙，行李还得自己搬。\n用 scp 把项目文件空投到服务器：\n# 传输单个文件 scp -i my_hk_key.pem file.txt azureuser@\u0026lt;IP\u0026gt;:/home/azureuser/ # 传输整个目录 scp -r -i my_hk_key.pem ./project azureuser@\u0026lt;IP\u0026gt;:/home/azureuser/ ⚠️ 经常犯的错误：在本地的 E 盘上敲 SSH 命令，然后去服务器里找 E 盘的文件——它们不在同一个世界。永远记住：本地是本地，服务器是服务器。 第四步：Docker 容器化部署 # 文件到位后，cd 进项目目录，执行部署：\ncd /home/azureuser sudo docker compose up -d 看着一排排 Pulling 和 Started 亮起，服务在容器内跑起来了。\n但这时候通过浏览器访问，要么端口不通，要么显示空白。还需要配置反向代理。\n第五步：域名解析 + HTTPS 证书 # 不带小绿锁的网站在互联网上等于\u0026quot;裸奔\u0026quot;。\n1. 域名解析 # 在域名提供商后台添加 A 记录，将域名指向服务器公网 IP：\n类型: A 主机: @ 值: 你的服务器IP TTL: 600 2. 申请 SSL 证书 # 使用 Let\u0026rsquo;s Encrypt 免费证书，通过 certbot 工具申请：\n# 安装 certbot sudo apt install -y certbot # 停掉占用 80 端口的服务 sudo docker stop nginx # 申请证书（standalone 模式） sudo certbot certonly --standalone \\ -d huzen.me -d www.huzen.me \\ --email your-email@qq.com \\ --agree-tos --no-eff-email 申请成功后，证书自动保存到：\n/etc/letsencrypt/live/huzen.me/fullchain.pem /etc/letsencrypt/live/huzen.me/privkey.pem 3. Nginx 配置 HTTPS # # HTTP → HTTPS 重定向 server { listen 80; server_name huzen.me www.huzen.me; location / { return 301 https://$host$request_uri; } } # HTTPS 主服务 server { listen 443 ssl http2; server_name huzen.me www.huzen.me; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } } 4. 自动续期 # certbot 安装时已自动配置 cron 定时任务，证书到期前会自动续期，无需手动维护。\n第六步：AI 赋能 —— OpenClaw 打造全自动运维博客 # 服务器跑起来了，小绿锁亮了，但这仅仅是底层基建。对于一名走向职场的 Java 后端选手来说，博客绝不仅仅是碎碎念的日记本，而是直面面试官的动态简历和技术实战橱窗。\n正如本站首页所写：本博客由 OpenClaw 全自动搭建与运维，操作者仅负责需求指挥，未参与任何安装与编码工作。\n1. 投喂核心硬核资产：\n我没有让 AI 凭空捏造废话，而是把最真实的底层业务物料交给了它：我在亚信科技做 Spring Cloud 微服务重构的思考、技术派社区将 QPS 从 800 优化到 3000+ 的多级缓存调优日志，以及从 0 到 1 搭建企业级 RAG 知识库系统（Kafka + DeepSeek）的架构方案，全量投喂给了 OpenClaw。\n2. 全网调研与对标：\n单纯罗列代码片段对面试官毫无吸引力。我给 OpenClaw 下达指令，让它去全网搜索并拆解最高赞的后端技术博客。它不仅自动帮我敲定了 Hugo 静态框架与极客风的 Blowfish 主题，还化身资深技术面试官，严格按照 STAR 法则（情境、任务、行动、结果），将我零碎的痛点排查链路重构成了大厂标准的业务叙事逻辑。\n3. 涌现与内容重塑：\n吸收了顶级技术文章的排版骨架后，OpenClaw 迅速发力。短短几十秒内，它把我的个人简历和底层代码无缝融合，自动生成了《企业级 RAG 知识库系统全链路实现》、《技术派社区性能优化实战》等几篇高质量的复盘文章，并完成了自动排版与部署闭环。\n结果： 原本最头疼的\u0026quot;如何向面试官优雅地展示高并发与微服务实战能力\u0026quot;，在 AI 工作流的介入下迎刃而解。用 Docker 跑通服务器基建，用 OpenClaw 零代码生成并维护面试级技术沉淀。这，就是属于 AI 时代后端开发者的破局名片！\n部署架构总览 # graph TB A[用户浏览器] --\u0026gt;|HTTPS| B[Nginx 反向代理] B --\u0026gt;|静态文件| C[Hugo 博客] D[Let\u0026#39;s Encrypt] --\u0026gt;|SSL 证书| B E[certbot] --\u0026gt;|自动续期| D F[Azure 香港 VM] --\u0026gt; B F --\u0026gt; C F --\u0026gt; E 常见踩坑记录 # 坑 现象 解决 私钥权限过宽 SSH 拒绝连接 Windows 高级安全设置禁用继承 端口被占用 Docker 启动失败 ss -tlnp 查占用，停掉旧容器 SSL 证书缺失 Nginx 启动失败 先申请证书再配置 HTTPS 浏览器缓存 看到的是旧内容 Ctrl+Shift+Delete 清缓存，或无痕模式 代码没传到服务器 docker compose 报错 scp 手动传输，本地≠服务器 总结 # 走通这套全流程，算是真正摸到了后端工程化部署的门道。核心就五步：搞服务器 → 传代码 → 容器化 → 配 HTTPS → AI 全自动运维。每一步都有坑，但每个坑踩过一次就再也不会忘。\n纸上得来终觉浅，绝知此事要躬行。\n","date":"March 9, 2026","externalUrl":null,"permalink":"/posts/azure-deploy-blog/","section":"Posts","summary":" 从零开始，用学生福利白嫖云服务器，一步步踩坑把博客部署上线。 ☁️ Azure HK 🐳 Docker 🔒 HTTPS 💰 零成本 背景 # 搞后端开发，如果项目只能在本地跑，就像在健身房练卧推却从不参加比赛——练得再好也没人看到。这篇文章完整记录了我利用学生身份申请 Azure 免费云资源，一步步踩坑排雷，最终通过 Docker 容器化部署 + Let’s Encrypt SSL 证书，把 Hugo 博客跑上线的全过程。\n","title":"零成本上云：从 Azure 学生福利到 HTTPS 博客的完整部署记录","type":"posts"},{"content":"","date":"March 9, 2026","externalUrl":null,"permalink":"/tags/%E8%BF%90%E7%BB%B4%E9%83%A8%E7%BD%B2/","section":"Tags","summary":"","title":"运维部署","type":"tags"},{"content":"","date":"September 15, 2025","externalUrl":null,"permalink":"/tags/ai/","section":"Tags","summary":"","title":"AI","type":"tags"},{"content":"","date":"September 15, 2025","externalUrl":null,"permalink":"/tags/elasticsearch/","section":"Tags","summary":"","title":"Elasticsearch","type":"tags"},{"content":"","date":"September 15, 2025","externalUrl":null,"permalink":"/tags/kafka/","section":"Tags","summary":"","title":"Kafka","type":"tags"},{"content":"","date":"September 15, 2025","externalUrl":null,"permalink":"/tags/rag/","section":"Tags","summary":"","title":"RAG","type":"tags"},{"content":"","date":"September 15, 2025","externalUrl":null,"permalink":"/tags/spring-boot/","section":"Tags","summary":"","title":"Spring Boot","type":"tags"},{"content":" 从文档上传到智能问答，拆解企业级 RAG 系统的每一步技术实现。 🤖 RAG架构 📊 Elasticsearch 📨 Kafka ⚡ 200ms响应 项目概述 # 智库RAG 是我独立设计并开发的企业级智能知识库管理系统。用户可以上传各种格式的文档（Word、PDF、TXT等），系统会自动解析、向量化并建立索引，然后通过自然语言对话的方式查询知识库，获得基于自身文档的 AI 生成回答。\n技术栈 # 层级 技术选型 后端框架 Spring Boot 3.4.2 (Java 17) 搜索引擎 Elasticsearch 8.10 + IK分词器 向量模型 豆包 Embedding（2048维） 大语言模型 DeepSeek API / 本地 Ollama 消息队列 Apache Kafka 缓存 Redis 文件存储 MinIO 文档解析 Apache Tika 安全认证 Spring Security + JWT 实时通信 WebSocket 前端 Vue 3 + TypeScript + Naive UI 系统架构 # graph TB subgraph 用户端 A[Vue3 + Naive UI] end subgraph API层 B[Spring Boot REST API] C[WebSocket Handler] end subgraph 异步流水线 D[Kafka Producer] E[Tika 文档解析] F[豆包 Embedding 向量化] G[Elasticsearch 索引] end subgraph RAG检索 H[用户提问] I[Embedding转换] J[KNN向量召回] K[BM25关键词匹配] L[分数融合重排序] M[增强Prompt构建] N[DeepSeek生成回答] end subgraph 基础设施 O[(MySQL)] P[(Redis)] Q[(MinIO)] R[(Elasticsearch)] end A --\u0026gt; B A --\u0026gt; C B --\u0026gt; D D --\u0026gt; E --\u0026gt; F --\u0026gt; G --\u0026gt; R H --\u0026gt; I --\u0026gt; J H --\u0026gt; K J --\u0026gt; L --\u0026gt; M --\u0026gt; N B --\u0026gt; O B --\u0026gt; P B --\u0026gt; Q 核心实现 # 一、BitMap 分片状态管理 # 这是我在这个项目中最满意的设计之一。\n痛点：大文件上传时，需要记录每个分片的上传状态。如果用 HashMap，1000个分片大约需要 40KB。\n方案：使用 Redis BitMap，每个分片只用1个bit表示：\n@Service public class ChunkUploadService { private static final String UPLOAD_KEY = \u0026#34;upload:\u0026#34;; /** * 标记分片已上传 * 1000个分片仅需 125 字节 */ public void markUploaded(String fileId, int chunkIndex) { String key = UPLOAD_KEY + fileId; redisTemplate.opsForValue().setBit(key, chunkIndex, true); } /** * 检查分片状态（秒传判断） */ public boolean isUploaded(String fileId, int chunkIndex) { return Boolean.TRUE.equals( redisTemplate.opsForValue() .getBit(UPLOAD_KEY + fileId, chunkIndex) ); } /** * 统计已上传分片数 */ public long countUploaded(String fileId) { return redisTemplate.execute( (RedisCallback\u0026lt;Long\u0026gt;) con -\u0026gt; con.stringCommands() .bitCount( (UPLOAD_KEY + fileId).getBytes() ) ); } } 结合 Redis 缓存 + MinIO 断点续传，1GB 文件上传耗时从 15s 降至 3s。\n⚠️ BitMap 的 setBit 操作是 O(1) 的，但 bitCount 是 O(N) 的。对于分片数量在万级以内的场景，性能完全没问题。如果分片数量达到百万级，建议使用 HyperLogLog 做近似统计。 二、双引擎检索：关键词 + 语义融合 # RAG 系统最核心的部分——如何准确召回相关文档。单纯用关键词搜索，同义词和语义相似的问题召回差；单纯用向量搜索，精确匹配又不如关键词。两者结合效果最好：\ngraph LR A[用户提问] --\u0026gt; B[豆包Embedding\u0026lt;br/\u0026gt;转为2048维向量] A --\u0026gt; C[IK分词器\u0026lt;br/\u0026gt;提取关键词] B --\u0026gt; D[Elasticsearch KNN\u0026lt;br/\u0026gt;向量语义召回] C --\u0026gt; E[ES Match Query\u0026lt;br/\u0026gt;关键词匹配] D --\u0026gt; F[分数融合 + 重排序] E --\u0026gt; F F --\u0026gt; G[Top-K 相关片段] SearchRequest request = SearchRequest.of(sr -\u0026gt; sr .index(\u0026#34;knowledge_base\u0026#34;) .size(10) .query(q -\u0026gt; q.bool(b -\u0026gt; b // 向量语义搜索 .should(s -\u0026gt; s.knn(k -\u0026gt; k .field(\u0026#34;embedding\u0026#34;) .queryVector(embeddingVector) .numCandidates(50) .k(10) )) // BM25 关键词搜索 .should(s -\u0026gt; s.multiMatch(m -\u0026gt; m .fields(\u0026#34;title\u0026#34;, \u0026#34;content\u0026#34;) .query(queryText) .type(TextQueryType.BestFields) )) .minimumShouldMatch(\u0026#34;1\u0026#34;) )) ); 💡 为什么是 2048 维？豆包 Embedding 模型在 2048 维时效果和性能的平衡点最好。维度太低语义信息丢失，太高则检索延迟增加且存储成本翻倍。 三、Kafka 异步文档处理流水线 # 文档上传后不需要同步等待处理完成，通过 Kafka 解耦：\nsequenceDiagram participant 用户 participant API participant Kafka participant Consumer participant ES 用户-\u0026gt;\u0026gt;API: 上传文档 API-\u0026gt;\u0026gt;Kafka: 发送处理事件 API--\u0026gt;\u0026gt;用户: 200 OK（响应 \u0026lt; 200ms） Note over Kafka,ES: 异步流水线 Kafka-\u0026gt;\u0026gt;Consumer: 消费事件 Consumer-\u0026gt;\u0026gt;Consumer: Tika 解析文档 Consumer-\u0026gt;\u0026gt;Consumer: 豆包 Embedding 向量化 Consumer-\u0026gt;\u0026gt;ES: 写入索引 // Producer：上传即返回 @PostMapping(\u0026#34;/upload\u0026#34;) public Result\u0026lt;String\u0026gt; upload(MultipartFile file) { String fileId = generateId(); minioService.upload(file, fileId); kafkaTemplate.send(\u0026#34;doc-process\u0026#34;, new DocProcessEvent(fileId, file.getName())); return Result.ok(fileId); // \u0026lt; 200ms } // Consumer：异步处理 @KafkaListener(topics = \u0026#34;doc-process\u0026#34;) public void process(DocProcessEvent event) { File file = minioService.download(event.getFileId()); String text = tikaParser.parse(file); float[] vector = embeddingClient.embed(text); esService.index(event.getFileId(), text, vector); } 经测试，500MB 文件上传响应仅需 200ms（之前是阻塞等待处理完成的）。\n四、多轮对话上下文管理 # 用户和知识库对话时，需要保持上下文连贯性。使用 Redis List 存储对话历史，7天自动过期：\n@Service public class ChatHistoryService { private static final Duration TTL = Duration.ofDays(7); public void append(String sessionId, ChatMessage msg) { String key = \u0026#34;chat:\u0026#34; + sessionId; redisTemplate.opsForList().rightPush(key, msg); redisTemplate.expire(key, TTL); } public List\u0026lt;ChatMessage\u0026gt; getRecent(String sessionId, int rounds) { String key = \u0026#34;chat:\u0026#34; + sessionId; Long size = redisTemplate.opsForList().size(key); if (size == null || size == 0) return List.of(); int end = size.intValue() - 1; int start = Math.max(0, end - rounds * 2 + 1); return redisTemplate.opsForList().range(key, start, end); } } 性能数据 # 指标 优化前 优化后 提升 1GB文件上传 15s 3s 5x 500MB上传响应 阻塞等待 200ms 异步化 分片状态存储 Hash ~40KB BitMap 125B 99%↓ 对话上下文 每次查库 Redis缓存 实时 总结 # 这个项目让我从「会用Spring Boot写接口」跨越到了「能独立设计一个完整系统」。最大的收获不是学会某个具体技术，而是理解了如何用异步、缓存、消息队列这些手段来解决真实问题——BitMap 不是炫技而是真的省了 99% 的存储，Kafka 不是跟风而是真的把响应从秒级压到了毫秒级。\n","date":"September 15, 2025","externalUrl":null,"permalink":"/posts/rag-knowledge-base/","section":"Posts","summary":" 从文档上传到智能问答，拆解企业级 RAG 系统的每一步技术实现。 🤖 RAG架构 📊 Elasticsearch 📨 Kafka ⚡ 200ms响应 项目概述 # 智库RAG 是我独立设计并开发的企业级智能知识库管理系统。用户可以上传各种格式的文档（Word、PDF、TXT等），系统会自动解析、向量化并建立索引，然后通过自然语言对话的方式查询知识库，获得基于自身文档的 AI 生成回答。\n","title":"企业级RAG知识库系统：从文档到智能问答的全链路实现","type":"posts"},{"content":"","date":"September 15, 2025","externalUrl":null,"permalink":"/categories/%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98/","section":"Categories","summary":"","title":"项目实战","type":"categories"},{"content":"","date":"July 1, 2025","externalUrl":null,"permalink":"/tags/java/","section":"Tags","summary":"","title":"Java","type":"tags"},{"content":"","date":"July 1, 2025","externalUrl":null,"permalink":"/projects/","section":"Projects","summary":"","title":"Projects","type":"projects"},{"content":" 👋 你好，我是黄振宇 # 一名 Java后端开发工程师，同时对 AI应用开发 充满热情。\n🎓 教育背景 # 广东白云学院 — 全日制本科 · 软件工程 · 26应届本科生 💼 实习经历 # 亚信科技控股有限公司 (2025.06 - 2026.03)\n参与公司核心微服务重构项目，负责业务系统重构，将基于 Spring Boot 的单体应用迁移至 Spring Cloud 微服务架构。\n优化网关路由转发逻辑，基于 Spring Cloud Gateway 实现统一鉴权和耗时统计 基于 LiteFlow 框架进行数据封装，可视化配置简化业务逻辑 基于 OpenFeign + Sentinel 实现服务间通信与熔断降级 采用 Seata 分布式事务 AT 模式，保障跨服务事务一致性 🛠️ 技术栈 # 领域 技术 语言 Java 17 框架 Spring Boot、Spring Cloud、MyBatis-Plus、Spring Security 数据库 MySQL、Redis、Elasticsearch 中间件 Kafka、RabbitMQ、Nacos、Sentinel AI RAG架构、DeepSeek API、Ollama、豆包Embedding 工具 Docker、Git、Maven 📬 联系我 # 📧 Email: 2932434294@qq.com 💬 微信: Z293294y ","date":"January 1, 2025","externalUrl":null,"permalink":"/about/","section":"黄振宇 | Java后端开发工程师","summary":"👋 你好，我是黄振宇 # 一名 Java后端开发工程师，同时对 AI应用开发 充满热情。\n🎓 教育背景 # 广东白云学院 — 全日制本科 · 软件工程 · 26应届本科生 💼 实习经历 # 亚信科技控股有限公司 (2025.06 - 2026.03)\n参与公司核心微服务重构项目，负责业务系统重构，将基于 Spring Boot 的单体应用迁移至 Spring Cloud 微服务架构。\n优化网关路由转发逻辑，基于 Spring Cloud Gateway 实现统一鉴权和耗时统计 基于 LiteFlow 框架进行数据封装，可视化配置简化业务逻辑 基于 OpenFeign + Sentinel 实现服务间通信与熔断降级 采用 Seata 分布式事务 AT 模式，保障跨服务事务一致性 🛠️ 技术栈 # 领域 技术 语言 Java 17 框架 Spring Boot、Spring Cloud、MyBatis-Plus、Spring Security 数据库 MySQL、Redis、Elasticsearch 中间件 Kafka、RabbitMQ、Nacos、Sentinel AI RAG架构、DeepSeek API、Ollama、豆包Embedding 工具 Docker、Git、Maven 📬 联系我 # 📧 Email: 2932434294@qq.com 💬 微信: Z293294y ","title":"关于我","type":"page"},{"content":" 🤖 关于本站 # ⌨️ 本博客由 OpenClaw 全自动搭建与运维 —— 从服务器环境配置、Hugo 安装、主题定制、内容生成到部署上线，全部由 AI 完成，操作者仅负责需求指挥，未参与任何安装与编码工作。\n📚 教育背景 🎓 广东白云学院 · 软件工程本科 📅 26应届本科生\n💼 工作经验 🏢 亚信科技控股有限公司 📅 实习经验9个月 · 微服务架构重构\n0 实习经验 0 核心项目 0 QPS 优化 0 技术栈 🚀 技术栈 # ☕ 后端开发 Java 17 · Spring Boot · Spring Cloud · MyBatis-Plus\n🗄️ 数据存储 MySQL · Redis · Elasticsearch\n☁️ 微服务 Nacos · Gateway · Sentinel · Seata · OpenFeign\n🤖 AI 应用 RAG架构 · DeepSeek · Ollama · 豆包Embedding\n📡 消息中间件 Kafka · RabbitMQ · WebSocket\n🐳 DevOps Docker · Jenkins · Git · Linux\n💼 项目经历 # 🏆 智库RAG知识库系统 # **2025.07 - 2025.09** · 独立设计开发 企业级RAG智能对话平台，支持文档上传、向量化检索与多轮AI问答。\n🔍 双引擎检索（关键词+语义） ⚡ Kafka异步处理，1GB文件上传3s，500MB响应200ms 💬 支持多轮对话上下文记忆 `RAG` `Elasticsearch` `Kafka` `DeepSeek` `AI` 🏢 亚信科技 - 微服务重构 # **2025.06 - 2026.03** · 核心业务系统 参与从Spring Boot单体到Spring Cloud微服务的架构迁移：\n🚪 网关统一鉴权设计 🛡️ OpenFeign + Sentinel 熔断降级 🔄 Seata 分布式事务方案 ⚡ LiteFlow 业务编排 `Spring Cloud` `Gateway` `Sentinel` `Seata` `LiteFlow` ⭐ 技术派社区 - 高并发优化 # **2024.09 - 2024.12** · 核心贡献者 前后端分离技术社区平台，高并发优化：\n📈 QPS 800 → 3000+（提升275%） 🔥 Caffeine + Redis 多级缓存 ⚡ P99: 500ms → 80ms `QPS 3000+` `Redis` `RabbitMQ` `Caffeine` 📫 联系我 # 📧 Email 💬 WeChat: Z293294y 📱 15986279615 ","date":"January 1, 2025","externalUrl":null,"permalink":"/","section":"黄振宇 | Java后端开发工程师","summary":" 🤖 关于本站 # ⌨️ 本博客由 OpenClaw 全自动搭建与运维 —— 从服务器环境配置、Hugo 安装、主题定制、内容生成到部署上线，全部由 AI 完成，操作者仅负责需求指挥，未参与任何安装与编码工作。\n📚 教育背景 🎓 广东白云学院 · 软件工程本科 📅 26应届本科生\n💼 工作经验 🏢 亚信科技控股有限公司 📅 实习经验9个月 · 微服务架构重构\n0 实习经验 0 核心项目 0 QPS 优化 0 技术栈 🚀 技术栈 # ☕ 后端开发 Java 17 · Spring Boot · Spring Cloud · MyBatis-Plus\n","title":"黄振宇 | Java后端开发工程师","type":"page"},{"content":"","date":"December 20, 2024","externalUrl":null,"permalink":"/tags/rabbitmq/","section":"Tags","summary":"","title":"RabbitMQ","type":"tags"},{"content":"","date":"December 20, 2024","externalUrl":null,"permalink":"/tags/redis/","section":"Tags","summary":"","title":"Redis","type":"tags"},{"content":" 一个技术社区的诞生：从 CRUD 到 3000+ QPS，中间经历了什么？ 🚀 3000+ QPS 💾 多级缓存 📨 消息异步 📱 扫码登录 项目概述 # 技术派 是一个前后端分离的、面向互联网开发者的技术内容分享与交流平台，包括前端 PC 和管理后台。通过文章、教程、AI 助手等产品形态，旨在打造一个激发开发者创作灵感的技术社区。\n作为一个学习型项目，它最大的价值在于覆盖了高并发场景下的主流优化手段，而不是停留在\u0026quot;能跑就行\u0026quot;的阶段。\n技术栈 # 层级 技术选型 后端 Spring Boot + MyBatis-Plus 缓存 Caffeine 本地缓存 + Redis 分布式缓存 消息队列 RabbitMQ 搜索引擎 Elasticsearch 数据库 MySQL 安全 Spring Security + JWT 系统架构 # graph TB subgraph 客户端 A[PC 前端] B[管理后台] end subgraph 网关层 C[Spring Security\u0026lt;br/\u0026gt;JWT 鉴权] end subgraph 业务层 D[文章服务] E[用户服务] F[评论/互动服务] G[AI 助手] end subgraph 数据层 H[(MySQL)] I[(Redis)] J[Caffeine\u0026lt;br/\u0026gt;本地缓存] K[RabbitMQ] L[(Elasticsearch)] end A \u0026amp; B --\u0026gt; C --\u0026gt; D \u0026amp; E \u0026amp; F \u0026amp; G D \u0026amp; E \u0026amp; F --\u0026gt; I D --\u0026gt; J D --\u0026gt; H F --\u0026gt; K D \u0026amp; E --\u0026gt; L 核心优化 # 一、扫码登录：无密码的安全体验 # 公众号回调 Token 双检 很多开发者都用过扫码登录，但自己实现一遍才会发现里面的坑。\n流程设计：\nsequenceDiagram participant 用户 participant 前端 participant 后端 participant 微信公众号 用户-\u0026gt;\u0026gt;前端: 点击\u0026#34;扫码登录\u0026#34; 前端-\u0026gt;\u0026gt;后端: 请求生成二维码 后端-\u0026gt;\u0026gt;后端: 生成 sceneId + Ticket 后端--\u0026gt;\u0026gt;前端: 返回二维码 URL 用户-\u0026gt;\u0026gt;微信公众号: 扫描二维码 微信公众号--\u0026gt;\u0026gt;后端: 回调确认（携带 sceneId） 后端-\u0026gt;\u0026gt;后端: 生成 JWT Token 前端-\u0026gt;\u0026gt;后端: 轮询/Ticket 查询登录状态 后端--\u0026gt;\u0026gt;前端: 返回 Token + 用户信息 关键实现：\n// 1. 生成扫码 Ticket public String generateQrTicket() { String sceneId = UUID.randomUUID().toString().replace(\u0026#34;-\u0026#34;, \u0026#34;\u0026#34;); String ticket = \u0026#34;ticket:\u0026#34; + sceneId; // 5分钟过期 redisTemplate.opsForValue().set(ticket, \u0026#34;PENDING\u0026#34;, 5, TimeUnit.MINUTES); return sceneId; } // 2. 微信回调确认登录 public void confirmLogin(String sceneId, Long userId) { String ticket = \u0026#34;ticket:\u0026#34; + sceneId; String token = jwtService.generateToken(userId); // 将 Token 写入 Ticket，前端轮询能拿到 redisTemplate.opsForValue().set(ticket, token, 5, TimeUnit.MINUTES); } // 3. 前端轮询检查 public String checkLoginStatus(String sceneId) { String ticket = \u0026#34;ticket:\u0026#34; + sceneId; String value = redisTemplate.opsForValue().get(ticket); if (\u0026#34;PENDING\u0026#34;.equals(value)) return null; // 等待扫码 if (value != null \u0026amp;\u0026amp; value.startsWith(\u0026#34;ey\u0026#34;)) return value; // 已登录 return \u0026#34;EXPIRED\u0026#34;; // 已过期 } ⚠️ 扫码登录的安全要点：Ticket 必须设置短过期时间（5分钟），扫码后原 Ticket 立即失效防止重放攻击。Token 的有效期应独立管理，不要和 Ticket 绑定。 二、多级缓存：从 500 QPS 到 3000+ QPS # 500 → 3000+ QPS 自旋锁防击穿 技术派社区最核心的读操作是文章详情页，我们用 Caffeine + Redis 两级缓存来扛：\ngraph LR A[请求] --\u0026gt; B{Caffeine\u0026lt;br/\u0026gt;本地缓存} B --\u0026gt;|命中| C[返回] B --\u0026gt;|未命中| D{Redis\u0026lt;br/\u0026gt;分布式缓存} D --\u0026gt;|命中| E[回填本地缓存] --\u0026gt; C D --\u0026gt;|未命中| F{MySQL} F --\u0026gt;|命中| G[回填Redis] --\u0026gt; E F --\u0026gt;|未命中| H[返回空] @Service public class ArticleCacheService { @Autowired private Cache\u0026lt;Long, ArticleVO\u0026gt; localCache; public ArticleVO getArticle(Long articleId) { // Level 1: 本地缓存 ArticleVO article = localCache.getIfPresent(articleId); if (article != null) return article; // Level 2: Redis 分布式缓存 String cacheKey = \u0026#34;article:\u0026#34; + articleId; String cached = redisTemplate.opsForValue().get(cacheKey); if (cached != null) { article = JSON.parseObject(cached, ArticleVO.class); localCache.put(articleId, article); return article; } // Level 3: 数据库（带自旋锁防缓存击穿） article = loadWithSpinLock(articleId); if (article != null) { redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(article), 1, TimeUnit.HOURS); localCache.put(articleId, article); } return article; } /** * 自旋锁防缓存击穿 * 热点 key 过期瞬间，大量请求同时打到数据库 */ private ArticleVO loadWithSpinLock(Long articleId) { String lockKey = \u0026#34;lock:article:\u0026#34; + articleId; int maxRetries = 3; int retryDelay = 50; // ms for (int i = 0; i \u0026lt; maxRetries; i++) { Boolean locked = redisTemplate.opsForValue() .setIfAbsent(lockKey, \u0026#34;1\u0026#34;, 10, TimeUnit.SECONDS); if (Boolean.TRUE.equals(locked)) { try { return articleMapper.selectById(articleId); } finally { redisTemplate.delete(lockKey); } } try { Thread.sleep(retryDelay); } catch (Exception ignored) {} } // 降级：自旋失败直接查库 return articleMapper.selectById(articleId); } } 缓存策略总结：\n缓存层 过期时间 击中率 用途 Caffeine 5分钟 ~30% 抗热点，零网络开销 Redis 1小时 ~60% 分布式共享，集群一致 MySQL - ~10% 兜底，自旋锁保护 三、消息异步：RabbitMQ 解耦互动操作 # 评论 · 点赞 · 收藏 用户互动操作（评论、点赞、收藏、通知）如果同步处理，会严重拖慢主流程。用 RabbitMQ 做异步解耦：\nsequenceDiagram participant 用户 participant API participant RabbitMQ participant 消费者 participant DB 用户-\u0026gt;\u0026gt;API: 点赞文章 API-\u0026gt;\u0026gt;RabbitMQ: 发送点赞事件 API--\u0026gt;\u0026gt;用户: 200 OK（\u0026lt; 50ms） RabbitMQ-\u0026gt;\u0026gt;消费者: 消费点赞事件 消费者-\u0026gt;\u0026gt;DB: 更新点赞计数 消费者-\u0026gt;\u0026gt;DB: 写入点赞记录 消费者-\u0026gt;\u0026gt;DB: 发送通知消息 // Producer：点赞即返回 @PostMapping(\u0026#34;/like\u0026#34;) public Result\u0026lt;Void\u0026gt; likeArticle(@RequestParam Long articleId) { Long userId = getCurrentUserId(); // 幂等检查 if (likeService.hasLiked(userId, articleId)) { return Result.ok(); } // 异步处理 rabbitTemplate.convertAndSend(\u0026#34;interaction.exchange\u0026#34;, \u0026#34;interaction.like\u0026#34;, new LikeEvent(userId, articleId)); // 本地快速标记（最终一致性） likeService.markLikedLocal(userId, articleId); return Result.ok(); } // Consumer：异步消费 @RabbitListener(queues = \u0026#34;interaction.like.queue\u0026#34;) public void handleLike(LikeEvent event) { // 1. 写入点赞记录 likeRecordMapper.insert(event.toRecord()); // 2. 更新文章点赞计数 articleMapper.incrementLikeCount(event.getArticleId()); // 3. 发送通知 notificationService.sendLikeNotification(event); } 💡 消息丢失怎么办？生产者确认模式 + 消费者手动 ACK + 死信队列兜底，三层保障。 四、作者白名单：Redis Set 轻量级权限控制 # O(1) 鉴权 管理后台需要控制哪些用户有发布文章的权限，用 Redis Set 实现：\n// 加入白名单 public void addToWhitelist(Long userId) { redisTemplate.opsForSet().add(\u0026#34;author:whitelist\u0026#34;, userId.toString()); } // 检查权限（O(1)） public boolean isAuthor(Long userId) { return Boolean.TRUE.equals( redisTemplate.opsForSet().isMember(\u0026#34;author:whitelist\u0026#34;, userId.toString()) ); } // 获取全部作者 public Set\u0026lt;Long\u0026gt; getAllAuthors() { return redisTemplate.opsForSet().members(\u0026#34;author:whitelist\u0026#34;) .stream().map(Long::valueOf).collect(Collectors.toSet()); } 比数据库查询快，比硬编码灵活，万级白名单内存占用不到 1MB。\n性能对比 # 指标 优化前 优化后 文章详情 QPS ~500 3000+ 点赞响应时间 ~200ms（同步写库） \u0026lt; 50ms（异步） 热点文章 DB 查询 大量重复查询 自旋锁 + 缓存 登录方式 仅账密 账密 + 扫码 总结 # 技术派这个项目让我理解了一个道理：性能优化不是换个更贵的数据库，而是在每一层找到瓶颈然后用最合适的手段解决。Caffeine 抗热点、Redis 做共享、自旋锁防击穿、MQ 做异步——每个手段都不复杂，但组合起来效果是 6 倍的 QPS 提升。\n","date":"December 20, 2024","externalUrl":null,"permalink":"/posts/tech-community-deep-dive/","section":"Posts","summary":" 一个技术社区的诞生：从 CRUD 到 3000+ QPS，中间经历了什么？ 🚀 3000+ QPS 💾 多级缓存 📨 消息异步 📱 扫码登录 项目概述 # 技术派 是一个前后端分离的、面向互联网开发者的技术内容分享与交流平台，包括前端 PC 和管理后台。通过文章、教程、AI 助手等产品形态，旨在打造一个激发开发者创作灵感的技术社区。\n","title":"技术派社区：从0到3000+QPS的全链路性能优化实战","type":"posts"},{"content":"","date":"December 20, 2024","externalUrl":null,"permalink":"/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/","section":"Tags","summary":"","title":"性能优化","type":"tags"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"}]