我知道KEYS命令,但只返回键(我猜的是所有类型为String的键),显然集合不被视为键。
是否有获取数据库中所有集合的命令?那么其他数据类型(哈希,列表,排序集)呢?
答案 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