2012-05-03 46 views
0

我很难考虑如何使用Ruby和Redis(或任何NoSQL解决方案)实现在线好友列表,就像任何聊天IM即Facebook聊天一样。我的要求是:缩放在线好友列表的Redis

  • 大约有100个万名用户总量
  • DB仅存储用户朋友的IDS(一套整数值)

我想使用Redis的集群(其中我其实并不知道太多),并沿着http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/的方向执行。

更新:我们的应用程序真的不会使用Redis作为除了潜在的在线朋友列表之外的任何其他内容。此外,它实际上并不沉重(我预计大部分查询都是在线朋友阅读的)。

+0

请勿在stackoverflow和Redis ML上交叉发布。提供Redis支持的人被认为是不礼貌的。 –

+0

对@DidierSpezia抱歉,我并不知道我对Redis社区不屑一顾。我可以看到这就像垃圾邮件。 –

回答

2

Redis DB Google Groups讨论这个问题后,我提出的解决方案(由this article启发)是SADD我所有的在线用户分成一组,并为每个我的用户,我创建了一个user:#{user_id}:friends_list和存储他们的好友列表作为另一个组。每当用户登录时,我会SINTER用户的好友列表和当前的在线用户设置。由于我们阅读起来很重,而且写得不重,所以我们会使用一个主节点进行写操作。为了使它的规模,我们不得不从主从复制节点的集群,我们的应用程序将使用一个简单的循环算法做SINTER

​​提出了一个更精细的方法:

  1. 当用户X登录时,他们与在线用户 在线用户交集他们的朋友,以获得他们的初始在线设置,并且保留它为Y分钟的TTL(只要他们在网站上执行任何操作,就可以更新 到期时间为将来更多分钟Y)
  2. 对于每一个用户是“在线”设置,你会发现他们的相似 “初始设置”,并添加X设定的
  3. 任何时候,使用者z注销,您扫描他们的朋友设置,并删除 ž从他们所有(不管他们是否存在)
0

xmpp/jabber呢?他们内置了大量的并发使用和高可靠性,你只需要为用户登录的东西制作一个适配器即可。

+0

我对XMPP根本不熟悉,似乎它有很多不符合我们需要的功能。你有没有尝试过使用XMPP? –

0

您应该考虑在内存数据网格中,这些平台的目标是提供这种可伸缩性。 并且通常可以轻松地将其部署为任何云硬件上的集群。 请参阅:GigaSpaces XAP,vMware GemFire或Oracle Coherence。 如果您正在寻找免费版XAP提供的社区版。

+0

不幸的是,我的技术堆栈是Ruby,大部分建议都有Java/.NET驱动程序。此外,他们背后的社区支持并不像Redis那样强大(至少从初看起来)。 –

+0

XAP提供了许多可供Ruby开发人员使用的标准API。 例如memcached,REST甚至Native API(C++) –