我怎样才能获得redis中的所有集合?

时间:2011-09-18 15:28:06

标签: redis

我知道KEYS命令,但只返回键(我猜的是所有类型为String的键),显然集合不被视为键。

是否有获取数据库中所有集合的命令?那么其他数据类型(哈希,列表,排序集)呢?

http://redis.io/topics/data-types

4 个答案:

答案 0 :(得分:28)

  

我知道KEYS命令,但只返回键(我猜   所有类型为String的键,显然不是   考虑过钥匙。

无论您的密钥是什么数据类型,

KEYS命令都会返回结果,因为它会搜索密钥名称。在最低抽象级别,redis中的每个数据类型都是基于键/值的,其中值可以表示为几个(高级)数据结构之一(字符串,散列,列表,集合,有序集合)。您可以看到KEYS命令也适用于examples中的集合。

  

是否有获取数据库中所有集合的命令?什么   关于其他数据类型(散列,列表,排序集)?

据我所知,此功能没有专用命令,KEYS命令应用于数据库的整个数据集。但是,有一个TYPE命令可以确定指定密钥的数据类型。

答案 1 :(得分:5)

答案是正确的,但是redis 2.8.0支持这一点 - 查看SCAN

答案 2 :(得分:1)

在cli-redis中,您可以尝试做:

KEYS *

答案 3 :(得分:0)

从6.0版开始,您可以使用SCAN 0 TYPE set。参见https://redis.io/commands/scan#the-type-option

对于6.0之前的版本,您可以使用Lua脚本过滤服务器端,从而节省进行TYPE从客户端回叫的往返时间(RTT)。

EVAL "local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2]) local filtered = {} for _,key in ipairs(result[2]) do if redis.call('TYPE', key).ok == ARGV[3] then table.insert(filtered, key) end end result[2] = filtered return result" 0 0 * set

脚本的参数为0(numkeys) cursor matchPattern type。例如。 0 0 * set

以下是Lua脚本的友好视图:

local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2])
local filtered = {}
for _,key in ipairs(result[2]) do
    if redis.call('TYPE', key).ok == ARGV[3] then
        table.insert(filtered, key)
    end
end
result[2] = filtered
return result

返回的值与SCAN相同,只是按类型过滤的键列表。

SCAN一样,您需要多次调用,直到返回的光标为零为止。

此方法比使用KEYS更好,因为它不会长时间阻塞服务器。

下一个是相同的脚本,但是具有COUNT选项,每个呼叫可以执行更少或更多的工作。计数应大于零。

EVAL "local result = redis.call('SCAN', ARGV[1], 'MATCH', ARGV[2], 'COUNT', ARGV[3]) local filtered = {} for _,key in ipairs(result[2]) do if redis.call('TYPE', key).ok == ARGV[4] then table.insert(filtered, key) end end result[2] = filtered return result" 0 0 * 100 set

脚本的参数为0(numkeys) cursor matchPattern count type。例如。 0 0 * 100 set