首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >收件箱的Redis数据结构设计

收件箱的Redis数据结构设计
EN

Stack Overflow用户
提问于 2016-03-28 18:18:27
回答 1查看 324关注 0票数 2

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

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

看起来大概是这样的:

代码语言:javascript
复制
UserA "Some message.."  2016-3-3
UserB "Other message.." 2016-3-2
UserC "..."             2016-2-15
etc..

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

起初,我考虑有一组经过排序的用户(即UserA、UserB、UserC),但这意味着我必须有一个循环才能从每个用户获得最新消息。

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-28 23:40:34

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

排序集的分数可以全部设置为0,因为无论如何我们都将使用字典排序(但是将它们设置为消息的实际时间戳并没有坏处,至少在这个答案的上下文中是这样)。排序集的成员应以下列方式构造:

代码语言:javascript
复制
<date in YYYYMMDD>:<from user>:<message>

这将让您轻松地拉出该视图,并使用ZREVRANGE对其进行页面浏览。

但这只是故事的一半--当userX从userA收到一条新消息时,您需要某种方法从userX的收件箱中找到并删除以前的消息--这就是为什么您需要哈希。

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

为了确保Hash和排序集是一致的,我建议您在事务中将它们包装在一起。您可以使用 block,但我的首选是Lua脚本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36268382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档