使用Redis进行动态排序

1 投票
1 回答
1145 浏览
提问于 2025-04-17 08:46

假设我在Redis数据库里有5条记录:

  • news::id:最新新闻的ID;
  • news::list:所有新闻ID的列表;
  • news:n,其中n是新闻ID:一个包含标题、链接等信息的哈希表;
  • news:n:upvotes:所有给这条新闻点赞的用户ID的列表,这样就能知道有多少个点赞;
  • news:n:downvotes:所有给这条新闻点踩的用户ID的列表,这样就能知道有多少个点踩。

接下来,我有多个排名算法,rank =

  1. upvotes_count
  2. upvotes_count - downvotes_count
  3. upvotes_count - downvotes_count - age
  4. upvotes_count / downvotes_count
  5. age

现在,我该如何根据这些算法对新闻进行排序呢?

我考虑过在每次投票时计算不同的排名,但如果我引入一个新算法,就需要为所有新闻重新计算排名,这样就麻烦了。

EVAL可能会有帮助,但它要到v2.6版本才会推出,我可不想等那么久。

最后,我可以把所有新闻取出来放到一个Python列表里。但这样会占用很多内存,更不用说Redis本身就是把数据存储在内存里的。

所以,有没有合适的方法来处理这个问题,还是说我应该转向MongoDB呢?

1 个回答

0

你可以根据存储在键里的常量进行排序。

在你的例子中,我可以用Redis很简单地对1.进行排序。如果你在计算后把其他表达式的值存起来,你也可以根据这些值进行排序。对于1.,你需要把列表的数量存到某个地方,我假设是news:n:upvotes:count

关键是要使用SORT命令。例如,第一次排序可以这样写:

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

...这样就能按点赞数把标题和网址排序,结果是从小到大。

还有一些其他的选项,比如alpha排序和asc/desc排序。建议你把这个命令的页面看一遍,值得一读。

另外,你可以把计数、存储、排序,甚至可能的计数删除都放在一个MULTI/EXEC环境中(也就是一个事务)。

撰写回答