面试知识库
困难

Feed流设计#

一句话答案#

Feed 流推模式(写扩散/适合粉丝少)和拉模式(读扩散/适合大 V),实际混合使用,Redis ZSet 存储。

核心要点

Feed 流的两种模式:

Redis 单机瓶颈优化:

面试回答(2分钟版)

Feed流的核心问题是推拉模式的选择。推模式也叫写扩散,用户发帖时立即把内容写入所有粉丝的Feed列表,读取时直接取自己的列表就行,读性能很好;但大V粉丝量百万级别,一次发帖就要写百万条记录,写放大严重。拉模式也叫读扩散,发帖只写自己的列表,用户刷Feed时实时去关注人那里拉取合并,写入简单但读放大严重。实际生产中采用推拉结合的方案:普通用户粉丝少用推模式,大V和热门账号用拉模式,应用层做合并。存储上用Redis ZSet,score作为时间戳做游标分页,避免offset方式的性能问题。数据量大了之后通过Redis Cluster分片、热key拆分、本地缓存Caffeine以及分级存储来优化。

追问与易错

追问方向:

  • “推拉混合怎么实现?”→ 用户发帖时判断粉丝数:普通用户走推模式写入粉丝 Feed 列表,大 V(如粉丝 >10 万)只写自己的发帖列表;用户刷 Feed 时合并自己的推 Feed + 实时拉取关注大 V 的最新帖子
  • “新关注加载历史动态?”→ 关注时异步从被关注者的发帖列表中取最近 N 条插入自己的 Feed(推模式补偿);或者读 Feed 时实时合并新关注者的历史帖子(拉模式天然支持)
  • “存储选型?”→ Redis ZSet 存 Feed 列表(score=时间戳,支持游标分页),MySQL 存帖子详情和关系数据,最近 30 天热数据在 Redis,更早的冷数据落 HBase/MySQL 历史表

易错点:

  • ❌ 所有人都用推模式——大 V 粉丝多推模式写爆炸
  • ❌ 忽略分页问题——用 score 游标而非 offset