如何构建Firestore数据库结构以存储用户收藏并判断帖子是否被当前用户收藏
快速判断用户是否收藏帖子的落地方案
存储层优化(基础必做)
- 首先不要采用「先拉取用户全量收藏列表再遍历匹配帖子ID」的方案,收藏量上来之后性能会非常差。
- 如果你用的是关系型数据库,单独建一张用户收藏关联表,给user_id和post_id建联合唯一索引,查询时直接执行:
这条查询走索引的耗时基本在1ms以内,有返回值即代表已收藏,无返回则未收藏。SELECT 1 FROM user_collect WHERE user_id = [当前用户ID] AND post_id = [当前帖子ID] LIMIT 1 - 如果你用的是MongoDB这类文档数据库,把用户收藏的
post_id存在用户文档的数组字段中,给该数组字段加数组索引,直接用数组匹配查询即可,同样不会全量读取整个收藏数组。
体验优化(降低感知延迟)
- 前端本地缓存用户近期交互过的帖子的收藏状态,比如用
localStorage或者APP本地存储,键规则可设为collect:[post_id],值为0/1代表未收藏/已收藏。用户打开帖子时先读本地缓存直接渲染状态,后台异步发起接口请求校验状态一致性,就算有偏差下次打开也会修正,用户几乎感知不到延迟。 - 用户触发收藏/取消收藏操作时,优先更新本地缓存状态再同步服务端,不用等接口返回再变更UI,操作响应会流畅很多。
高并发场景兜底
- 如果产品日活很高、热点帖子访问量很大,可以用Redis存每个用户最近1000条收藏的帖子ID集合,用
SISMEMBER [用户收藏集合key] [帖子ID]命令判断收藏状态,耗时比数据库查询低一个数量级,完全能扛住热点流量。 - 缓存更新可以和用户收藏操作同步执行,也可以设置3-5分钟的过期时间自动兜底,社交场景下收藏状态短时间的不一致几乎不会影响用户体验。
内容的提问来源于stack exchange,提问作者controversialcodes
相关产品推荐
相关产品推荐

