SWE / OA(细分团队未明确) · CodeSignal OA

Anthropic OA 多级 In-memory DB:TTL 快照与恢复剩余寿命

按 key/field 两级记录构建 set/get/delete/scan,再推导时间戳、TTL、backup 与最近快照 restore 的剩余寿命语义。

题目重点:按 key/field 两级记录构建 set/get/delete/scan,再推导时间戳、TTL、backup 与最近快照 restore 的剩余寿命语义。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版字段在时间 t 写入 TTL d 时有效区间为 [t,t+d);无 TTL 记为无限。题目没有说明端点包含性,正式实现先向面试官确认。
  • 同一 key 可有多个 field;scan 返回该 key 下当前可见的字段,按字段名词典序;空 key 返回空列表。
  • backup(t) 只保存 t 时可见字段的值和剩余寿命;restore(now, at) 选备份时间 ≤ at 的最新一份,把有限 TTL 的新过期时刻设为 now+备份剩余寿命。没有符合条件的备份在训练版返回失败。

解题路线

  1. 先把状态建成 `records[key][field]=(value, expires_at)`,所有读/删/扫描走同一 `visible(entry,t)`,避免不同操作对 t=expires_at 的理解不一致。
  2. scan 可先过滤可见字段再排序;若扫描频繁可维护有序索引,但删除、过期清理与恢复都要同步更新。TTL 惰性过期即可保证可见性,后台清理只影响空间。
  3. backup 在时间 t 对可见条目计算 `remaining=expires_at−t`;永久字段记特殊无限值。备份内容须深拷贝,不能保留可变 records 的引用。
  4. restore 用不晚于 at 的最大快照时间,重建 records;例如 t=10 写入 TTL=10,t=14 备份剩余 6,t=100 恢复后有效到 106,而不是恢复旧绝对过期时刻 20。

手动走一遍

在 t=10 写入 `user/name=Ana`,TTL=10;t=14 备份,保存剩余 6;t=20 原记录已过期;t=100 恢复该备份,t=105 可读,t=106 不可读。若另在 t=16 建新快照,`restore(100,15)` 仍选 t=14 的版本。

规模与取舍

设当前字段数 N、某 key 下可见字段数 F、快照数量 B。哈希 get/set/delete 平均 O(1);scan O(F log F) 时间和 O(F) 临时空间;backup/restore O(N) 时间与空间;二分定位快照 O(log B),但恢复复制 N 条是主成本。累计快照朴素存储 O(BN),可再讨论增量快照。

易错点与追问

容易失分的边界

  • 备份保存旧 expires_at,恢复到未来时间后数据立即过期。
  • 先删除过期字段再备份却在其他操作不统一判断过期端点。
  • 把 compare-set/delete、get_when 的另一版题面硬套到这版;这些操作的完整接口需单独核证。
  • 多个备份时间相同时未定义覆盖或并列策略,训练实现需先固定。

继续深挖

  • 如何设计 get_when 的历史版本和时间旅行读取,且不把当前态备份误作完整历史?
  • 大量 TTL 到期时惰性清理与定时堆各有什么成本?
  • 增量快照与崩溃恢复如何保证某次 backup 的原子性?
✓已复制微信号!