【问题标题】:Architecture of notification system in redisredis中通知系统的架构
【发布时间】:2015-10-30 22:22:26
【问题描述】:

我有一个用户通知系统。可以通过 id 向用户发送个人通知或向所有用户发送广播消息(例如,关于新功能)。现在它被实现为数据库中的单个表,其结构类似于

<message_id, message_time, user_id, text, is_broadcast>

和操作:

  • 为用户插入消息
  • 为用户 Y 获取 X 消息以显示并从数据库中删除它们(不显示第二次)
  • 为每个用户插入相同的消息(广播消息)
  • 删除所有超过 N 天的广播消息(对长时间未登录的用户不保留广播消息,但不删除个人消息)

现在我正在考虑将整个消息传递系统从 MySQL 迁移到 Redis,但我在选择有效的 Redis 数据结构时遇到了问题。我有一个想法为每个用户创建一个列表/一组消息。个人消息很好,但如果我有广播消息,我需要迭代所有列表并在那里放一条消息。同样的问题是删除旧的广播消息 - 我需要迭代所有列表并删除旧消息。有什么方法可以使它更容易吗? 谢谢!

【问题讨论】:

    标签: redis


    【解决方案1】:

    听起来这两种消息应该分开处理。

    也许将所有广播消息存储在一个排序集中,其中排序分数是时间戳。这使得 ZRANGE 可以轻松获取最新消息,并且 ZREMRANGEBYSCORE 可以轻松删除所有早于 N 天的广播消息。然后,为了实现广播消息的每个用户的伪已读/未读状态,您可以为每个用户存储他们已阅读的分数(时间戳)。 (在获取时间戳时也使用 ZRANGE .. WITHSCORES)

    然后,要处理个人消息,请使用每用户列表。您可以使用 LPUSH 进行插入,使用 LRANGE 和 LTRIM 为用户获取和删除 X 条消息。

    缺点:缺乏适当的每广播每用户已读/未读状态。优点:避免为每个用户存储相同的广播。

    【讨论】:

      猜你喜欢
      • 2012-03-23
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2013-12-20
      • 2010-12-17
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多