我有一个包含存储在哈希表中的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'}
?
答案 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"
现在,您只需使用EVAL和EVALSHA(需要Redis 2.6+)命令在代码中使用它。
注意:这里使用LUA更好地删除网络往返算法。