从全量扫描到增量缓存:一次重构让标签与历史页性能翻倍

从全量扫描到增量缓存:一次重构让标签与历史页性能翻倍

通过引入标签缓存与增量更新机制、基于时间游标的无限滚动分页,以及归档接口并行化整合请求,显著减少 I/O 与接口调用次数,全面提升页面加载性能与系统可维护性。



sync_time: 2026-04-24 23:01:07
source: clipboard
content_hash: 6339815886917a79749d59ece84aea55
tags: [性能优化, 后端开发, 前端优化, 接口设计]
summary: "完成标签缓存、无限滚动与归档接口优化"
score: 8

核心摘要

优化改动总结

一、标签缓存优化(internal/history/store.go

✅ 新增字段

  • tagCache map[string]int
  • tagCacheBuilt bool

✅ 优化内容

  • AllTags()
    • 首次调用时构建缓存
    • 后续直接读取缓存,避免全量扫描 JSONL 文件
  • Append()
    • 增量更新标签缓存
  • UpdateTags()
    • 增量更新新增标签计数
  • compact()
    • 执行后重建缓存,确保数据一致性

二、历史页无限滚动(store.go + handlers.go + index.html

✅ 后端改动

  • 新增方法:RecentAfter(before time.Time, n int)
    • 返回指定时间之前的历史条目
  • /api/history
    • 新增 after 参数(时间戳游标支持)

✅ 前端改动

  • 初始加载 30 条数据
  • 滚动到底部自动加载下一批
  • 实现基于时间游标的分页机制

三、归档页请求优化(handlers.go + server.go + index.html

✅ 新增接口

  • /api/archive/today
    • 并行发起 4 个 SSH 请求
    • 一次性返回:
      • 年列表
      • 月列表
      • 日列表
      • 当日文件列表

✅ 性能优化

  • 首次进入归档页仅需 1 次请求
  • 替代原先的 4 次串行请求

✅ 代码优化

  • 抽取公共函数:renderFileList()
    • 提高复用性
    • 减少重复代码

总体优化效果

  • 减少重复 I/O 扫描
  • 降低接口调用次数
  • 提升页面加载性能
  • 改善用户滚动体验
  • 优化代码结构与可维护性

原始内容

所有优化完成。以下是改动总结:

  1. 标签缓存 (internal/history/store.go)
  • Store 新增 tagCache map[string]int 和 tagCacheBuilt bool
  • AllTags() 首次调用时构建缓存,后续直接读缓存,不再全量扫描 JSONL 文件
  • Append() 增量更新标签缓存
  • UpdateTags() 增量更新新增标签的计数
  • compact() 后重建缓存
  1. 历史页无限滚动 (store.go + handlers.go + index.html)
  • 后端新增 RecentAfter(before time.Time, n int) 方法,返回指定时间之前的条目
  • /api/history 支持 after 参数(时间戳游标)
  • 前端初始加载 30 条,滚动到底部自动加载下一批
  1. 归档页合并请求 (handlers.go + server.go + index.html)
  • 新增 /api/archive/today 接口,并行发起 4 个 SSH 请求,一次返回年/月/日列表 + 当日文件
  • 前端首次打开归档页只需 1 次请求,替代原来的 4 次串行请求
  • 提取 renderFileList() 公共函数复用