如何在Redis中做“GROUP BY”

时间:2013-12-11 15:02:11

标签: lua redis

我正在尝试找到一个解决方案,了解如何从HASH获取具有相同值的所有字段。

例如

redis > HSET my_hash "foo" 1
(integer) 1
redis > HSET my_hash "bar" 1
(integer) 1
redis > HSET my_hash "baz" 0
(integer) 1
redis > HGETALL my_hash
1) "foo"
2) "1"
3) "bar"
4) "1"
5) "baz"
6) "0"

所以我想要的是做HGETALL my_hash "WHERE VALUE = 1"之类的事情。预期结果为foobar。 如果有人可以指出我如何使用本机命令执行此操作或使用Lua将是非常棒的。

感谢。

1 个答案:

答案 0 :(得分:3)

你可以这样做

在名为script.lua的lua脚本中

local hash_val = redis.call('hgetall',KEYS[1])
local result = {}
for i = 0 , #hash_val do
    if hash_val[i] == ARGV[1] then
        table.insert(result,hash_val[i-1])
        table.insert(result,hash_val[i])
    end
end
return result

lua通过序列key0,val0,key1,val1等获取哈希...

然后你可以这样称呼它:

redis-cli  eval "$(cat script.lua)" 1 "my_hash" 1

你将拥有:

1) "foo"
2) "1"
3) "bar"
4) "1"

有关评估函数here

的更多信息

编辑,如评论中所说的deltheil,仅检查值并且不进行必要的检查,您可以将for循环步骤2,因为散列请求的呈现是关键值,关键,价值等......:

local hash_val = redis.call('hgetall',KEYS[1])
local result = {}
for i = 2 , #hash_val, 2 do
    if hash_val[i] == ARGV[1] then
        table.insert(result,hash_val[i-1])
        table.insert(result,hash_val[i])
    end
end
return result