使用哈希表查找对列表进行排序

时间:2013-11-30 11:11:48

标签: redis

我有一个包含存储在哈希表中的ID的组列表,我希望使用匹配的哈希表进行排序。数据格式为:

RPUSH group groupA
RPUSH group groupB
RPUSH group groupC

HSET g:1 group: groupA
HSET g:2 group: groupB
HSET g:3 group: groupC

HINCRBY groupVotes g:1 2
HINCRBY groupVotes g:2 3
HINCRBY groupVotes g:3 1

如果我查询red:lrange('group', 0, 2),我会回来{'groupA', 'groupB', 'groupC'}

如何按groupVotes降序返回{'groupB', 'groupA', 'groupC'}

对此列表进行排序

1 个答案:

答案 0 :(得分:1)

如果groupVotes zset ,您可以使用以下算法:

$keys = `zrevrange groupVotes 0 2`
$list = []
for($key in keys)
 $list.push(`hget $key group:')
$list

这样你就不需要RPUSH了。更好的是,如果zset直接使用组名而不是键名成员,那么命令zrange groupVotes 0 2就够了!

尽管如此,我在LUA中翻译了上述算法(仍然使用groupVotes作为zset):

local a = {}
local keys = redis.call('zrevrange', KEYS[1], ARGV[1], ARGV[2]);
for i, name in ipairs(keys) do
  table.insert(a, redis.call('hget', name, 'group:'))
end
return a

将其保存在test.lua中,然后运行

$ redis-cli --eval test.lua groupVotes , 0 2
1) "groupB"
2) "groupA"
3) "groupC"

现在,您只需使用EVALEVALSHA(需要Redis 2.6+)命令在代码中使用它。

注意:这里使用LUA更好地删除网络往返算法。