Firestore文档的引用类型字段能否无需额外读操作缓存引用对应数据
问题解答
完全可以实现,不需要执行大量读操作就能拿到关联的频道数据,核心是优化缓存的存储结构和读取逻辑,常见的实现方案如下:
方案1:冗余存储频道高频字段
如果业务场景只需要用到频道名称、频道ID、频道头像这类变更频率极低的频道字段,你可以直接在写入新闻缓存的时候,把这些关联字段冗余存入单条新闻的缓存值中。
- 读取缓存的新闻列表时,直接解析新闻缓存本身就能拿到所有需要的频道信息,0额外读操作
- 一致性兜底:给新闻缓存设置1-2小时的短过期时间,或者在频道信息更新时主动触发关联新闻缓存的失效即可
适合新闻列表流量大、频道信息更新频率低的场景,实现成本最低
方案2:批量去重读取频道缓存
如果频道字段更新频繁、不适合冗余存储,可以在拿到缓存的新闻列表后,先做一次ID去重再批量读取:
- 从缓存中拿到完整的新闻列表
- 提取所有新闻的频道关联ID,做去重处理
- 用缓存的批量读接口(比如Redis的
MGET)一次性拉取所有去重后的频道数据
- 不管新闻列表有几百上千条,最多只需要1次额外读操作,远低于N+1查询的开销
示例逻辑代码:
# 读取缓存的新闻列表 cached_news = redis_client.get("news:list:page_1") # 去重提取所有关联的频道ID channel_ids = list({item["channel_ref"] for item in cached_news}) # 批量读取频道缓存,仅1次IO操作 channel_info_list = redis_client.mget([f"channel:info:{id}" for id in channel_ids])
方案3:预存关联后的完整列表缓存
如果这个新闻列表是全站公用的热点数据,你可以直接在更新新闻列表的时候,先关联好所有频道信息,再把完整的结构化数据写入缓存:
- 读取时直接拿到完整的带频道信息的新闻列表,0额外读操作
- 适合列表更新频率低、访问量极高的首页热点列表场景
内容的提问来源于stack exchange,提问作者yuzu0o0
相关产品推荐
相关产品推荐

