从全量扫描到增量缓存:一次重构让标签与历史页性能翻倍
通过引入标签缓存与增量更新机制、基于时间游标的无限滚动分页,以及归档接口并行化整合请求,显著减少 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]inttagCacheBuilt 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 扫描
- 降低接口调用次数
- 提升页面加载性能
- 改善用户滚动体验
- 优化代码结构与可维护性
原始内容
所有优化完成。以下是改动总结:
- 标签缓存 (internal/history/store.go)
- Store 新增 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() 公共函数复用