
背单词产品最常见的实现方式是把词表按固定顺序切分成每日任务。这个模型简单、容易上线但有一个明显问题它只知道“今天该背哪些词”不知道“用户现在还会哪些词”。结果就是复习任务没有跟着记忆状态变化用户花在已经掌握单词上的时间越来越多真正模糊的词反而得不到及时出现。秒词邦的抗遗复习功能要解决的不是一个前端展示问题而是一个调度问题系统如何根据用户过去的学习记录计算今天应该出现哪些词并把完成结果重新写回学习状态。本文从数据模型、调度引擎、状态流转、任务幂等和前端交互五个层面拆解这个功能。一、数据模型从“词表”转向“单词状态”固定词表模型通常只存三个信息用户、词本、学习进度。这种模型无法回答一个词是属于“刚接触”“已经记住”还是“正在遗忘”。抗遗复习至少需要以下状态字段•user_id学习用户。•word_id单词唯一标识。•memory_state当前记忆状态。•last_review_at最近一次复习时间。•next_review_at下一次应该出现的时间。•error_count累计错误次数。•last_result最近一次复习结果。•response_time用户回答耗时。•review_version状态版本用于并发更新和幂等。其中memory_state和next_review_at是调度核心。前者描述单词大致处于哪个记忆阶段后者决定它什么时候进入任务列表。error_count和response_time作为辅助信号用来判断这次复习是稳定回忆还是勉强猜中。数据模型不建议把“今天要复习什么”作为永久字段保存。每天的到期任务应该从状态表实时推导或者生成后写入带过期时间的任务快照。这样不会因为用户补复习、批量删除或修改计划而导致旧任务永久残留。二、调度引擎先算到期再算优先级调度引擎的输入是用户全部单词状态输出是当天复习任务。最小流程可以拆成四步1、过滤无效单词已删除、已归档、未进入学习流程的词不参与。2、计算到期集合筛选next_review_at 当天结束时间的单词。3、计算优先级到期时间越早、错误次数越高、回答耗时越长的词优先。4、生成任务快照为每个单词生成唯一任务记录并标记待复习状态。这里有两个容易忽略的边界• 跨天边界用户晚上 23:59 打开和次日 00:01 打开应该归属不同自然日。• 补复习边界历史未完成任务不能简单删除也不能无限堆积需要允许用户按日期回溯。三、状态流转复习结果如何影响下一次出现抗遗复习不是“答对就结束”而是每次复习都改变单词的下一次出现时间。可以把它抽象成一个状态机•new刚进入学习还没有形成稳定记忆。•learning正在学习和复习状态会频繁变化。•review进入到期复习阶段。•mastered连续稳定回忆可以拉长间隔。•weak连续错误或多次模糊需要缩短间隔。一次复习结束后系统至少更新四个字段last_result、memory_state、next_review_at和review_version。如果回答正确且稳定下一次间隔拉长如果错误或耗时明显异常下一次出现时间提前。具体间隔不要写死在业务代码里建议放在可配置的策略表中。这样后续可以直接调整策略不需要修改调度代码。四、任务幂等避免同一个词在同一天重复出现只要存在多端、多会话或网络重试任务重复就会发生。例如用户在一端完成了复习另一端又提交了同一条任务或者接口超时后客户端重试。推荐使用任务唯一键user_id word_id task_date但只做唯一键还不够还要处理两种情况1、重复提交如果任务已经完成返回上一次结果不重复推进记忆状态。2、并发提交通过review_version做乐观锁版本不一致时拒绝旧请求。任务表的职责是记录“今天做过什么”单词状态表的职责是记录“现在记到什么程度”。两者分开后补复习和重复提交都不会破坏主状态。五、前端交互让用户看到系统正在做什么调度再准确如果用户看不到任务变化也会觉得系统不可控。抗遗复习的前端至少需要四类视图• 今天任务当前到期的复习任务。• 历史任务昨天及更早未完成或已完成的记录。• 单词详情释义、发音、上次结果和当前状态。• 完成反馈已复习状态、剩余数量和历史进度。前端不应该直接修改记忆状态。它只提交复习结果由服务端根据结果更新状态再返回新的任务快照。这样同一套调度逻辑可以同时服务 App 端、移动端和未来的其他客户端。批量删除、批量导出、历史日期切换这些操作也必须走同一套任务查询接口避免为每个入口各写一套逻辑。六、测试与观测抗遗复习最容易出错的不是页面而是时间和状态边界。测试清单至少应覆盖• 跨日、跨时区、夏令时边界。• 同一个词连续答对和连续答错。• 历史任务未完成后的补复习。• 多端同时提交同一任务。• 删除单词后任务和状态是否一致。• 调度策略更新后的历史任务兼容。线上观测至少记录到期任务数、完成率、重复提交率、平均响应耗时、错误率和补复习比例。调度策略是否有效最终要看用户是否在更短时间内完成了更稳定的复习。七、结论抗遗复习的技术难点不在“做一个复习页面”而在于把单词状态、到期计算、任务队列和复习反馈串成闭环。把状态和任务分离、把调度策略配置化、把任务提交做成幂等才能让复习功能在多端、补复习和并发场景下保持稳定。本图文由蜂词GEO协助整理和制图