`
willko
  • 浏览: 386668 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

feed设计

    博客分类:
  • php
阅读更多
对于sns来说,动态就是核心,动态是传播信息的媒体,用户以动态展开各种交互。

从技术角度来说,动态在读和写方面会很多,用户要先看到动态再去做其它操作,而其它操作都会导致动态的更新,表记录会很多,并只有插入,删除和查询,动态显示每个人都不一样,甚至有很大分别。

先说下好友表,好友表需要有用户id和好友的id两个字段,建唯一索引。连接的时候只需using index,如果内存够大,可以缓冲到内存中,速度够快~好友表肯定是sns中的大表之一,所以必须水平切分,好友表比较好分,因为没有查整张表的业务。

而个人动态,从业务来说,就是分为标题和内容。
例如:
引用

[用户a] 上传了 [n] 张照片至 [看图不说话]
[图片1] [图片2]

[用户b] 更新的头像
[新头像]

[用户c] 分享了 [用户h] 的日志 [你好,我也好]
[大家好,才是真的好]

[用户f] 与 [用户h] 成为好友

....

所以可以像设计论坛主题那样来设计这张表,但是为了性能,所以这张表要够小,对于动态字段都保存在持久存储系统中,例如Tokyo Tyrant,memcachedb

表结构:
引用
feed_id mediumint(8)
user_id mediumint(8) 动态产生人
feed_type enum('blog', 'friend', 'album') 动态类型
input_date timestamp 发生动态时间,索引
feed_title 动态标题 放在持久存储系统中
feed_content 动态内容 放在持久存储系统中

如果要考虑用户更改数据后更新动态,例如发表日志后,把标题改了,那可以把动态的数据和模板分离,那只需更新动态的数据就可以了,不过要产生动态的应用要记录动态的id

查询的话sql语句如下
SELECT * 
FROM  `friend` f,  `feed` fd
FORCE INDEX ( input_date ) 
WHERE f.friend_user_id = fd.user_id
AND f.user_id =1
ORDER BY fd.input_date
LIMIT 30

为了防止mysql自作聪明优化sql,所以强制用input_date索引,这样不会出现using filesort。。
可以考虑把最终结果放到memcached中缓存起来,无需考虑命中率,因为这里的cache只需起到分担数据库的压力就可以了,而memcahed自己有淘汰机制,非活跃用户的数据会被刷掉,前提是内存不够。

关于分表,可以把旧记录保存起来,极端点就删掉


后期
这种方式对于初次来说还可以满足,后期的话,好友和feed的数量查询缓慢,所以,只能把feed推给用户,目前还在实验阶段。



参考资料:
uchome
2
0
分享到:
评论
2 楼 willko 2009-12-24  
xianglei 写道
feed的分发是核心,特别是一条信息发送给几百万个好友的情况。

说的很对,所以要有沉默用户。
沉默用户就不推送了。等他下次上线主动获取数据。
1 楼 xianglei 2009-12-24  
feed的分发是核心,特别是一条信息发送给几百万个好友的情况。

相关推荐

    FEED前端工程设计.pdf

    前端工程设计(FEED,Front End Engineering Design)是工程项目中非常关键的一个阶段,特别是在石油天然气等大型复杂项目中。这个阶段通常发生在详细设计之前,大约80%的总项目成本在此阶段得到确定,因此FEED阶段...

    Laravel开发-feed

    Laravel Feed Generator库(可能就是`laravel-feed-master`这个压缩包的内容)是专门为Laravel设计的,它简化了创建和管理RSS feeds的过程。开发者无需深入理解RSS XML结构,只需通过简单易用的API即可生成符合RSS2...

    前端开源库-feed

    【前端开源库-feed】是一个专为Node.js设计的开源库,其主要功能是生成RSS、Atom和JSON Feed格式的数据,方便开发者在构建Web应用时轻松实现内容聚合和联合。这个库的目标是简化处理这些标准格式的过程,使得即使对...

    简单的rss实现(C#)

    - 另外,可以使用`System.ServiceModel.Syndication`命名空间中的`SyndicationFeed`类,它是.NET专门为处理RSS和Atom feed设计的。 3. **创建RSS Feed** - 使用`SyndicationFeed`类,你可以轻松地创建一个新的RSS...

    RSSFeed

    RSSFeed类库是专为简化RSS文件生成而设计的,它允许开发者无需深入理解RSS的语法,就能创建符合规范的RSS feed。 ### 1. RSSFeed类库的核心功能 RSSFeed类库的主要目标是提供一个易于使用的接口,以便开发者可以...

    feed流拉取,读扩散

    - **扩展性限制**:随着用户量的增长,这种模式下的性能瓶颈会愈发明显,需要考虑更高效的架构设计。 #### 结论 拉取模式(读扩散)虽然在某些方面表现优秀,如简单的存储结构和易于理解的业务流程,但在大规模...

    Laravel开发-laravel-feed

    在本文中,我们将深入探讨 Laravel 开发中的一个重要扩展——laravel-feed,这是一个专门为 Laravel 框架设计的服务提供商,它利用 Zend Feed 包来处理 RSS 和 Atom 提供者,帮助开发者轻松地集成和管理网站的新闻...

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

    在实现feed流时,观察者模式是关键的设计模式。在这个模式中,用户是观察者,他们关注的人或话题是被观察者。当被观察者有新的动态时,会通知所有观察者,即用户,将这些动态添加到用户的feed列表中。 对于大规模的...

    19621 FEED HMI.rar

    总的来说,"19621 FEED HMI.rar" 文件包是一个全面的工业自动化解决方案,涵盖了从系统设计到实际操作的各个环节,对于理解和优化一个特定的进料系统有着重要的参考价值。学习和掌握这些知识点不仅可以提升操作效率...

    朋友圈微博feed流,推拉实践

    在设计和优化feed流系统时,通常有两种主要的实现方式:拉模式(Read Diffusion)和推模式(Write Diffusion)。 **一、拉模式(读扩散)** 在拉模式中,数据的读取是扩散的。每个用户的feed队列只存储他们自己...

    该代码能完成解析XML文件的RSS解析器

    标题提到的"该代码能完成解析XML文件的RSS解析器"是指一个专门针对RSS feed设计的XML解析工具。这样的解析器能够读取RSS源文件,解析其XML结构,并将内容转换为可供程序处理的数据结构,如Python中的字典或对象。 ...

    电信设备-构建Feed流应用的装置和Feed流信息推送的方法.zip

    3. 用户接口:设计简洁易用的界面,允许用户自定义兴趣偏好,以便推送个性化的Feed流信息。 4. 实时更新机制:通过WebSocket、轮询或者长轮询等方式实现数据的实时推送。 四、Feed流信息推送方法 1. 拉取模式:用户...

    jQuery插件解析RSS20规范它是基于jFeed

    `jFeed`是jQuery的一个插件,专为解析RSS和Atom feed设计。它简化了从RSS源获取和处理数据的过程,提供了友好的JavaScript API。通过使用jFeed,开发者可以轻松地将RSS内容集成到网页中,如显示文章标题、摘要、发表...

    swift-Instagram-Feed-View-显示feed的demo视图

    6. UIStackView:Swift 9.0之后引入,可以方便地管理和布局多个子视图,自动调整间距和排列方式,简化了界面设计。 在"Instagram-Feed-View-master"项目中,开发者可能使用了以下技术: 1. 自定义UICollectionView...

    网页获取RSS测试用例

    2. ** SyndicationFeed 类**:在.NET Framework中,System.ServiceModel.Syndication命名空间提供了一个SyndicationFeed类,它是专为处理RSS和Atom feed设计的。使用这个类可以轻松地解析RSS源并获取其元数据(如...

    Facebook的news feed架构,最新公开资料

    这样的设计可以有效分散负载,提高系统的稳定性和可靠性。 #### 三、社交图谱的影响 - **高度互联性**:社交图谱的平均距离仅为4.74度,意味着用户之间的联系非常紧密。 - **查询成本高昂**:由于社交图谱的高度...

Global site tag (gtag.js) - Google Analytics