【发布时间】:2011-11-19 17:15:39
【问题描述】:
我知道 KEYS 命令,但它只返回键(我猜是所有类型为 String 的键),显然集合不被视为键。
是否有获取数据库中所有集合的命令?其他数据类型(散列、列表、排序集)呢?
【问题讨论】:
-
参见answer below,了解如何使用
SCAN 0 TYPE set(第6 版)或之前版本的等效Lua 脚本进行此操作
标签: redis
我知道 KEYS 命令,但它只返回键(我猜是所有类型为 String 的键),显然集合不被视为键。
是否有获取数据库中所有集合的命令?其他数据类型(散列、列表、排序集)呢?
【问题讨论】:
SCAN 0 TYPE set(第6 版)或之前版本的等效Lua 脚本进行此操作
标签: redis
【讨论】:
keys '*',而不是keys *。我通过 redis-cli 运行它,并试图避免使用 bash(有时我在 bash 中使用 redis-cli keys '*' 或类似方法,而不是使用 redis-cli 的交互模式)。不过感谢您的回答!
答案在当时是正确的,但是 redis 2.8.0 支持这一点 - 查看 SCAN
【讨论】:
SSCAN 命令仅在 set 类型的键内迭代
在 cli-redis 中你可以尝试做:
KEYS *
【讨论】:
从 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要好得多,因为它不会长时间阻塞服务器。
Next 是相同的脚本,但带有 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
【讨论】: