如何在Redis中执行"GROUP BY"操作

我在尝试找到一种解决方案,可以获取所有值相同的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 来实现这一点,那就太好了。

谢谢。

点赞
用户2638387
用户2638387

你可以在一个名为 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"

更多有关 eval 函数的信息,请点击这里

编辑: 如评论中的 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
2013-12-11 16:29:26