2012-05-03 52 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++) –