我知道KEYS命令,但它只返回键(我猜测所有类型为字符串的键),而且显然集合不被视为键。
是否有一种命令可以获取数据库中所有的集合?那其他数据类型呢(哈希、列表、有序集)?
我知道KEYS命令,但它只返回键(我猜测所有类型为字符串的键),而且显然集合不被视为键。
是否有一种命令可以获取数据库中所有的集合?那其他数据类型呢(哈希、列表、有序集)?
keys '*'
而不是 keys *
。我正在通过 redis-cli 运行这个命令,并且试图避免使用 bash(有时候我会在 bash 中执行 redis-cli keys '*'
或类似的命令,而不是使用 redis-cli 的交互模式)。不过还是谢谢你的回答! - beatgammit这个答案在它发布时是正确的,然而从redis 2.8.0开始就支持了 - 请查看SCAN
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
。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
。在 cli-redis 中,您可以尝试执行以下操作:
KEYS *
SCAN 0 TYPE set
(版本6)或等效的Lua脚本来获取所有Redis中的集合。 - LeoMurillo