Redis可以通过推模式结合Sorted Sets实现高效的Feed流,具体实现方案如下:
一、核心数据结构选择
Redis的Sorted Set(有序集合)是实现Timeline类型Feed流的核心数据结构。其天然支持按时间戳(score)排序的特性,可高效维护用户关注列表的动态更新。每个用户对应一个Sorted Set,存储其关注对象的Feed ID,时间戳作为score保证新消息置顶。例如:
- 用户A的关注列表:ZADD userA:timeline <timestamp> feedID1
- 查询时通过ZREVRANGE userA:timeline 0 10获取最新10条Feed。
二、推模式实现流程
- 发布Feed时写扩散:当用户B发布新动态时,系统遍历其粉丝列表(存储在Set或Hash中),将Feed ID和时间戳批量写入每个粉丝的Sorted Set中。
- 优化大V场景:针对粉丝量过大的用户(如明星账号),采用在线推+离线拉策略:仅向在线粉丝实时推送,离线粉丝上线后通过拉模式补全数据。或使用定时任务分批推送,避免瞬间写入压力。
- 数据去重与过期:通过Feed ID的唯一性防止重复推送,并为Sorted Set设置TTL(生存时间)自动清理过期数据,降低存储成本。
三、读写性能优化
- 批量操作:利用Redis的MSET和ZADD管道(Pipeline)批量写入粉丝的Timeline,减少网络开销。
- 分层存储:对历史Feed采用冷热分离策略,近期数据存Redis,长期数据归档至MySQL或HBase,平衡读写性能与存储成本。
- 缓存关注关系:将用户的关注列表缓存至Redis的Set或Hash中,避免频繁查询数据库,加速推模式中的粉丝遍历。
四、高可用与扩展性设计
- 集群分片:按用户ID哈希分片,将不同用户的Timeline分散至不同Redis节点,避免单节点热点问题。
- 异步处理:发布Feed时通过消息队列(如Kafka)异步通知推送服务,避免阻塞用户发布操作。
- 监控与降级:实时监控Redis内存使用和延迟指标,当系统过载时自动切换至拉模式或限制大V推送频率。
五、适用场景与限制
- 优势:Redis方案适合读写比例高(100:1以上)、消息必达性要求严格的Timeline类型Feed流(如朋友圈、微博关注页)。
- 局限:对于粉丝量超千万的顶级账号,纯推模式仍可能面临存储膨胀问题,需结合拉模式或混合模式优化。