如何在Redis中获取所有的集合?

30

我知道KEYS命令,但它只返回键(我猜测所有类型为字符串的键),而且显然集合不被视为键。

是否有一种命令可以获取数据库中所有的集合?那其他数据类型呢(哈希、列表、有序集)?

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


请参考此答案,了解如何使用SCAN 0 TYPE set(版本6)或等效的Lua脚本来获取所有Redis中的集合。 - LeoMurillo
4个回答

36
我知道KEYS命令,但它只返回键(我猜测所有类型为字符串的键),显然集合不被视为键。
KEYS命令无论你的键是什么数据类型,都会返回结果,因为它搜索键名。在redis的最低抽象级别中,每种数据类型都是基于键/值的,其中值可以表示为多个(高级)数据结构之一(字符串、哈希、列表、集合、有序集)。您可以在其示例中看到,KEYS命令也适用于集合。
有没有获取数据库中所有集合的命令?其他数据类型呢(哈希、列表、有序集)?
据我所知,没有专门的命令来实现此功能,而KEYS命令应用于您的数据库的整个数据集。但是,有一个TYPE命令,可以确定指定键的数据类型。

2
哎呀,我打成了 keys '*' 而不是 keys *。我正在通过 redis-cli 运行这个命令,并且试图避免使用 bash(有时候我会在 bash 中执行 redis-cli keys '*' 或类似的命令,而不是使用 redis-cli 的交互模式)。不过还是谢谢你的回答! - beatgammit

6

这个答案在它发布时是正确的,然而从redis 2.8.0开始就支持了 - 请查看SCAN


3
你如何使用Scan获取类型为集合的键列表?只有SSCAN指令可以在类型为集合的键内部迭代。 - Emer
正是我所需要的。如果你忘记了给集合命名,这很好。 - Josh

4
从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

3

在 cli-redis 中,您可以尝试执行以下操作:

KEYS *

简单、直接、正确 - palAlaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接