数据缓存系统

📎 引用文件

本文引用的文件 - persistent.py - hierarchy.py - compression.py - search_index.py - lifecycle.py - base.py - local_loader.py - store.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录:配置与使用示例

简介

本文件为 Vibe-Trading 的数据缓存系统提供系统化文档,重点说明多级缓存架构设计(内存、文件、数据库)、压缩算法选择、缓存键生成策略与失效机制、持久化存储实现(DuckDB/SQLite/本地文件系统),以及性能优化技巧(预加载、批量操作、并发控制)。同时给出监控与调试方法、常见问题排查指南,并提供实际代码路径以便快速定位实现。

项目结构

Vibe-Trading 的缓存体系由“持久化记忆 + 全文检索索引 + 压缩归档 + 层级路由”构成,覆盖从热路径到冷数据的完整生命周期管理。

graph TB A["应用调用<br/>PersistentMemory"] --> B["文件缓存层<br/>Markdown 条目 + MEMORY.md 索引"] A --> C["全文检索索引<br/>SQLite FTS5"] A --> D["层级路由<br/>按类型分目录"] E["生命周期管理<br/>质量分/衰减/GC"] --> B E --> F["压缩流水线<br/>raw→daily→digest"] G["回测加载器缓存<br/>Parquet + DuckDB"] --> H["本地文件系统<br/>原子写入/元数据"] I["目标存储<br/>SQLite sessions.db"] --> J["业务状态持久化"]

图表来源 - persistent.py:196-637 - search_index.py:113-481 - hierarchy.py:34-436 - compression.py:160-353 - base.py:488-571 - store.py:1-60

章节来源 - persistent.py:196-637 - search_index.py:113-481 - hierarchy.py:34-436 - compression.py:160-353 - base.py:488-571 - store.py:1-60

核心组件

章节来源 - persistent.py:196-637 - search_index.py:113-481 - hierarchy.py:34-436 - compression.py:160-353 - lifecycle.py:71-421 - base.py:488-571 - store.py:1-60

架构总览

下图展示从应用调用到各层缓存的交互流程,包括写路径(写入文件、更新索引、触发压缩)与读路径(命中 FTS5、回退扫描、层级裁剪)。

sequenceDiagram participant App as "应用" participant PM as "PersistentMemory" participant SI as "MemorySearchIndex(FTS5)" participant HC as "MemoryHierarchy" participant CP as "CompressionPipeline" participant FS as "文件系统" App->>PM : add(name, content, type) PM->>HC : route_entry(type, slug.md) HC-->>PM : 目标路径 PM->>FS : 写入 frontmatter + body PM->>SI : index_entry(id, title, desc, keywords, body) PM->>PM : _update_index(MEMORY.md) Note over PM,CP : 生命周期触发时评估压缩 PM->>CP : should_compress(level, last_accessed) CP-->>PM : target_level? PM->>CP : apply_compression(path, content, keywords, target) CP->>FS : archive_original() CP-->>PM : compressed_content PM->>FS : 原子替换正文 + 更新 frontmatter App->>PM : find_relevant(query) PM->>SI : search(query) alt 命中 SI-->>PM : matches PM-->>App : 结果 else 未命中或不可用 PM->>PM : 扫描所有条目(可经层级裁剪) PM-->>App : 结果 end

图表来源 - persistent.py:462-578 - search_index.py:207-303 - hierarchy.py:70-90 - compression.py:168-334

详细组件分析

持久化记忆(文件缓存)

flowchart TD Start(["写入入口"]) --> Slug["生成slug与id"] Slug --> FM["构建frontmatter"] FM --> Lock{"获取文件锁"} Lock --> |成功| Write["写入.md文件"] Write --> UpdateIdx["更新MEMORY.md索引"] UpdateIdx --> FTS{"是否启用FTS5?"} FTS --> |是| Index["index_entry到FTS5"] FTS --> |否| End Lock --> |失败| Warn["记录警告并继续"] Index --> End(["完成"])

图表来源 - persistent.py:462-578 - persistent.py:41-73

章节来源 - persistent.py:122-143 - persistent.py:196-637

全文检索索引(SQLite FTS5)

classDiagram class MemorySearchIndex { +db_path +_fts_available +_auto_rebuilt +index_entry(entry_id,title,description,keywords,body) +remove_entry(entry_id) +search(query,max_results) MemoryMatch[] +rebuild_all(entries_data) int -_get_conn() Connection -_init_db() void -_prepare_cjk(text) str -_clean_cjk(text) str -_sanitize_fts_query(query) str } class MemoryMatch { +entry_id +title +snippet +rank } MemorySearchIndex --> MemoryMatch : "返回搜索结果"

