使用Redis进行动态排序
假设我在Redis数据库里有5条记录:
news::id
:最新新闻的ID;news::list
:所有新闻ID的列表;news:n
,其中n是新闻ID:一个包含标题、链接等信息的哈希表;news:n:upvotes
:所有给这条新闻点赞的用户ID的列表,这样就能知道有多少个点赞;news:n:downvotes
:所有给这条新闻点踩的用户ID的列表,这样就能知道有多少个点踩。
接下来,我有多个排名算法,rank =
:
upvotes_count
;upvotes_count - downvotes_count
;upvotes_count - downvotes_count - age
;upvotes_count / downvotes_count
;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
排序。建议你把这个命令的页面看一遍,值得一读。