`

Redis 学习(四)微博feed系统的推(push)模式和拉(pull)模式(转)

 
阅读更多

微博feed系统的推(push)模式和拉(pull)模式和时间分区拉模式架构探讨

     sns系统,微博系统都应用到了feed(每条微博或者sns里的新鲜事等我们称作feed)系统,不管是twitter.com或者国内的新浪微博,人人网等,在各种技术社区,技术大会上都在分享自己的feed架构,也就是推拉模式(timyang上次也分享了新浪微薄的模式)。下面我们就微博的feed推拉(push,pull)模式做一下探讨,并提出新的时间分区拉模式

      众所周知,在微博中,当你发表一篇微博,那么所有关注你的followers(粉丝)都会在一定的时间内收到你的微薄,这有点像群发一封邮件,所有的抄送者都会在一定的时间内收到。到这里,你可能觉得没有什么难度。我们看下下面的截图:

     

       图一:新浪微博姚晨

         图二:twitter上冯大辉

     新浪微博的姚晨粉丝有2594751,她发表任何一篇微博,都需要2594751个粉丝在一定的时间内收到,twitter的冯大辉发表一篇的话,需要19868个followers收到。

     相反,姚晨需要收到他关注的545个人的所有更新,冯大辉需要收到他关注的2525个人的所有更新。到这里,你是不是感觉到有那么一点点小挑战呢?

     下面我们看下微博一般的整体结构图:

      

                 图三:微博整体结构

       图中展示了微博的整体数据流程,先了解下整体的数据结构,没有涉及到followers等的推拉模式处理。下面我们再看下推模式(push):

          图四:推模式结构

   推模式需要把一篇微博推送给所有关注他的人(推给所有的粉丝),比如姚晨,我们就需要推送给2594751个用户的feeds表中。当然,feeds表可 以很好的进行sharding,存储也都是一些数字型的字段,存储空间可能不是很大,用户在查询自己关注的所有人的feed时,速度快,性能非常高,但是 推送量会非常大,姚晨发表一篇,就会产生200多万条数据。试想,一个大量用户的微薄系统通过使用推模式,是不是会产生非常惊人的数据呢?

    下面看下拉模式(pull)

            图五:拉模式

     拉模式只需要用户发表微博时,存储一条微博数据到feeds表中(feeds表可以是一个临时表,只保存近期可接受范围的数据).用户每次查询feed时 都会去查询feeds表。比如姚晨打开自己的微薄首页,就产生:SELECT id FROM feeds where uid in(following uid list) ORDER BY id DESC LIMIT n(查询最新的n条),缓存到memcached

uidlist=>{data:id list,timeline:上次查询出来的最新的一条数据的时间}

再次刷新:SELECT id FROM feeds where uid in(following uid list) AND timeline>(memcached存储的上次的timeline) ORDER BY id DESC LIMIT n

 

    这种模式实现起来也是比较简单和容易的,只是在查询的时候需要多考虑下缓存的结构。但是feeds表会产生很大的压力,怎么说feeds表也要保存最近 十天半个月的数据吧,对于一个大点的系统,这会产生比较大的数据,如果following的人数比较多,数据库的压力就会非常大。而且一般在线的用户,客 户端都会定期扫描,又会增加很大的压力,这在查询性能上没有推模式的效率高。

     下面我们在对拉模式做一下改进优化

     

           图五:拉模式(pull)-改进(时间分区拉模式

           拉模式的改进主要是在feeds的存储上,使用按照时间进行分区存储。分为最近时间段(比如最近一个小时),近期的,比较长时期等等。我们再来看下查询的 流程,比如姚晨登陆微博首页,假设缓存中没有任何数据,那么我们可以查询比较长时期的feeds表,然后进入缓存。下一次查询,通过查询缓存中的数据的 timeline,如果timeline还在最近一个小时内,那么只需要查询最近一个小时的数据的feed表,最近一个小时的feeds表比图四的 feeds表可要小很多,查询起来速度肯定快几个数量级了。

          改进模式的重点在于feeds的时间分区存储,根据上次查询的timeline来决定查询应该落在那个表。一般情况下,经常在线的用户,频繁使用的客户 端扫描操作,经常登录的用户,都会落在最近的feeds表区间,查询都是比较高效的。只有那些十天,半个月才登录一次的用户需要去查询比较长时间的 feeds大表,一旦查询过了,就又会落在最近时间区域,所以效率也是非常高的。

         关于时间的分区,需要根据数据量,用户访问特点进行一个合理的切分。如果数据发表量非常大,可以进行更多的分区。

        上面介绍的推模式和拉模式都有各自的特点,个人觉得时间分区拉模式弥补了图四的拉模式的很大的不足,是一个成本比较低廉的解决方案。当然,时间分区拉模式也可以结合推模式,根据某些特点来增加系统的性能。

        后记:本文的目的是介绍时间分区拉模式,本人对新浪微博和twitter等的推拉模式的细节并不清楚。

 

 

新浪微博:http://t.sina.com.cn/sunli1223

原文地址:http://www.cnblogs.com/sunli/archive/2010/08/24/twitter_feeds_push_pull.html

 

 

 

分享到:
评论

相关推荐

    一种基于Scrapy-Redis的分布式微博数据采集方案.pdf

    "一种基于Scrapy-Redis的分布式微博数据采集方案.pdf" 本文主要讨论了基于Scrapy-Redis的分布式微博数据采集方案,旨在解决微博数据采集的难题。微博作为一種重要的网络舆情传播渠道,获取大量的微博数据对后续的...

    微博和知乎中的 feed 流是如何实现的?1

    与推模式相反,拉模式是用户主动请求获取最新的feed信息,例如用户刷新页面时,系统会遍历并返回关注对象的最新动态。这种模式下,系统负载主要集中在用户请求时,而不是信息发布的瞬间。 在实现feed流时,观察者...

    Redis在微博场景的优化实践.pptx

    Redis在微博场景的优化实践主要关注了如何在大规模的社交网络环境中提高性能、降低成本并确保系统的高可用性。以下是对Redis在微博应用中所涉及的关键知识点的详细解释: 1. **Redis的应用场景**: - **信息流**:...

    新浪微博开放平台中的Redis实践_大数据时代feed架构_微博消息系统架构演进_互联网公司技术架构资料.新浪微博.微博架构与平台安全_构建高性能的微博系统

    新浪微博开放平台中的Redis实践_大数据时代feed架构_微博消息系统架构演进_互联网公司技术架构资料.新浪微博.微博架构与平台安全_构建高性能的微博系统——再谈新浪微博架构 演讲视频,PPT,一些收集的博客地址等

    基于php+redis+mysql的微博系统.zip

    【标题】"基于php+redis+mysql的微博系统"揭示了这个项目是使用PHP编程语言,结合Redis内存数据存储和MySQL关系型数据库构建的一个微博应用。这种架构常见于高并发、实时性强的社交网络系统中,因为PHP擅长处理前端...

    亿级流量新浪微博与微信Redis架构实战

    亿级流量新浪微博与微信Redis架构实战

    Redis学习指南 Redis学习手册

    Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,常被用于数据库、缓存以及消息中间件的角色。作为一款开源的、基于内存的数据结构存储系统,它支持数据持久化,可以同时处理大量写入和读取操作...

    新浪微博开放平台redis 实践

    ### 新浪微博开放平台Redis实践 #### Redis简介 Redis是一种开源的、高性能的键值对存储系统,它支持多种数据结构如字符串、哈希、列表、集合等,并且提供了丰富的命令来操作这些数据结构。由于其优秀的性能表现,...

    node-pushpull:使用 Redis 列表作为后端的 PushPull 模式

    安装npm install --save pushpull 如果你还没有使用 Redis 并且仍然使用 npm ≤ 2.x,那么你也必须安装redis : npm install --save redis 您可能希望尽可能将hiredis安装到: npm install --save-optional hiredis...

    Redis与SpringBoot微博实战 ①

    Redis与SpringBoot微博实战 ①

    Redis学习笔记整理

    四、 redis学习笔记之事务 16 五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31

    PHP+redis实现微博的推模型案例分析

    所谓推模型,就是用户在发布微博的时候会将微博推送给关注者和自己,然后其他关注者登录之后就可以看到发布的微博。 微博项目数据结构设计 user表设计 注册的时候将user数据写入redis中,key如下: user数据的key ...

    Redis哨兵主从模式+keepalived.docx

    "Redis哨兵主从模式+keepalived" Redis哨兵主从模式是指 Redis 的一种高可用性解决方案,通过哨兵模式实现自动故障切换和虚拟IP漂移,以提供高可用性的Redis服务。下面是相关知识点的详细解释: 一、Redis主从复制...

    Redis哨兵模式配置文件

    Redis Sentinel,或者称为哨兵模式,是Redis集群架构中的一个重要组成部分,主要用于实现高可用性(HA)。在单机模式下,Redis服务器一旦宕机,将会导致服务不可用,哨兵模式就是为了克服这个问题而设计的。它监控...

    redis学习笔记

    redis学习笔记redis 是一个开源的 key-value 数据库。它又经常被认为是一个数据结构服务器。 因为它的 value 不仅包括基本的 string 类型还有 list,set ,sorted set 和 hash 类型。当 然这些类型的元素也都是 string...

    兰将州-Redis在微博场景下的优化实践.pdf

    其中,Redis因其卓越的性能表现和丰富的功能集成为微博系统中的关键组件之一。本文档旨在详细介绍兰将州在全球敏捷运维峰会北京站分享的关于Redis在微博场景下的优化实践。 #### 二、Redis应用场景概述 Redis在...

    redis学习相关资料

    redis学习相关资料 redis命令 redis文档总结 Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash...

    Redis在微博场景下的优化实践.pdf

    在微博的业务场景中,Redis作为一种高性能的键值存储系统,扮演着至关重要的角色。兰将州在“全球敏捷运维峰会”北京站的演讲中详细介绍了Redis在微博的应用及优化实践,涵盖了Redis的选择原因、应用场景、面临挑战...

Global site tag (gtag.js) - Google Analytics