图表来源 - search_index.py:113-481

章节来源 - search_index.py:113-481

层级路由(目录组织)

flowchart TD S["route_entry(memory_type,filename)"] --> Check{"是否已知类别?"} Check --> |是| Ensure["确保类别目录存在"] Ensure --> ReturnCat["返回 category/filename"] Check --> |否| LogWarn["记录未知类型警告"] LogWarn --> ReturnBase["返回 base_dir/filename"]

图表来源 - hierarchy.py:70-90 - hierarchy.py:145-176 - hierarchy.py:313-379

章节来源 - hierarchy.py:34-436

压缩流水线(冷热分层)

flowchart TD Start(["should_compress(level,last_accessed)"]) --> Days["计算距上次访问天数"] Days --> RawCheck{"level==raw 且 >7天?"} RawCheck --> |是| ToDaily["返回 daily"] RawCheck --> |否| DailyCheck{"level==daily 且 >30天?"} DailyCheck --> |是| ToDigest["返回 digest"] DailyCheck --> |否| None["返回 None"] ToDaily --> Apply["apply_compression -> compress_to_daily"] ToDigest --> Apply2["apply_compression -> compress_to_digest"] Apply --> Archive["archive_original()"] Apply2 --> Archive Archive --> WriteBack["原子替换正文 + 更新 frontmatter"]

图表来源 - compression.py:168-334

章节来源 - compression.py:160-353

生命周期管理(质量/衰减/GC)

flowchart TD Start(["run_gc(dry_run)"]) --> Entries["扫描所有条目"] Entries --> Age{"年龄>=7天?"} Age --> |否| Next["下一个条目"] Age --> |是| Imp["计算importance"] Imp --> Threshold{"低于归档阈值?"} Threshold --> |是| Archive["归档(或删除)"] Threshold --> |否| Next Archive --> Compress{"是否启用压缩?"} Compress --> |是| Trigger["触发压缩流水线"] Compress --> |否| Next Next --> End(["结束"])

图表来源 - lifecycle.py:183-273 - lifecycle.py:275-379

章节来源 - lifecycle.py:71-421

回测加载器缓存(DuckDB + Parquet)

sequenceDiagram participant L as "Loader" participant DC as "DuckDB( : memory : )" participant FS as "文件系统" L->>DC : register("cache_frame", df) DC-->>L : COPY TO parquet(tmp_path) L->>FS : 写入元数据(tmp_meta.json) L->>FS : os.replace(tmp_path -> cache_path) L->>FS : os.replace(tmp_meta -> meta_path)

图表来源 - base.py:536-571 - base.py:488-519

章节来源 - base.py:488-571

目标存储(SQLite)

章节来源 - store.py:1-60

依赖关系分析

graph LR PM["PersistentMemory"] --> H["MemoryHierarchy"] PM --> SI["MemorySearchIndex"] PM --> SL["SemanticLinker"] LC["MemoryLifecycle"] --> PM LC --> CP["CompressionPipeline"] LB["Loader Cache(base.py)"] --> DB["DuckDB"] LB --> FS["文件系统"]

图表来源 - persistent.py:196-637 - search_index.py:113-481 - hierarchy.py:34-436 - compression.py:160-353 - base.py:488-571

章节来源 - persistent.py:196-637 - search_index.py:113-481 - hierarchy.py:34-436 - compression.py:160-353 - base.py:488-571

性能考量

[本节为通用性能指导,无需特定文件引用]

故障排查指南

章节来源 - search_index.py:160-173 - persistent.py:41-73 - compression.py:258-291 - base.py:536-571

结论

Vibe-Trading 的数据缓存系统通过“文件 + 数据库 + 压缩归档 + 层级路由”的多级架构,实现了高效、可靠、可扩展的缓存与检索能力。结合生命周期管理与并发控制,系统在大规模数据场景下仍能保持稳定与高性能。建议在生产环境中合理开启 FTS5、压缩与层级路由,并根据业务需求调整阈值与策略。

[本节为总结性内容,无需特定文件引用]

附录:配置与使用示例

以下示例展示如何启用与使用缓存系统的核心功能,具体实现请参考对应代码路径。

章节来源 - hierarchy.py:6-7 - search_index.py:7-8 - compression.py:6-7 - lifecycle.py:7-11 - persistent.py:462-578 - persistent.py:358-438 - base.py:536-571 - base.py:488-519 - store.py:1-60