使用Redis进行动态排序

时间:2011-12-21 12:19:37

标签: python redis

假设我的Redis数据库中有5个条目:

  • news::id:上次新闻的ID;
  • news::list:所有新闻ID的列表;
  • news:n其中 n 是新闻ID:包含titleurl等字段的哈希值;
  • news:n:upvotes:投票新闻的所有用户ID的列表,从而给出了upvotes的数量。
  • news:n:downvotes:下载新闻的所有用户ID的列表,从而给出了downvotes的数量。

然后我有多个排名算法,其中rank =

  1. upvotes_count;
  2. upvotes_count - downvotes_count;
  3. upvotes_count - downvotes_count - age;
  4. upvotes_count / downvotes_count;
  5. age
  6. 现在我如何根据这些算法对这些新闻进行排序?

    我考虑过在每张选票上计算不同的等级,但如果我引入新的算法,我需要计算所有新闻的新等级。

    EVAL可以提供帮助,但在v2.6之前它无法使用,我当然不想等待。

    最终,我可以检索所有新闻并将它们放入Python列表中。但它又转化为高内存使用率,更不用说Redis将其数据存储在内存中了。

    有没有正确的方法来实现这一点,还是应该转移到MongoDB?

1 个答案:

答案 0 :(得分:0)

您可以按存储在键中的常量进行排序。

在您的示例中,我可以使用Redis轻松地对1.进行排序。如果在计算它们之后存储其他表达式值,则也可以按它们排序。对于1.,您需要在某处存储列表计数,我将假设为news:n:upvotes:count

捕获是使用SORT命令。例如,第一种是:

SORT news::list BY news:*:upvotes:count GET news:*->title GET news:*->url

...以新月顺序获得以upvotes排序的标题和网址。

还有修饰符,用于alpha排序和asc/desc排序。完全阅读命令页面,这是值得的。

PS:您可以在MULTI / EXEC环境(事务)中包装计数,存储,排序和可能删除计数。