我的网站允许用户使用对话进行交流。
在会话收件箱页面中,用户可以看到与他联系的所有用户,包括预览来自特定用户的最新消息。页面按预览消息的日期排序。
看起来大概是这样的:
UserA "Some message.." 2016-3-3
UserB "Other message.." 2016-3-2
UserC "..." 2016-2-15
etc..
我想知道用于有效建模的Redis数据结构的正确组合是什么。
起初我考虑过拥有一组有序的用户(即UserA,UserB,UserC),但这意味着我必须有一个循环来获取每个用户的最新消息。
有没有更好的方法,避免循环?
谢谢!
答案 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脚本。