如何获取所有设置redis的密钥按其SCARD排序?

时间:2014-05-07 20:46:09

标签: ruby-on-rails redis

我正在使用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:*")

并返回这些键的数组。但无法确定是否有可能或正确的方法来实现这一目标......

欢迎任何帮助和想法。 谢谢!

1 个答案:

答案 0 :(得分:0)

重要提示:请勿使用KEYS命令 - 它仅用于非生产目的。请参阅the doc page,具体来说:

  

警告:将KEYS视为一个只能在生产环境中使用时非常谨慎的命令。在针对大型数据库执行时可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用KEYS。

此外,KEYS不保证结果的顺序 - 正如您自己发现的那样:)

我可以建议三种可能的方法来应对这一挑战:

  1. 排序集:您可以使用排序集来存储每个用户的收件箱组,并将每个组的得分设置为基数/计数(天真地,ZADD user:1:inbox:groups 3 "1" 2 "2" 1 "3")。然后,您可以使用ZRANGE / ZREVRANGE等来获取已排序的结果。

  2. SORT Command :Redis'SORT非常强大。例如,您可以为每个用户的组使用列表/集,并将权重(基数)保存在单独的键中。完成后,您可以使用以下内容检索列表:

    SORT用户:1:收件箱:分组DESC BY用户:1:收件箱:group_card _ *

  3. 自己动手:有时在数据库中执行外部排序更简单/更有效。当然,这取决于您的数据模型和要求,但请注意,之前的建议都需要Redis空间和计算能力,而DIY方法可以将部分成本委托给应用程序/客户端。