Redis数据结构设计用于收件箱

时间:2016-03-28 18:18:28

标签: data-structures redis

我的网站允许用户使用对话进行交流。

在会话收件箱页面中,用户可以看到与他联系的所有用户,包括预览来自特定用户的最新消息。页面按预览消息的日期排序。

看起来大概是这样的:

UserA "Some message.."  2016-3-3
UserB "Other message.." 2016-3-2
UserC "..."             2016-2-15
etc..

我想知道用于有效建模的Redis数据结构的正确组合是什么。

起初我考虑过拥有一组有序的用户(即UserA,UserB,UserC),但这意味着我必须有一个循环来获取每个用户的最新消息。

有没有更好的方法,避免循环?

谢谢!

1 个答案:

答案 0 :(得分:0)

每个用户的收件箱都需要两个数据结构:哈希和排序集。

排序集的分数可以全部设置为0,因为我们无论如何都要使用词典排序(但是将它们设置为消息的实际时间戳是没有害处的,至少在这个答案的背景下)。排序集的成员应按以下方式构建:

<date in YYYYMMDD>:<from user>:<message>

这样,您就可以使用ZREVRANGE轻松拉出该视图并进行翻页。

但这只是故事的一半 - 当userX从userA发送新消息时,您需要某种方式来查找和删除userX的先前消息来自userX&#39; s收件箱 - 这就是你需要哈希的原因。

哈希用于查找给定用户对userX的最新消息。对于每个userX的朋友,在Hash中保留一个字段,该字段是发送用户的ID(例如userA),其值是收件箱的排序集成员,表示来自该用户的最新消息。用户(相同&#34;语法&#34;如上)。当新消息到达时,首先从Hash中获取先前的消息,将其从Set中删除,然后将新消息添加到Set并更新Hash的字段。

为了确保Hash和Sorted Set是一致的,我建议您考虑在事务中将它们包装在一起。您可以使用MULTI/EXEC block,但我的偏好是Lua脚本。