Facebook如何做到这一点?

时间:2009-09-14 16:31:02

标签: algorithm database-design web-applications facebook

你有没有注意到facebook如何说“3个朋友和33个人喜欢这个”?我想知道这样做的最佳方法是什么。我不认为通过朋友列表,“喜欢这个”并比较它们的用户列表是高效的!他们是否在数据库中跟踪这个?这将使数据库的规模非常大。 你们觉得怎么样?

谢谢!

8 个答案:

答案 0 :(得分:8)

我猜他们将friends表与他们的likes表加入,以便同时计算常规喜欢和朋友喜欢。

使用适当的索引,它根本不会是一个缓慢的查询。巨大的数据库不一定很慢,因此没有理由不将所有这些信息存储在数据库中。诀窍是确保索引和分区(如果有的话)设置得很好。

答案 1 :(得分:5)

Facebook使用Cassandra,至少在某些方面是NoSQL数据库。这里有一些更详细的讨论,讨论一些较大的社交媒体网站如何解决这些问题:

http://www.25hoursaday.com/weblog/2009/09/10/BuildingScalableDatabasesDenormalizationTheNoSQLMovementAndDigg.aspx

如果您按照其中的链接访问Digg博客文章等,那里会有很多有趣的阅读。

答案 2 :(得分:4)

是的,他们肯定会将其保存在数据库中,因为他们肯定有超过1台需要访问数据的服务器。

至于可伸缩性,我确信它们使用了很多缓存。

以下是一个例子:

如果要经过100万行,索引可以执行O(logn)= 20次操作(在最坏的情况下),只是为了找到你需要的东西。

对于200万,你只需要21次操作(在最坏的情况下)来找到你需要的东西。

每次将用户数量增加一倍时,只需要再操作一次(在最坏的情况下),使用O(logn)索引。

它们还具有分布式体系结构或群集数据库。

答案 3 :(得分:3)

Facebook必须使用触发器(一旦事件发生就会自动执行)。

例如,假设创建了一个触发器来存储喜欢该状态的人的计数和名称,那么每当有人喜欢你的状态并且过于隐含(自动)时它就会被执行。

这使得操作方式过于简单,Facebook不必手动更新数据库或为此存储庞大的数据库。此外,这种方法更快。

答案 4 :(得分:2)

在设计社交网络软件(mothsorchid.com)时,我发现解决此问题的唯一方法是预先缓存通知流。一个人不会在页面加载时查询数据库来计算有多少朋友和其他人“喜欢这个”,当有人'喜欢'在对象上记录的东西时,并且在检索对象时可以与当前用户进行比较好友列表。如果有人更新了他们的个人资料/发表评论/等,它会向朋友发送通知对象,这些朋友会在其供稿中预先缓存。以磁盘空间为代价严重削减数据库工作,但磁盘空间很便宜。

至于Facebook如何做到这一点,他们使用的是Cassandra DBMS,这可能与您的想法有所不同。

答案 5 :(得分:1)

请记住,Facebook强烈使用memcached,因此他们会在内存中保留大量数据,并且只在绝对必要时才会刷新。有关这方面的一些可伸缩性讨论,请参阅此博客文章:

http://www.facebook.com/note.php?note_id=39391378919

答案 6 :(得分:0)

有人可能喜欢的每个条目可能包含一个喜欢它的人的列表(所有这些当然都在数据库中)。当您查看该条目时,它们会与您的朋友列表进行匹配,以查看哪些条目是您的朋友。瞧。

答案 7 :(得分:0)

在QCon演讲中,Facebook的工程总监解释了很多这样的事情:

http://www.infoq.com/presentations/Facebook-Software-Stack

值得观看的精彩演示.....