我的网站允许用户使用对话进行交流。
在“对话收件箱”页面中,用户可以看到与他联系的所有用户,包括来自特定用户的最新消息的预览。该页是按预览邮件的日期排序的。
看起来大概是这样的:
UserA "Some message.." 2016-3-3
UserB "Other message.." 2016-3-2
UserC "..." 2016-2-15
etc..我想知道什么是Redis数据结构的正确组合来有效地建模。
起初,我考虑有一组经过排序的用户(即UserA、UserB、UserC),但这意味着我必须有一个循环才能从每个用户获得最新消息。
有没有更好的方法,避免循环?
谢谢!
发布于 2016-03-28 23:40:34
每个用户的收件箱需要两种数据结构:哈希和排序集。
排序集的分数可以全部设置为0,因为无论如何我们都将使用字典排序(但是将它们设置为消息的实际时间戳并没有坏处,至少在这个答案的上下文中是这样)。排序集的成员应以下列方式构造:
<date in YYYYMMDD>:<from user>:<message>这将让您轻松地拉出该视图,并使用ZREVRANGE对其进行页面浏览。
但这只是故事的一半--当userX从userA收到一条新消息时,您需要某种方法从userX的收件箱中找到并删除以前的消息--这就是为什么您需要哈希。
哈希用于查找来自给定用户的最新消息到userX。对于每个userX的朋友,在Hash中保留一个字段,该字段是发送用户的ID (例如userA),其值是收件箱的排序集合成员,它代表来自该用户的最新消息(与上面相同的“语法”)。当一条新消息到达时,首先从哈希获取前一条消息,然后从集合中删除它,然后将新消息添加到集合中,并更新Hash字段。
为了确保Hash和排序集是一致的,我建议您在事务中将它们包装在一起。您可以使用 block,但我的首选是Lua脚本。
https://stackoverflow.com/questions/36268382
复制相似问题