如何在 Redis 中获取所有'key namespaces'(对象类型)?



如我们所知,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"

但似乎扫描命令的匹配选项不支持 PCRE 模式语法。

实际上,我得到了

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

有什么想法吗?

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

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

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

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

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

最新更新