1

我在思考如何使用 Ruby 和 Redis(或任何 NoSQL 解决方案)实现在线朋友列表时遇到了麻烦,就像任何聊天 IM 即 Facebook 聊天一样。我的要求是:

  • 总用户约 100 万
  • DB 仅存储用户朋友的 id(一组整数值)

我正在考虑使用 Redis 集群(我实际上不太了解)并按照http://www.lukemelia.com/blog/archives/2010/01/17/redis-在实践中谁在线/

更新:我们的应用程序真的不会将 Redis 用于其他任何事情,除了可能用于在线朋友列表。此外,它真的写得不重(我预计,我们的大多数查询将被在线朋友阅读)。

4

3 回答 3

4

Redis DB Google Groups中讨论了这个问题后,我提出的解决方案(受这篇文章的启发)是将SADD我所有的在线用户放到一个集合中,并为我的每个用户创建一个user:#{user_id}:friends_list并将他们的朋友列表存储为另一个集合。每当用户登录时,我都会SINTER将该用户的好友列表和当前在线用户设置。由于我们读重而不写重,我们将使用单个主节点进行写入。为了使其可扩展,我们有一个从主节点复制的从节点集群,我们的应用程序将使用一个简单的循环算法来完成SINTER

Josiah Carlson提出了一种更精细的方法:

  1. 当用户 X 登录时,您将他们的朋友集与在线用户相交以获得他们的初始在线集,并使用 Y 分钟 TTL 保存它(他们在网站上做任何事情时,您都可以将过期时间更新为未来还有 Y 分钟)
  2. 对于该“在线”集中的每个用户,您会找到他们相似的“初始集”,然后将 X 添加到该集中
  3. 每当用户 Z 退出时,您都会扫描他们的朋友集,并从他们中删除 Z(无论他们是否存在)
于 2012-05-12T23:03:10.503 回答
0

xmpp/jabber 呢?它们内置海量并发使用和高可靠性,您需要做的就是为用户登录的东西制作一个适配器。

于 2012-05-04T02:51:44.167 回答
0

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

于 2012-05-09T14:59:15.103 回答