缓存更新策略优化咨询:文章数据变更时的缓存维护方案
优化关键词缓存的更新策略
背景
我们有一张存储文章信息的表:
id title ---------- 1 Github Setup Guide 2 Github Troubleshooting 3 New Engineer Onboarding Setup
业务里有个高频查询需求:查找标题包含指定关键词的文章ID,对应的SQL示例为:
SELECT id FROM article WHERE title like '%Setup%'
为提升查询性能,我们用缓存存储关键词 -> 文章ID列表的映射关系:
Setup -> [1, 3] Github -> [1, 2]
现在面临的问题是:当文章表数据发生变更(比如删除某条记录)时,如何高效更新缓存?目前有两个初步方案:
- 提取变更文章标题中的每个关键词,找到缓存对应条目,移除该文章ID后重新写入
- 直接清空整个缓存
第一个方案逻辑复杂,若标题包含大量关键词或缓存中的ID数组过大,更新耗时会很长;第二个方案虽简单,但会导致大规模缓存失效,后续查询需频繁回源数据库,引发性能波动。
更优的缓存更新方式
1. 单缓存条目过期+按需重建
给每个关键词 -> 文章ID列表的缓存条目设置合理的过期时间(比如1小时),当数据变更时,仅删除该文章标题涉及的关键词对应的缓存条目(而非清空整个缓存)。后续再有用户查询该关键词时,自动从数据库拉取最新的ID列表并重新写入缓存。
这种方式的优势:
- 逻辑极简,变更时仅需处理涉及的少量关键词,无需修改大数组
- 将缓存重建的压力分散到后续查询请求中,不会阻塞主业务流程
- 不会像清空全缓存那样引发大规模回源,影响范围仅限于变更相关的关键词
2. 异步队列更新(强一致性场景适用)
如果对缓存一致性要求较高,无法接受短暂的过期数据,可以引入异步更新队列:
- 文章数据变更时,将变更事件(比如“删除ID=3的文章,涉及关键词:Setup、Engineer、Onboarding”)发送至消息队列
- 独立的消费服务从队列中获取事件,异步地去缓存中移除对应关键词下的目标ID
- 若某个关键词对应的ID列表变为空,直接删除该缓存条目即可
这种方式的优势:
- 主业务流程仅需发送事件,几乎无性能开销
- 异步处理缓存更新,不会拖慢数据变更操作
- 避开了同步修改大数组的耗时问题,适配标题关键词多或缓存ID列表大的场景
3. 维护反向缓存(辅助优化)
额外维护一个文章ID -> 关键词列表的反向缓存,存储每篇文章标题对应的所有关键词。当文章变更时:
- 先从反向缓存中获取该文章原有的所有关键词(若为修改操作,还需提取新标题的关键词)
- 针对这些关键词,更新或删除对应的
关键词 -> 文章ID列表缓存 - 最后更新反向缓存(删除旧条目或新增/修改新条目)
这个方案能避免重复解析标题提取关键词的开销,尤其是修改文章时,无需重新解析旧标题,直接从反向缓存获取即可,既简化逻辑又提升效率。
总结
如果对缓存一致性要求不高,优先选择单缓存条目过期+按需重建方案,实现成本最低;如果要求强一致性,采用异步队列更新方案,平衡性能与一致性;反向缓存可作为辅助手段,进一步优化更新逻辑。
内容的提问来源于stack exchange,提问作者Deqing
相关产品推荐
相关产品推荐

