{
  "type": "BlogWikiIndex",
  "version": 1,
  "site": "https://tblog.mmzhiku.xyz/",
  "generatedAt": "2026-10-21T02:53:22.263Z",
  "articles": [
    {
      "id": "others-blog-firefly-mod",
      "title": "Firefly 博客魔改总结：Astro 内容系统、Svelte 交互与部署",
      "description": "记录 Firefly 博客主题的二次开发，涵盖 Astro 内容系统、Svelte 交互、首页动效、音乐可视化、标签图谱、留言板和 Cloudflare 集成。",
      "published": "2026-08-21T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/others-blog-firefly-mod/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/others-blog-firefly-mod.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/others-blog-firefly-mod.md",
      "category": "学习文档",
      "tags": [
        "博客",
        "二开",
        "firefly"
      ],
      "headings": [
        "选型背景",
        "1、首页",
        "2、音乐",
        "3、分类标签",
        "4、留言",
        "4.1 接口列表",
        "4.2 登录流程",
        "5、关于",
        "6、日历",
        "6.1 接口列表",
        "7、归档",
        "8、其他",
        "二、用到的AI模型",
        "三、优点与UI复制"
      ],
      "excerpt": "记录 Firefly 博客主题的二次开发，涵盖 Astro 内容系统、Svelte 交互、首页动效、音乐可视化、标签图谱、留言板和 Cloudflare 集成。",
      "characterCount": 4501
    },
    {
      "id": "ai-blog-ai-zero-editing",
      "title": "这个博客《纯AI，零人工》",
      "description": "记录使用 AI 搭建和维护 Astro 博客的实践流程，涵盖视觉定位、HTML 原型、项目规范、功能开发、测试验证和持续迭代。",
      "published": "2026-06-14T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/ai-blog-ai-zero-editing/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-blog-ai-zero-editing.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-blog-ai-zero-editing.md",
      "category": "学习文档",
      "tags": [
        "AI",
        "前端",
        "博客"
      ],
      "headings": [
        "一、问题与目标",
        "1、正确流程",
        "2、原型图",
        "2.1 原型图步骤",
        "2.2 重点速查表",
        "2.3 推荐资源",
        "2.4 提示词速查表",
        "3、设置规范",
        "3.1 正确流程",
        "3.2 TDD是神",
        "4、开发",
        "5、优化",
        "5.1 动效",
        "5.2 资源优化",
        "5.3 定期扫描",
        "二、AI 工具",
        "1、Skill",
        "2、模型选择",
        "1、博客设计原则"
      ],
      "excerpt": "记录使用 AI 搭建和维护 Astro 博客的实践流程，涵盖视觉定位、HTML 原型、项目规范、功能开发、测试验证和持续迭代。",
      "characterCount": 2139
    },
    {
      "id": "details-java-enum-strategy-pattern",
      "title": "Java 枚举策略模式：用枚举替换 if-else 分发的三种绑定方式",
      "description": "用 Java 枚举承接按类型分发行为的 if-else 链：时间单位偏移与数据收集服务分发两个案例，覆盖三种绑定形式的选择与 ordinal 落库等高频坑。",
      "published": "2026-09-13T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/details-java-enum-strategy-pattern/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/details-java-enum-strategy-pattern.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/details-java-enum-strategy-pattern.md",
      "category": "学习文档",
      "tags": [
        "Java",
        "设计模式",
        "枚举"
      ],
      "headings": [
        "核心摘要",
        "引子",
        "背景知识",
        "第一步：行为搬进常量（抽象方法版）",
        "三种绑定形式",
        "静态查找表：从线性扫描到静态 Map",
        "与 Spring 策略模式的选型边界",
        "实战演示一：时间单位偏移",
        "实战演示二：服务分发（接口 + Optional）",
        "坑 1：ordinal() 落库",
        "坑 2：构造期引用静态查找表",
        "坑 3：常量里放可变状态",
        "坑 4：传统 switch 没有穷举检查",
        "坑 5：删除或改名枚举值",
        "性能/对比数据",
        "总结",
        "参考资料"
      ],
      "excerpt": "用 Java 枚举承接按类型分发行为的 if-else 链：时间单位偏移与数据收集服务分发两个案例，覆盖三种绑定形式的选择与 ordinal 落库等高频坑。",
      "characterCount": 4043
    },
    {
      "id": "ai-rag-ten-strategies",
      "title": "RAG 检索增强生成 10 种策略：分块、混合检索与重排序选型",
      "description": "按 RAG 两阶段流程整理 10 种检索增强生成策略：语义分块、领域 Embedding、元数据索引、Graph RAG、混合检索与重排序，并给出默认选型与升级触发条件。",
      "published": "2026-08-27T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/ai-rag-ten-strategies/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-rag-ten-strategies.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-rag-ten-strategies.md",
      "category": "学习文档",
      "tags": [
        "AI",
        "RAG",
        "LLM"
      ],
      "headings": [
        "一、引子：RAG 死了吗",
        "二、RAG 总体流程",
        "策略 1：语义分块（Semantic Chunking）",
        "分块增强：上下文增强（Contextual Retrieval）",
        "策略 2：命题分块（Proposition Chunking）",
        "策略 3：领域特化 Embedding",
        "策略 4：结构化索引与元数据过滤",
        "策略 5：Graph RAG（图结构检索）",
        "策略 6：查询改写（Query Transformation）",
        "策略 7：假设文档检索（HyDE）",
        "策略 8：混合检索（Hybrid Search）",
        "策略 9：重排序（Re-ranking）",
        "五、范式升级：策略 10 与组合策略",
        "策略 10：Agentic RAG",
        "组合策略：自适应路由（Adaptive Routing）",
        "六、十种策略速览与选型",
        "七、质量与工程考量",
        "八、结语",
        "九、参考资料"
      ],
      "excerpt": "按 RAG 两阶段流程整理 10 种检索增强生成策略：语义分块、领域 Embedding、元数据索引、Graph RAG、混合检索与重排序，并给出默认选型与升级触发条件。",
      "characterCount": 12618
    },
    {
      "id": "details-web-performance-optimization",
      "title": "前端性能优化十项主流：问题、方法与收益",
      "description": "整理前端与站点性能优化十项主流方法：性能分析、HTTP 缓存、CDN、Nginx 配置、加载策略、图片、字体与 JS 长任务治理，每项说明原因、做法与收益。",
      "published": "2026-08-09T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/details-web-performance-optimization/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/details-web-performance-optimization.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/details-web-performance-optimization.md",
      "category": "学习文档",
      "tags": [
        "性能优化",
        "Nginx",
        "CDN",
        "HTTP"
      ],
      "headings": [
        "引子",
        "背景知识：度量框架与优化变量",
        "一、性能分析：先测量，再优化",
        "二、HTTP 协议升级：HTTP/2、TLS 1.3 与 HTTP/3",
        "三、传输压缩：gzip、Brotli 与 Zstandard",
        "四、HTTP 缓存：让重复访问零请求",
        "五、CDN：把字节搬到用户旁边",
        "六、Nginx 与服务器配置",
        "七、加载策略：资源提示与关键渲染路径",
        "八、图片优化",
        "九、字体优化",
        "十、JavaScript 执行：长任务治理",
        "实战演示：静态站点的端到端配置",
        "坑 1：HTTP/1.1 时代的优化在 HTTP/2 下反向",
        "坑 2：只看 Lighthouse 分数",
        "坑 3：一次改五项，无法归因",
        "坑 4：HTML 被长缓存",
        "坑 5：Nginx add_header 不继承",
        "优化方法总览",
        "总结",
        "参考资料"
      ],
      "excerpt": "整理前端与站点性能优化十项主流方法：性能分析、HTTP 缓存、CDN、Nginx 配置、加载策略、图片、字体与 JS 长任务治理，每项说明原因、做法与收益。",
      "characterCount": 8467
    },
    {
      "id": "projects-miside-3d-text",
      "title": "米塔 3D 字体网页端实现：Three.js SDF Text 与物理动画",
      "description": "用 React Three Fiber、Three.js 与 Rapier 实现仿米塔 3D 字体物理动画：字形分割、状态机、相机视差与移动端性能。",
      "published": "2026-08-01T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-miside-3d-text/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-miside-3d-text.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-miside-3d-text.md",
      "category": "设计文档",
      "tags": [
        "React",
        "Three",
        "米塔",
        "3D"
      ],
      "headings": [
        "技术栈",
        "架构总览",
        "1. 字形分割 — Intl.Segmenter",
        "2. 确定性随机 — 种子哈希 + Fisher-Yates",
        "3. 排版 — 锚点居中 + 自动换行",
        "4. 时序状态机 — 四阶段生命周期",
        "5. 物理模拟 — Rapier 集成",
        "6. 相机朝向",
        "7. 响应式与可访问性",
        "8. 懒加载与错误边界",
        "core.ts — 纯函数层",
        "layer.tsx — 懒加载门面",
        "physics.tsx — 物理渲染层",
        "集成方式",
        "1. Intl.Segmenter 兼容性",
        "2. Rapier 物理性能",
        "3. 字体预热",
        "4. Camera 与布局",
        "5. 状态更新的竞态",
        "性能对比",
        "总结"
      ],
      "excerpt": "用 React Three Fiber、Three.js 与 Rapier 实现仿米塔 3D 字体物理动画：字形分割、状态机、相机视差与移动端性能。",
      "characterCount": 1944
    },
    {
      "id": "details-api-security-practices",
      "title": "接口安全实践：从传输通道、入口到数据输出的全链路防护",
      "description": "接口安全技巧，按请求链路从传输通道、入口、业务逻辑排到数据输出与运营治理，附 Spring Boot 代码示例与落地检查清单。",
      "published": "2026-07-14T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/details-api-security-practices/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/details-api-security-practices.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/details-api-security-practices.md",
      "category": "学习文档",
      "tags": [
        "接口安全",
        "Web安全",
        "Spring Boot",
        "最佳实践"
      ],
      "headings": [
        "引子",
        "核心摘要",
        "背景知识：攻击面与防御分层",
        "20 个技巧逐一展开",
        "1. 使用 HTTPS 协议",
        "2. 接口签名与防重放",
        "3. 加 IP 白名单",
        "4. 限流",
        "5. 加验证码",
        "6. 做权限控制",
        "7. 参数校验",
        "8. 文件上传校验",
        "9. 做转义",
        "10. SSRF 防护",
        "11. 第三方回调验签",
        "12. 幂等设计",
        "13. 校验敏感词",
        "14. 数据加密",
        "15. 输出脱敏",
        "16. 统一封装返回值",
        "17. CORS 与安全响应头",
        "18. 做风险控制",
        "19. 审计日志",
        "20. 接口资产治理",
        "落地检查清单",
        "总结",
        "参考资料"
      ],
      "excerpt": "接口安全技巧，按请求链路从传输通道、入口、业务逻辑排到数据输出与运营治理，附 Spring Boot 代码示例与落地检查清单。",
      "characterCount": 12203
    },
    {
      "id": "projects-easyexcel-export-import-design",
      "title": "EasyExcel 导出下载中心与导入设计方案",
      "description": "面向百万级数据的异步导出下载中心与批量导入设计：EasyExcel 流式读写、ID 游标分页、多 sheet 拆分、OSS 生命周期、幂等与错误回执。",
      "published": "2026-06-20T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-easyexcel-export-import-design/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-easyexcel-export-import-design.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-easyexcel-export-import-design.md",
      "category": "设计文档",
      "tags": [
        "EasyExcel",
        "设计文档",
        "大数据量",
        "导入导出",
        "高并发"
      ],
      "headings": [
        "核心摘要",
        "问题与目标",
        "选型：EasyExcel 与它的维护现状",
        "总体架构",
        "同步与异步的分界",
        "数据读取：ID 游标分页优先，Cursor 兜底",
        "写入：分 sheet 与临时文件",
        "上传、通知与下载",
        "并发控制与幂等",
        "安全",
        "上传与任务创建",
        "解析与攒批",
        "写库：批量与事务",
        "校验策略与部分成功",
        "错误回执",
        "关键取舍汇总",
        "风险与应对",
        "验证计划",
        "总结",
        "参考资料"
      ],
      "excerpt": "面向百万级数据的异步导出下载中心与批量导入设计：EasyExcel 流式读写、ID 游标分页、多 sheet 拆分、OSS 生命周期、幂等与错误回执。",
      "characterCount": 7850
    },
    {
      "id": "ai-prompt-collection",
      "title": "AI 辅助前端开发 Prompt 模板集：目录结构、组件复用与代码审查",
      "description": "收录 AI 辅助前端开发的 Prompt 模板，覆盖目录结构、组件复用、命名规范、依赖约束、样式管理、测试和代码审查要求。",
      "published": "2026-06-19T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/ai-prompt-collection/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-prompt-collection.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-prompt-collection.md",
      "category": "学习文档",
      "tags": [
        "AI",
        "Prompt"
      ],
      "headings": [
        "1、前端",
        "1、逆向",
        "2、角色设定图",
        "3、画风",
        "4、质量",
        "5、滤镜",
        "6、降噪",
        "7、反向提示词",
        "8、图生图，替换人物",
        "9、黑板封面"
      ],
      "excerpt": "收录 AI 辅助前端开发的 Prompt 模板，覆盖目录结构、组件复用、命名规范、依赖约束、样式管理、测试和代码审查要求。",
      "characterCount": 182
    },
    {
      "id": "projects-rocketmq-ordered-message-sharding",
      "title": "RocketMQ 顺序消息与多线程分片：生产、存储、消费的一致性设计",
      "description": "从生产端分片键路由、Broker 队列 FIFO 与消费端三把锁讲起，给出提升顺序消费吞吐的四个方案、各自乱序风险与幂等对账兜底设计。",
      "published": "2026-06-13T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-rocketmq-ordered-message-sharding/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-rocketmq-ordered-message-sharding.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-rocketmq-ordered-message-sharding.md",
      "category": "学习文档",
      "tags": [
        "RocketMQ",
        "消息队列",
        "顺序消费",
        "分布式一致性",
        "高并发"
      ],
      "headings": [
        "核心摘要",
        "引子：状态机消费乱序",
        "先定义顺序的边界",
        "全链路机制",
        "MessageQueueSelector",
        "串行发送：单一生产者 + 同键串行",
        "发送失败：重试仍发同一队列，但要业务兜底",
        "本地事务与发送的原子性：事务消息",
        "Broker 端：队列内 FIFO 与可配置的可靠性",
        "顺序消费的三把锁",
        "并行度模型：队列数就是天花板",
        "提升吞吐：四个方案与各自的代价",
        "方案一：扩队列，处理扩容窗口的跨队列乱序",
        "方案二：消费端内存队列二次分发",
        "方案三：把 IO 拆出顺序链路",
        "方案四：升级 5.x 消息组 + Pop 消费",
        "选型对比",
        "消费失败与重试：顺序的代价",
        "失败要先分类，再决定重不重试",
        "幂等键：业务唯一键，不是 msgId",
        "去重表与业务操作同事务",
        "状态机校验：乱序发生时的止损",
        "版本缺口缓冲：让乱序自愈",
        "位点提交与对账",
        "可观测性：顺序消费特有的监控盲区",
        "实战演示：订单状态变更的消费端",
        "踩坑点",
        "总结",
        "参考资料"
      ],
      "excerpt": "从生产端分片键路由、Broker 队列 FIFO 与消费端三把锁讲起，给出提升顺序消费吞吐的四个方案、各自乱序风险与幂等对账兜底设计。",
      "characterCount": 9320
    },
    {
      "id": "ai-openspec-superpowers-workflow",
      "title": "OpenSpec+Superpowers 实现流水线开发",
      "description": "介绍 OpenSpec 与 Superpowers 的职责边界、安装配置和协同流程，建立从需求规范、任务实现到测试审查的 AI 编程工作流。",
      "published": "2026-06-03T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/ai-openspec-superpowers-workflow/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-openspec-superpowers-workflow.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-openspec-superpowers-workflow.md",
      "category": "学习文档",
      "tags": [
        "AI",
        "Skill",
        "工作流"
      ],
      "headings": [
        "一、介绍",
        "1、Superpowers",
        "2、OpenSpec",
        "1、Superpowers 的功能特性与应用场景",
        "2、OpenSpec 的功能特性与应用场景",
        "1、Superpowers 使用步骤",
        "2、OpenSpec 使用步骤",
        "1、Superpowers 子技能",
        "2、OpenSpec 命令与能力",
        "1、环境要求",
        "2、安装 Superpowers",
        "3、安装 OpenSpec",
        "1、卸载 Superpowers",
        "2、卸载 OpenSpec",
        "3、残留清理",
        "1、协同场景",
        "2、协同优势",
        "3、协同操作步骤",
        "4、实战示例：实现订单导出功能",
        "5、关键协同点",
        "1、Q1：OpenSpec 与 Superpowers 必须一起使用吗？",
        "2、Q2：Superpowers 安装后为什么不生效？",
        "3、Q3：OpenSpec 的 Spec 应该写到什么粒度？",
        "4、Q4：如何处理开发过程中的需求变更？",
        "5、Q5：团队如何协作使用 OpenSpec？",
        "九、总结",
        "十、参考资料"
      ],
      "excerpt": "介绍 OpenSpec 与 Superpowers 的职责边界、安装配置和协同流程，建立从需求规范、任务实现到测试审查的 AI 编程工作流。",
      "characterCount": 5032
    },
    {
      "id": "projects-interaction-cache-design",
      "title": "交互数据缓存设计：前端到后端的全链路方案",
      "description": "点赞、收藏、关注等交互数据的全链路缓存设计：前端 HTTP 缓存与 SWR、网关限流与响应缓存、后端按小中大流量分级的多级缓存选型，以及贯穿三层的三道一致性防线。",
      "published": "2026-05-13T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-interaction-cache-design/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-interaction-cache-design.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-interaction-cache-design.md",
      "category": "设计文档",
      "tags": [
        "缓存设计",
        "Redis",
        "架构设计",
        "高并发"
      ],
      "headings": [
        "核心摘要",
        "问题与目标",
        "全链路架构",
        "前端层：只缓存展示态",
        "网关层：限流优先，缓存只给匿名读",
        "小流量：MySQL 直写",
        "中流量：Redis + Cache-Aside + 异步落库",
        "中流量变体：Caffeine + MySQL 定时刷新（无 Redis）",
        "大流量：多级缓存 + MQ 批量聚合落库",
        "一致性兜底：三道防线",
        "第一道防线：写路径 Cache-Aside",
        "第二道防线：binlog 订阅补偿",
        "第三道防线：TTL + 对账",
        "读己之写的实现",
        "强一致场景不缓存",
        "三大经典故障的防护",
        "流量分级决策总表",
        "SWR 与 HTTP 缓存叠加后 revalidate 失效",
        "网关缓存串读私有数据",
        "本地缓存多实例不一致",
        "分桶计数的 hash tag 热分片",
        "延迟双删的 sleep 参数靠拍",
        "风险",
        "总结",
        "参考资料"
      ],
      "excerpt": "点赞、收藏、关注等交互数据的全链路缓存设计：前端 HTTP 缓存与 SWR、网关限流与响应缓存、后端按小中大流量分级的多级缓存选型，以及贯穿三层的三道一致性防线。",
      "characterCount": 3719
    },
    {
      "id": "ai-napcat-astrbot-deployment",
      "title": "NapCat+AstrBot部署QQ机器人",
      "description": "用 Docker Compose 部署 NapCat 与 AstrBot：OneBot 11 HTTP/WebSocket 对接、LLM 配置、人格提示词、插件与账号风控边界。",
      "published": "2026-05-12T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/ai-napcat-astrbot-deployment/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-napcat-astrbot-deployment.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/ai-napcat-astrbot-deployment.md",
      "category": "部署文档",
      "tags": [
        "AI",
        "Bot",
        "部署"
      ],
      "headings": [
        "组件职责",
        "一、部署环境要求",
        "二、目录结构",
        "三、docker-compose.yml",
        "1、启动",
        "四、本地 Docker Desktop 部署",
        "五、服务器部署",
        "1、建目录",
        "2、新建文件",
        "3、编排",
        "4、校验",
        "1、访问地址",
        "2.1 自动配置",
        "2.2 手动配置（登录发现没看到配置上，那么可以选择这里）",
        "3、NapCat 环境变量说明（部署忽略，这里只是补充说明）",
        "4、NapCat 配置文件位置（部署忽略，这里只是补充说明）",
        "1、访问 WebUI",
        "2、添加消息平台（连接 NapCat）",
        "3、配置 LLM 大模型（需要先准备 API Key）",
        "4、低成本模型渠道（Agnes 或魔搭社区）",
        "4.1 Agnes",
        "4.2 魔搭社区（推荐）",
        "5、普通设置",
        "6、平台设置",
        "7、扩展功能",
        "1、传统手搓",
        "2、使用女娲 Skill 蒸馏人格",
        "2.1 安装",
        "2.2 蒸馏一个人",
        "2.3 已蒸馏人物（可直接安装）",
        "2.4 用于 AstrBot 人格设定",
        "3、喵墩备份",
        "1、如图",
        "2、为什么我不用记忆呢",
        "1、AstrBot 连不上 NapCat",
        "2、QQ 号被风控 / 账号掉线",
        "3、消息延迟高",
        "4、如何更新版本",
        "十一、参考资料"
      ],
      "excerpt": "用 Docker Compose 部署 NapCat 与 AstrBot：OneBot 11 HTTP/WebSocket 对接、LLM 配置、人格提示词、插件与账号风控边界。",
      "characterCount": 6809
    },
    {
      "id": "others-umami-vercel-neon-deployment",
      "title": "Umami通过Vercel+Neon部署方案",
      "description": "用 Vercel 部署 Umami、Neon 托管 PostgreSQL：Prisma 7 适配、自定义域名与 Share API 展示博客 UV/PV 的配置方法。",
      "published": "2026-05-07T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/others-umami-vercel-neon-deployment/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/others-umami-vercel-neon-deployment.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/others-umami-vercel-neon-deployment.md",
      "category": "部署文档",
      "tags": [
        "Umami",
        "部署",
        "Vercel"
      ],
      "headings": [
        "一、架构",
        "二、部署步骤",
        "1、Fork Umami 仓库",
        "2、vercel部署",
        "3、vercel打通neon，更改域名，重新部署",
        "4、登录Umami更改密码，调整地址，开通网址",
        "5、复制配置项到config",
        "6、完结撒花",
        "三、本项目获取 UV/PV 的实现原理",
        "四、设置数据自动清理",
        "五、更新 Umami 版本"
      ],
      "excerpt": "用 Vercel 部署 Umami、Neon 托管 PostgreSQL：Prisma 7 适配、自定义域名与 Share API 展示博客 UV/PV 的配置方法。",
      "characterCount": 2484
    },
    {
      "id": "projects-java-thread-pool-configuration",
      "title": "Java 线程池配置指南：核心参数、线程数估算与拒绝策略",
      "description": "Java ThreadPoolExecutor 配置指南，讲解核心参数、CPU/IO 线程数估算、有界队列、拒绝策略、监控告警和动态调优方法。",
      "published": "2026-05-07T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-java-thread-pool-configuration/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-java-thread-pool-configuration.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-java-thread-pool-configuration.md",
      "category": "学习文档",
      "tags": [
        "Java",
        "线程池",
        "并发编程"
      ],
      "headings": [
        "一、核心摘要",
        "二、为什么需要线程池",
        "三、ThreadPoolExecutor 核心参数",
        "1、corePoolSize 与 maximumPoolSize",
        "2、keepAliveTime 与 TimeUnit",
        "3、工作队列",
        "4、线程工厂",
        "5、拒绝策略",
        "四、任务提交与执行流程",
        "五、CPU 密集型与 IO 密集型任务",
        "1、CPU 密集型",
        "2、IO 密集型",
        "3、混合型任务",
        "1、Little's Law",
        "2、Brian Goetz 公式",
        "3、公式的局限",
        "4、估算流程",
        "5、常见场景参考值",
        "七、工作队列选型",
        "1、全局共用一个线程池",
        "2、不考虑下游限制盲目设大",
        "3、keepAliveTime 设置过短",
        "4、任务中嵌套提交任务",
        "5、容器环境不修正 CPU 核数",
        "6、线程未命名",
        "1、需求分析清单",
        "2、订单查询服务配置示例",
        "3、压测验证方案",
        "1、动态调整原理",
        "2、实现示例",
        "3、队列容量动态修改",
        "1、Prometheus 指标暴露",
        "2、AlertManager 告警规则",
        "3、告警阈值参考",
        "1、线程数调优",
        "2、队列深度调优",
        "3、GC 与内存调优",
        "4、上下文切换调优",
        "1、Q1：`corePoolSize` 和 `maximumPoolSize` 应该设成一样吗？",
        "2、Q2：为什么线程池达到了 `maximumPoolSize` 但 CPU 使用率仍然很低？",
        "3、Q3：任务被拒绝时应该选择哪种策略？",
        "4、Q4：使用 `CompletableFuture` 时如何指定自定义线程池？",
        "5、Q5：Spring 的 `@Async` 默认线程池有什么问题？",
        "6、Q6：如何优雅关闭线程池？",
        "7、Q7：`allowCoreThreadTimeOut(true)` 是否推荐？",
        "十四、决策速查表",
        "十五、总结",
        "十六、参考资料"
      ],
      "excerpt": "Java ThreadPoolExecutor 配置指南，讲解核心参数、CPU/IO 线程数估算、有界队列、拒绝策略、监控告警和动态调优方法。",
      "characterCount": 3372
    },
    {
      "id": "projects-java-virtual-thread-async-orchestration",
      "title": "Java 21 虚拟线程与异步编排：线程池、CompletableFuture 选型",
      "description": "以 Java 21 商品详情聚合为例，比较平台线程、线程池、CompletableFuture、响应式编程和虚拟线程的适用边界与编排方式。",
      "published": "2026-05-07T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-java-virtual-thread-async-orchestration/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-java-virtual-thread-async-orchestration.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-java-virtual-thread-async-orchestration.md",
      "category": "学习文档",
      "tags": [
        "Java",
        "虚拟线程",
        "并发编程"
      ],
      "headings": [
        "1、一个真实的场景",
        "2、问题的本质",
        "二、Java 并发模型的演进史",
        "1、阶段 1：原始线程时代（Java 1.0，1996年）",
        "2、阶段 2：线程池时代（Java 5，2004年）",
        "3、阶段 3：异步回调时代（Java 8，2014年）",
        "4、阶段 4：响应式编程时代（Spring WebFlux，2017年）",
        "5、阶段 5：虚拟线程时代（JDK 21，2023年）",
        "1、传统线程的问题（图解）",
        "2、虚拟线程的解决思路",
        "3、关键概念：Continuation（续体）",
        "4、通俗类比",
        "四、虚拟线程 vs 平台线程：全面对比",
        "1、最简单的创建方式",
        "2、生产推荐：每任务一虚拟线程",
        "3、Spring Boot 3.2+ 集成（推荐）",
        "4、并行聚合多个 IO 任务（最常用场景）",
        "5、结合 ScopedValue 传递上下文（推荐替代 ThreadLocal）",
        "六、⚠️ 虚拟线程踩坑大全（12个坑）",
        "1、坑 1：给虚拟线程建线程池（最常见错误）",
        "2、坑 2：synchronized 块导致 Pinning（JDK 21/23）",
        "3、坑 3：ThreadLocal 在虚拟线程中导致内存泄漏",
        "4、坑 4：虚拟线程遇到 CPU 密集任务反而变慢",
        "5、坑 5：数据库连接池成为新瓶颈",
        "6、坑 6：在虚拟线程中调用 native 方法导致 Pinning",
        "7、坑 7：用 isVirtual() 做业务逻辑判断",
        "8、坑 8：虚拟线程数量无上限导致 OOM",
        "9、坑 9：忘记处理虚拟线程的中断",
        "10、坑 10：在虚拟线程中使用 BlockingQueue 不当",
        "11、坑 11：错误理解\"虚拟线程不需要关心并发问题\"",
        "12、坑 12：在旧版 JDBC 驱动中遇到兼容性问题",
        "七、CompletableFuture 异步编排从零讲起",
        "1、基本概念：什么是 CompletableFuture？",
        "2、核心方法速查",
        "3、实战：并行聚合商品详情",
        "4、超时与降级处理",
        "八、⚠️ CompletableFuture 踩坑大全（8个坑）",
        "1、坑 1：不指定 Executor，使用 ForkJoinPool 公共池",
        "2、坑 2：异常被静默吞掉",
        "3、坑 3：thenApply vs thenApplyAsync 混淆",
        "4、坑 4：allOf 没有返回值，需要额外 get()",
        "5、坑 5：链式调用中的线程切换导致 ThreadLocal 丢失",
        "6、坑 6：join() 和 get() 的异常包装差异",
        "7、坑 7：CompletableFuture 没有超时导致线程泄漏",
        "8、坑 8：在高并发下大量创建 CompletableFuture 链导致内存压力",
        "1、它解决了什么问题？",
        "2、基本用法",
        "3、带超时的结构化并发",
        "4、结构化并发的优势总结",
        "十、响应式编程（Reactor/WebFlux）概览",
        "1、核心概念：Mono 和 Flux",
        "2、背压（Backpressure）：响应式的核心优势",
        "3、什么时候应该用响应式？",
        "4、响应式的三大难点（让你望而却步的原因）",
        "十一、四种模型横向大对比",
        "1、决策树",
        "2、推荐的企业级组合（JDK 21+）",
        "3、完整实战：商品详情页聚合接口",
        "1、三句话总结",
        "2、学习路径建议"
      ],
      "excerpt": "以 Java 21 商品详情聚合为例，比较平台线程、线程池、CompletableFuture、响应式编程和虚拟线程的适用边界与编排方式。",
      "characterCount": 7017
    },
    {
      "id": "projects-redis-bitmap-snowflake-id",
      "title": "Redis中Bitmap、雪花ID、分布式的坑",
      "description": "分析 Redis Bitmap 直接承载雪花 ID 时的初始化开销、映射碰撞、单线程阻塞和数据倾斜问题，并给出 String + Set 的替代方案。",
      "published": "2026-05-06T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-redis-bitmap-snowflake-id/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-redis-bitmap-snowflake-id.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-redis-bitmap-snowflake-id.md",
      "category": "实践笔记",
      "tags": [
        "Redis",
        "Bitmap",
        "分布式",
        "性能优化"
      ],
      "headings": [
        "一、案发现场",
        "二、问题现象",
        "1、SETBIT 的时间复杂度陷阱",
        "2、内存分配量化",
        "3、为什么后续操作快？",
        "4、能否缩小 Offset 范围？",
        "1、雪花 ID 的结构决定了它不适合做 Bitmap offset",
        "2、哈希取模是\"治标不治本\"的妥协",
        "3、雪花 ID 的\"时间递增\"特性也无法利用",
        "4、如果不用哈希，直接用雪花 ID 做 offset 呢？",
        "5、从 ID 生成策略角度的替代方案",
        "6、雪花 ID 角度的本质",
        "1、Redis 单线程阻塞：一个慢操作拖垮整个节点",
        "2、Redis Cluster 数据倾斜",
        "3、KEYS 命令的集群隐患",
        "4、Bitmap 大 Key 的运维风险",
        "5、分布式角度的结论",
        "1、原理",
        "2.1 方式 A：RedisBloom 模块（RB.* 命令）",
        "2.2 方式 B：客户端序列化（Read-Modify-Write）",
        "2.3 方式 C：Lua 脚本",
        "3、RoaringBitmap 结论",
        "1、Key 设计",
        "2、为什么用用户维度而不是内容维度的 Set？",
        "3、操作流程",
        "4、缓存冷启动（Redis 无数据时）",
        "5、方案对比",
        "6、前端注意事项：雪花 ID 精度丢失",
        "1、三维问题全景",
        "2、问题-方案对照表",
        "3、最终选型",
        "4、什么时候 Bitmap 仍然适用？"
      ],
      "excerpt": "分析 Redis Bitmap 直接承载雪花 ID 时的初始化开销、映射碰撞、单线程阻塞和数据倾斜问题，并给出 String + Set 的替代方案。",
      "characterCount": 6851
    },
    {
      "id": "projects-token-storage-jwt-design",
      "title": "前后端 Token 存储方案：RS256、HttpOnly Cookie 与主动吊销",
      "description": "设计 Access Token + Refresh Token 认证体系：RS256 签名、HttpOnly Cookie、Redis 会话白名单、主动吊销与跨服务验签。",
      "published": "2026-05-04T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-token-storage-jwt-design/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-token-storage-jwt-design.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-token-storage-jwt-design.md",
      "category": "设计文档",
      "tags": [
        "JWT",
        "认证",
        "安全"
      ],
      "headings": [
        "1、当前系统现状",
        "2、目标",
        "1、双 Token 分层存储",
        "2、RS256 非对称签名",
        "3、Redis 白名单",
        "1、Session vs JWT",
        "2、前端存储对比",
        "3、核心取舍",
        "1、服务端：Token 签发",
        "2、服务端：Token 刷新",
        "3.1 单设备退出",
        "3.2 密码修改 / 重置后全局吊销",
        "4、网关：Token 校验",
        "5、前端：Pinia 状态管理",
        "6、前端：Axios 拦截器",
        "7、Redis 存储结构",
        "1、Cookie 安全属性",
        "2、纵深防御体系",
        "3、多设备登录管理",
        "4、安全事件响应",
        "1、Gateway CORS 配置",
        "2、Nginx 反向代理",
        "3、Cookie 构建工具",
        "1、当前状态与目标状态",
        "2、迁移步骤",
        "1、Redis 性能",
        "2、网关性能",
        "3、前端体验",
        "1、Q1：HttpOnly Cookie 是否完全防御 XSS？",
        "2、Q2：Cookie 4 KB 限制是否足够？",
        "3、Q3：JWT Claims 为什么不存放角色和权限？",
        "4、Q4：Refresh Token 被窃取后如何应对？",
        "5、Q5：跨域场景下 Cookie 为何不生效？",
        "6、Q6：多标签页如何同步登录状态？",
        "7、Q7：移动端 / 原生 App 如何接入？",
        "十、总结",
        "十一、参考资料"
      ],
      "excerpt": "设计 Access Token + Refresh Token 认证体系：RS256 签名、HttpOnly Cookie、Redis 会话白名单、主动吊销与跨服务验签。",
      "characterCount": 8581
    },
    {
      "id": "projects-oauth2-third-party-login",
      "title": "OAuth2 第三方登录：GitHub、微信、QQ 授权码流程统一设计",
      "description": "统一设计 GitHub、微信和 QQ 第三方登录的 OAuth 2.0 授权码流程，涵盖 state 校验、回调换令牌、用户映射、策略模式和多环境配置。",
      "published": "2026-05-03T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-oauth2-third-party-login/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-oauth2-third-party-login.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-oauth2-third-party-login.md",
      "category": "设计文档",
      "tags": [
        "OAuth2",
        "认证",
        "登录"
      ],
      "headings": [
        "方案边界",
        "1、流程图",
        "2、核心代码结构",
        "3、关键技术点",
        "1、平台特性",
        "2、回调处理流程",
        "3、GitHub 后台配置",
        "4、Nacos 配置",
        "5、注意事项",
        "1、平台特性",
        "2、回调处理流程",
        "3、微信开放平台配置",
        "4、Nacos 配置",
        "5、开发环境绕过方案（无域名时）",
        "6、注意事项",
        "1、平台特性",
        "2、回调处理流程",
        "3、QQ 互联平台配置",
        "4、Nacos 配置",
        "5、注意事项",
        "1、需要配置的地方（完整清单）",
        "2.1 GitHub",
        "2.2 微信（网站应用）",
        "2.3 QQ",
        "3、完整 Nacos 配置模板",
        "4、完整 Gateway 白名单模板",
        "5、生产环境部署检查清单",
        "1、redirect_uri is not associated with this application",
        "2、微信开发环境无法使用 localhost",
        "3、回调后没有跳转到前端",
        "4、生产环境是否需要内网穿透",
        "5、不同平台用户的用户名会冲突吗",
        "1、前端发起登录",
        "2、前端接收回调",
        "3、后续请求携带 Token",
        "1、用户表第三方登录字段",
        "2、查询逻辑",
        "九、代码文件清单"
      ],
      "excerpt": "统一设计 GitHub、微信和 QQ 第三方登录的 OAuth 2.0 授权码流程，涵盖 state 校验、回调换令牌、用户映射、策略模式和多环境配置。",
      "characterCount": 6520
    },
    {
      "id": "projects-auth-flow-zsk-auth",
      "title": "滑块验证码、登录与注册完整流程",
      "description": "介绍 zsk-auth 登录注册认证链路，涵盖滑块验证码限流、RSA 密码传输、BCrypt 密码摘要、邮箱验证码和异常安全边界。",
      "published": "2026-05-02T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-auth-flow-zsk-auth/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-auth-flow-zsk-auth.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-auth-flow-zsk-auth.md",
      "category": "设计文档",
      "tags": [
        "认证",
        "登录",
        "安全"
      ],
      "headings": [
        "方案范围",
        "一、流程图（不包含异常处理）",
        "二、流程图 (包含异常处理版)",
        "三、技术栈 (Tech Stack)",
        "四、核心类说明",
        "1、流程概述",
        "2、核心代码",
        "1、流程概述",
        "2、核心代码",
        "1、流程概述",
        "2、核心代码",
        "1、流程概述",
        "2、核心代码",
        "九、安全加密机制 (Security & Encryption)",
        "1、传输层加密 (RSA)",
        "2、存储层加密 (BCrypt)",
        "十、限流机制 (Rate Limiting)",
        "1、策略概述",
        "2、部分核心代码"
      ],
      "excerpt": "介绍 zsk-auth 登录注册认证链路，涵盖滑块验证码限流、RSA 密码传输、BCrypt 密码摘要、邮箱验证码和异常安全边界。",
      "characterCount": 3949
    },
    {
      "id": "projects-magic-link-login-design",
      "title": "邮箱 Magic Link 无密码登录设计：一次性 Token 与安全边界",
      "description": "基于 Cloudflare Turnstile、Redis 一次性 Token 和邮件回调实现无密码登录，涵盖链接发送、校验消费、自动注册、Cookie 登录态和安全边界。",
      "published": "2026-05-01T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-magic-link-login-design/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-magic-link-login-design.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-magic-link-login-design.md",
      "category": "设计文档",
      "tags": [
        "认证",
        "登录",
        "安全"
      ],
      "headings": [
        "方案边界",
        "1、业务背景",
        "2、功能需求",
        "3、登录流程",
        "1.1 模块划分",
        "1.2 核心流程图",
        "2、目录结构",
        "3.1 Controller层",
        "3.2 Service层",
        "3.3 配置类",
        "4.1 Redis缓存键设计",
        "4.2 缓存数据结构",
        "5.1 发送魔法链接",
        "5.2 魔法链接回调",
        "1.1 方案 A：预校验（已废弃）",
        "1.2 方案 B：登录时校验（当前实现）",
        "2、方案对比表",
        "3、选型结论",
        "1、依赖与环境",
        "2.1 application.yml 新增配置",
        "1、注意事项",
        "2、解决方案",
        "3.1 发送魔法链接",
        "3.2 魔法链接回调处理",
        "3.3 通过Cookie获取UserInfo",
        "3.4 Cookie操作工具函数",
        "4、自动注册用户字段说明"
      ],
      "excerpt": "基于 Cloudflare Turnstile、Redis 一次性 Token 和邮件回调实现无密码登录，涵盖链接发送、校验消费、自动注册、Cookie 登录态和安全边界。",
      "characterCount": 7422
    },
    {
      "id": "projects-object-storage-presigned-url",
      "title": "MinIO文件存储签名有效期机制",
      "description": "解释 MinIO/S3 签名 URL 的参数和 7 天有效期限制，对比预签名上传与下载，说明私有对象访问、链接泄露和过期刷新策略。",
      "published": "2026-05-01T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-object-storage-presigned-url/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-object-storage-presigned-url.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-object-storage-presigned-url.md",
      "category": "学习文档",
      "tags": [
        "MinIO",
        "对象存储",
        "安全"
      ],
      "headings": [
        "一、背景",
        "二、什么是签名 URL",
        "1、签名 URL 的格式",
        "2、签名 URL 的工作原理",
        "1、各厂商的最大有效期",
        "2、为什么 S3 协议限制 7 天",
        "1、预签名 URL 模式（私有桶）",
        "2、直接 URL 模式（公开桶 + 自定义域名）",
        "3、对比总结",
        "1、方案一：前端自动续签（推荐）",
        "2、方案二：后端代理下载",
        "3、方案三：公开桶 + 自定义域名",
        "4、方案四：CDN 回源 + 鉴权",
        "1、根据场景选择模式",
        "2、有效期设置建议",
        "3、安全注意事项",
        "1、Q1：签名 URL 过期后，文件还在吗？",
        "2、Q2：能否生成永不过期的签名 URL？",
        "3、Q3：签名 URL 泄露了怎么办？",
        "4、Q4：去掉签名参数后还能访问吗？",
        "5、Q5：前端如何判断签名 URL 是否过期？"
      ],
      "excerpt": "解释 MinIO/S3 签名 URL 的参数和 7 天有效期限制，对比预签名上传与下载，说明私有对象访问、链接泄露和过期刷新策略。",
      "characterCount": 2976
    },
    {
      "id": "projects-qrcode-login-java-comparison",
      "title": "扫码登录实现方案对比：短轮询、长轮询、WebSocket 与 SSE",
      "description": "对比短轮询、长轮询、WebSocket 和 SSE 扫码登录方案，介绍 WebSocket + Redis 状态机、超时降级、二维码重放和登录态安全防护。",
      "published": "2026-05-01T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-qrcode-login-java-comparison/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-qrcode-login-java-comparison.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-qrcode-login-java-comparison.md",
      "category": "实践笔记",
      "tags": [
        "扫码登录",
        "认证",
        "WebSocket"
      ],
      "headings": [
        "一、背景",
        "1、完整时序",
        "2、二维码状态机",
        "三、方案对比：PC 端如何感知状态变更",
        "1、方案总览",
        "2、资源消耗对比",
        "3、方案选型结论",
        "1、Maven 依赖配置",
        "2、数据模型",
        "3、Redis 存储设计",
        "4、WebSocket 配置",
        "5、生成二维码",
        "6、手机扫码",
        "7、手机确认登录",
        "8、手机取消登录",
        "9、长轮询降级实现",
        "10、Controller 层",
        "11、Gateway 白名单",
        "1、PC 端：二维码展示 + WebSocket",
        "2、PC 端：Vue 组件",
        "3、手机端：扫码 + 确认流程",
        "4、手机端：确认页面组件",
        "1、威胁模型",
        "2、防御措施",
        "3、安全措施汇总",
        "1、WebSocket 连接断开后状态丢失",
        "2、二维码过期但手机端还在确认",
        "3、用户扫码后不确认也不取消",
        "4、PC 端刷新页面后丢失二维码",
        "5、WebSocket 被防火墙/代理拦截",
        "八、生产环境部署清单",
        "九、方案对比总结",
        "十、参考资料"
      ],
      "excerpt": "对比短轮询、长轮询、WebSocket 和 SSE 扫码登录方案，介绍 WebSocket + Redis 状态机、超时降级、二维码重放和登录态安全防护。",
      "characterCount": 5037
    },
    {
      "id": "projects-oracle-erp-performance-optimization",
      "title": "Oracle ERP 性能优化：SHRINK 致聚簇因子恶化的排查与恢复",
      "description": "记录 Oracle ERP 因 SHRINK 导致聚簇因子恶化的排查过程，结合 AWR、执行计划、索引重建、在线表重定义和查询调优分析性能问题。",
      "published": "2025-12-02T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/projects-oracle-erp-performance-optimization/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-oracle-erp-performance-optimization.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/projects-oracle-erp-performance-optimization.md",
      "category": "实践笔记",
      "tags": [
        "Oracle",
        "数据库",
        "性能优化"
      ],
      "headings": [
        "一、背景",
        "1、什么是聚簇因子",
        "2、SHRINK 为什么会恶化 CF",
        "3、恶化后的等待事件",
        "4、聚簇因子检测",
        "1、工具链",
        "2、关键指标",
        "3、定位流程",
        "1、在线表重定义（降低聚簇因子）",
        "1.1 BOM_COMPONENTS_B — 优化等级：🔴 高",
        "1.2 BOM_STRUCTURES_B — 优化等级：🔴 高",
        "1.3 MRP_SCHEDULE_DATES — 优化等级：🟡 低",
        "1.4 MRP_SOURCING_HISTORY — 优化等级：🟡 低",
        "1.5 MRP_SYSTEM_ITEMS — 优化等级：🔴 高",
        "1.6 MTL_ITEM_REVISIONS_B — 优化等级：⚫ 非常低",
        "1.7 MTL_ITEM_REVISIONS_TL — 优化等级：🔴 高",
        "1.8 MTL_SYSTEM_ITEMS_B — 优化等级：🟡 低",
        "1.9 RCV_SHIPMENT_LINES — 优化等级：⚫ 非常低",
        "2.1 RCV_TRANSACTIONS 添加新索引",
        "3、修改存储参数（MRP_SOURCING_HISTORY）",
        "4、核心表缓存至 Keep Pool",
        "1、MRP_SCHEDULE_DATES 频繁增删导致聚簇持续退化",
        "2、SQL 高频执行累计消耗大",
        "3、自治事务频繁提交导致 log file sync 等待",
        "4、视图替代基表导致全表扫描",
        "六、优化效果汇总",
        "七、MRP 性能优化扩展框架",
        "1、数据库基础资源层",
        "2、缓存与共享池层",
        "3、索引与表设计层",
        "4、SQL 执行计划层",
        "5、并发与事务层",
        "6、应用配置层",
        "1、项目一句话定位",
        "2、逻辑链（这是整个项目的叙事骨架）",
        "3、几个值得强调的细节",
        "九、参考资料"
      ],
      "excerpt": "记录 Oracle ERP 因 SHRINK 导致聚簇因子恶化的排查过程，结合 AWR、执行计划、索引重建、在线表重定义和查询调优分析性能问题。",
      "characterCount": 9062
    },
    {
      "id": "details-springboot-async-best-practices",
      "title": "Spring Boot @Async 实现异步的最佳实践",
      "description": "从代理机制与默认执行器行为出发，整理 @Async 的适用边界、线程池显式配置、异常闭环、上下文传递、事务衔接与自调用失效六大实践，附端到端示例、方案对比与上线检查清单。",
      "published": "2025-11-13T00:00:00.000Z",
      "url": "https://tblog.mmzhiku.xyz/posts/details-springboot-async-best-practices/",
      "jsonUrl": "https://tblog.mmzhiku.xyz/wiki/articles/details-springboot-async-best-practices.json",
      "markdownUrl": "https://tblog.mmzhiku.xyz/wiki/articles/details-springboot-async-best-practices.md",
      "category": "学习文档",
      "tags": [
        "Spring Boot",
        "异步编程",
        "线程池",
        "并发编程"
      ],
      "headings": [
        "引子",
        "核心摘要",
        "一、先判断该不该用",
        "2.1 代理与执行链",
        "2.2 启用前提：@EnableAsync",
        "2.3 默认执行器的解析链",
        "2.4 默认配置为什么不能用",
        "三、实践一：显式定义执行器，按业务分池",
        "拒绝策略怎么选",
        "四、实践二：异常必须闭环",
        "五、实践三：上下文传递用 TaskDecorator",
        "六、实践四：与事务的边界",
        "七、实践五：让失效场景显形",
        "八、实战演示：订单支付后的异步通知",
        "坑 1：TaskRejectedException 打到用户脸上",
        "坑 2：同池嵌套阻塞导致死锁",
        "坑 3：发版重启丢任务",
        "坑 4：开启虚拟线程后行为变化",
        "坑 5：只配不监控",
        "十、上线检查清单",
        "总结",
        "参考资料"
      ],
      "excerpt": "从代理机制与默认执行器行为出发，整理 @Async 的适用边界、线程池显式配置、异常闭环、上下文传递、事务衔接与自调用失效六大实践，附端到端示例、方案对比与上线检查清单。",
      "characterCount": 9019
    }
  ]
}
