我有数千条消息,每条消息都像一个属性列表(文本,主题,日期等)存储在一个单独的密钥中:msg:1001
,msg:1002
等...
还有一个列为messages
的列表,其中包含所有现有消息的ID:1001,1002,1003...
现在我需要收到10条随机消息。
但是,我只需要那些用户没有标记的消息(有点未读)。
每个用户都有一个哈希键,其密钥为flags:USERID
= 1001=red,1005=blue,1010=red,...
目前,我必须在我的应用程序中保留完整的消息列表以及当前登录的所有用户的所有标志,并手动完成所有数学操作(使用JavaScript)。
有没有办法用Redis方式进行这样的查询,没有重复应用程序端的所有数据?
答案 0 :(得分:2)
您的问题是space–time tradeoff的示例。一方面,您说您不想在系统中保留未标记消息的列表,但我猜您还希望保持应用程序相对较快。因此,我建议放弃一些空间并保留一组未标记的消息。
在您的系统中创建消息后,将它们添加到messages
(SADD messages <messageid>
)和messages_unflagged
(SADD messages_unflagged <messageid>
)。用户在邮件中添加标记后,从未标记的集(SREM messages_unflagged <messageid>
)中删除该邮件。当您需要10个随机,未标记的消息时,您可以在固定时间内获取其ID(SRANDMEMBER messages_unflagged 10
)。