Mysql 是否使用redis将所有用户通知保留在列表中?

Mysql 是否使用redis将所有用户通知保留在列表中?,mysql,ruby-on-rails,notifications,redis,Mysql,Ruby On Rails,Notifications,Redis,我在我的应用程序中有社交网络的一些方面,我已经实现了一个类似以下答案的活动流: 正如上面所说,在系统中的每个通知中,我为每个被通知的用户(键)推送redis,一个Activities关系表中的id列表(值): key value user:1:notifications [25, 24, 23] user:2:notifications [24, 22, 17, 13, 5, 4] ... 因此,我的表中只有导致这种

我在我的应用程序中有社交网络的一些方面,我已经实现了一个类似以下答案的活动流:

正如上面所说,在系统中的每个通知中,我为每个被通知的用户(键)推送redis,一个Activities关系表中的id列表(值):

key                         value
user:1:notifications        [25, 24, 23]
user:2:notifications        [24, 22, 17, 13, 5, 4]
...
因此,我的表中只有导致这种情况的活动和用户。结果是,我只有在redis中收到通知的用户,而在mysql中没有收到任何通知


我的问题是,如果在redis中持久化此ID是正确的,或者只是为了一个memcached的更新和定期修剪此列表?

您不需要在redis中永久保留这些通知。恰恰相反:当用户登录时,在redis中显示您为他提供的所有通知,然后截断列表(或将其修剪为固定长度)。

这更像是一个应用程序架构/设计问题,而不是一个编程问题,因此理论上没有一个正确的答案

然而,在实践中,Redis/Memcache和许多其他类似的实现并不意味着要保存非常大(或快速增长)的数据集

作为nosql数据存储,Redis使用内存和硬盘上的镜像。因此,虽然您可以存储的数据大小没有限制,但理想情况下,它应该始终小于您计划分配给Redis的可用内存

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

当用户希望检索所有通知时,一些速度损失是可以接受的(因为这不是一个频繁的、必需的或提升的操作),您可以通过传递Redis从数据库中提取它们

备选方案: 同样,最好根据应用程序的实际数量选择要使用的解决方案。但你可以这样做:

  • 将所有活动存储在数据库中
  • 对于任何登录的用户,获取并存储Redis中的所有活动
  • 注销时从Redis中删除该用户的活动/通知
  • 添加活动时,需要一些附加逻辑来检查受影响的用户是否在线。在这两种情况下,您都需要将活动添加到数据库中,但如果受影响的用户处于联机状态,则也可以将其推送到Redis中的哈希中

但在facebook中,例如,可以检索所有通知。并不是所有的通知。我上星期才看到。您也可以这样做,为每个用户保留最后N个通知。非常感谢您的回答@卢卡斯:不客气。这些架构和设计模式问题是我最喜欢的!解决方案的优雅与否:)一定要让我知道你决定做什么。@Luccas你最终做了什么???@VarunVohra我知道,我也很好奇!