首页 > 解决方案 > 如何在 Redis 中获取所有“关键名称空间”(对象类型)?

问题描述

我们可能知道, Redis 键的良好命名约定"object-type:id"

如何获取所有关键名称空间(之前的符号:)?

例如

127.0.0.1:6379> KEYS *
1) "bar:1"
2) "baz:1"
3) "baz:3"
4) "foo:1"
5) "foo:2"
6) "baz:2"

我想要一个命令

127.0.0.1:6379> SCAN 0 MATCH "(^\w+):" COUNT 10
1) "6"
2) "foo"
3) "bar"
4) "baz"

但似乎SCAN 命令的MATCH选项不支持 PCRE 模式语法。

实际上,我得到了

127.0.0.1:6379> SCAN 0 MATCH "(^\w+):" COUNT 10
1) "6"
2) (empty list or set)

有任何想法吗 ?

标签: redis

解决方案


每次添加新键时,您都可以创建一个索引键并将每个命名空间添加到其中 SADD "namespaces" "foo":但是删除它们会有问题,因为您必须检查删除的对象是否是它的最后一个类型。

第二个选项是创建一个模块(如果您使用的是 Redis >= 4.0),其中包含一个可用于添加和删除所述键的命令,该命令将具有自己的类型,用于存储对象类型计数器(因此它不必调用KEYS *这很慢)。这里的问题是,如果您配置了密钥过期或 oom 密钥删除。一旦 Redis 本身删除了密钥,计数器就会不正确。

第三种选择是使用一个命令创建一个模块,该命令将调用KEYS *,然后获取密钥的第一部分并将其添加到哈希映射/字典(使用RedisModuleDict),然后RedisModule_ReplyWithString(ctx, str)在循环中使用返回它

我认为你也可以用 Lua 编写它而不是创建一个模块,但是用 C 编写的模块可能会更快......而且我不了解 Lua,所以我无法帮助你。

您总是可以在 bash 中编写一个简单的脚本,从每个键获取对象类型并将SADD其转换为临时键,然后读取、打印和删除,但这与第三个选项相同,但速度较慢,并且必须使用临时键可能被其他脚本或其他东西使用的密钥。


推荐阅读