redis

时间:2015-10-30 07:30:58

标签: redis

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

<message_id, message_time, user_id, text, is_broadcast>

和操作:

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

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

1 个答案:

答案 0 :(得分:2)

听起来应该分别处理两种类型的消息。

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

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

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