我正在使用redis存储像收件箱这样的东西。每个密钥都包含特定组的消息。
在rails中我需要获取它并按消息计数对组进行排序。
user:1:inbox:group:1: a, b, c
user:1:inbox:group:2: a, b
user:1:inbox:group:3: a
SCARD user:1:inbox:group:1 = 3
SCARD user:1:inbox:group:2 = 2
SCARD user:1:inbox:group:3 = 1
同样,我希望获得所有组ID,在这种情况下:1,2,3,但它们必须按照设置的元素数量处于DESC顺序。换句话说,具有更多消息的组将位于列表的第一个中。
我知道我能做到:
REDIS.keys("user:1:inbox:group:*")
并返回这些键的数组。但无法确定是否有可能或正确的方法来实现这一目标......
欢迎任何帮助和想法。 谢谢!
答案 0 :(得分:0)
重要提示:请勿使用KEYS命令 - 它仅用于非生产目的。请参阅the doc page,具体来说:
警告:将KEYS视为一个只能在生产环境中使用时非常谨慎的命令。在针对大型数据库执行时可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用KEYS。
此外,KEYS不保证结果的顺序 - 正如您自己发现的那样:)
我可以建议三种可能的方法来应对这一挑战:
排序集:您可以使用排序集来存储每个用户的收件箱组,并将每个组的得分设置为基数/计数(天真地,ZADD user:1:inbox:groups 3 "1" 2 "2" 1 "3"
)。然后,您可以使用ZRANGE / ZREVRANGE等来获取已排序的结果。
SORT Command :Redis'SORT非常强大。例如,您可以为每个用户的组使用列表/集,并将权重(基数)保存在单独的键中。完成后,您可以使用以下内容检索列表:
SORT用户:1:收件箱:分组DESC BY用户:1:收件箱:group_card _ *
自己动手:有时在数据库中执行外部排序更简单/更有效。当然,这取决于您的数据模型和要求,但请注意,之前的建议都需要Redis空间和计算能力,而DIY方法可以将部分成本委托给应用程序/客户端。