【问题标题】:Scaling Redis for Online Friends List为在线好友列表扩展 Redis
【发布时间】:2012-05-13 12:07:46
【问题描述】:

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

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

我正在考虑使用 Redis 集群(我实际上不太了解)并按照http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/ 的方式实现一些东西。

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

【问题讨论】:

  • 请不要在 stackoverflow 和 Redis ML 上交叉发布。对于提供 Redis 支持的人来说,这被认为是不礼貌的。
  • 对@DidierSpezia 感到抱歉,我不知道我对 Redis 社区不体谅。我可以看到这就像垃圾邮件一样。

标签: ruby redis scalability user-presence


【解决方案1】:

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

【讨论】:

  • 我对 XMPP 一点也不熟悉,而且它似乎有很多不符合我们需求的功能。你以前用过 XMPP 吗?
【解决方案2】:

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

【讨论】:

  • 不幸的是,我的技术栈全是 Ruby,您的大多数建议都包含 Java/.NET 驱动程序。此外,它们背后的社区支持不如 Redis 强大(至少从最初的角度来看)。
  • XAP 提供了许多可供 Ruby 开发人员使用的标准 API。例如memcached、REST 甚至 Native API (c++)
【解决方案3】:

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

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

  1. 当用户 X 登录时,您将他们的朋友集与 在线用户获取他们的初始在线设置,然后您将其保存在 Y 分钟 TTL(只要他们在网站上做任何事情,您都可以更新 过期时间为 Y 分钟后)
  2. 对于该“在线”集中的每个用户,您会发现他们的相似之处 'initial set',然后将 X 添加到集合中
  3. 每当用户 Z 退出时,您都会扫描他们的好友集,然后删除 Z 来自他们所有人(无论他们是否存在)

【讨论】:

    猜你喜欢
    • 2013-04-12
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2021-10-03
    相关资源
    最近更新 更多