2012-03-07 34 views
4

我有我的应用程序在社交网络方面,我已经实现了这样的答案的活动流:使用redis在列表中保留所有用户通知?

How to implement the activity stream in a social network

就像说有,系统中的每个通知,我推在Redis的每个用户(键),它从活动关系表的ID的通知,列表(值):

key       value 
user:1:notifications  [25, 24, 23] 
user:2:notifications  [24, 22, 17, 13, 5, 4] 
... 

所以,我的表只有活动,并导致该用户。发生什么事是,我只有在redis中收到通知而没有在mysql中的用户...

我的问题是,如果是正确的,坚持这个ids无限在redis或只是一个memcached的更新和定期我修剪这个列表?

回答

3

你并不需要在Redis的永远坚持这些通知。正好相反:用户登录时,在redis中显示你为他提供的所有通知,然后截断列表(或将其修剪为固定长度)。

+0

但在Facebook的,例如,它可以检索所有通知。 https://www.facebook.com/notifications – Luccas 2012-03-07 14:56:50

+3

这不是**全部**通知。我只看到上周左右。你可以做同样的事情,保持每个用户的最后N个通知。 – 2012-03-07 14:58:25

7

这是一个多编程一个应用程序架构/设计问题的,所以没有一个在理论上正确的答案。然而,在实践中--Redis/Memcache和许多其他这样的实现是而不是意味着来坚持非常大的(或快速增长的)数据集。

作为NoSQL数据存储,Redis的使用存储器,加上在硬盘上的反射镜。因此,尽管您可以存储的数据大小没有限制,但理想情况下它应该始终小于您计划分配给Redis的可用内存。

覆盖所有的碱,最简单的解决方案是,因为它是生成存储在Redis的用户活动数据。使用Redis显示通知等。保持运行cron,截断所有活动日志超过预定义天数(或每个用户预定义数量的活动)并将其保存到常规数据库。

当用户希望检索所有的通知,一些速度损失是可以接受的(因为它是不是经常,要求或推动作用),你可以从数据库中提取它们,绕过Redis的。

备选: 再次使用该解决方案基于应用程序的实际数字是最好的选择。但是,你可以这样做:在数据库中

  • 对于任何登录用户

    • 商店的所有活动,获取并存储在Redis的所有活动
    • 在注销从Redis的
    • 删除该用户的活动/通知
    • 添加活动时,需要一些额外的逻辑来检查受影响的用户是否在线。在这两种情况下,您都需要将活动添加到数据库,但是如果受影响的用户在线,那么也可以将其推送到Redis中的哈希中。
  • +0

    非常感谢您的回答! – Luccas 2012-03-08 02:12:42

    +0

    @卢卡斯:我很高兴的人。这些架构和设计模式问题是我的最爱!优雅的解决方案和什么不是:)请让我知道你决定做什么。 – 2012-03-10 09:00:26

    +1

    @Luccas你最终做了什么? – 2012-11-20 22:06:51

    相关问题