JSONL 存储
当计划任务需要记住已完成的工作——例如已发出的告警、处理过的 ID、捕获的事件——而数据库又过于笨重时,使用本技能。JSON Lines(每行一个 JSON 对象)是可追加、人类可读、可 grep、且无需加载整个文件就能流式读取的格式。本助手提供原子追加、即使行损坏也能继续的流式读取,以及 append_unique(record, key) 方法,确保同一 ID 在跨运行时不会被写入两次。
何时调用
- 用户说:“将结果记录到 JSONL 文件”、“追加事件到磁盘”、“按 ID 跨运行去重”、“无需数据库的简单历史记录”。
- 一个 cron/计划脚本需要在一个平面文件中维护持久化的跨运行状态。
何时不调用
- 需要查询、索引或并发写入——请使用 SQLite(
sqlite-state)或真正的数据库。 - 记录很大或为二进制——JSONL 适用于小型结构化行。
具体示例
用户输入:
每次运行后,将新告警追加到 alerts.jsonl 中,但同一告警 ID 不能重复出现两次。
输出:
# 将 assets/store.py 复制到你的项目中,然后:
from store import JsonlStore
store = JsonlStore("data/alerts.jsonl")
for alert in new_alerts:
if store.append_unique(alert, key="id"):
send(alert) # 仅对任何先前运行中未见过的 ID 触发
print("历史大小:", store.count())
读取是逐行流式的,因此一整年的历史记录永远不会完全加载到内存中,崩溃时写入一半的最后一行会被跳过,不会破坏下次运行。
应用模式
- 每行一个 JSON 对象;使用
ensure_ascii=False追加,以便文本保持可读。 - 使用生成器进行流式读取;跳过空行或损坏的行而不是抛出异常。
- 使用
seen_keys(key)/append_unique(record, key)进行去重,使运行幂等。 - 与调度器配对,使文件成为调用间的持久化内存。
参考:assets/store.py。
来源
源自作者的计划机器人状态处理实践。v1.0.0。 另见:[[sqlite-state]]、[[cron-dispatch]]、[[pipeline-orchestrator]]。
→ 使用 Trawlkit 构建完整的可运行机器人。