redis - 如何在 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)
有任何想法吗 ?
解决方案
每次添加新键时,您都可以创建一个索引键并将每个命名空间添加到其中
SADD "namespaces" "foo"
:但是删除它们会有问题,因为您必须检查删除的对象是否是它的最后一个类型。
第二个选项是创建一个模块(如果您使用的是 Redis >= 4.0),其中包含一个可用于添加和删除所述键的命令,该命令将具有自己的类型,用于存储对象类型计数器(因此它不必调用KEYS *
这很慢)。这里的问题是,如果您配置了密钥过期或 oom 密钥删除。一旦 Redis 本身删除了密钥,计数器就会不正确。
第三种选择是使用一个命令创建一个模块,该命令将调用KEYS *
,然后获取密钥的第一部分并将其添加到哈希映射/字典(使用RedisModuleDict
),然后RedisModule_ReplyWithString(ctx, str)
在循环中使用返回它
我认为你也可以用 Lua 编写它而不是创建一个模块,但是用 C 编写的模块可能会更快......而且我不了解 Lua,所以我无法帮助你。
您总是可以在 bash 中编写一个简单的脚本,从每个键获取对象类型并将SADD
其转换为临时键,然后读取、打印和删除,但这与第三个选项相同,但速度较慢,并且必须使用临时键可能被其他脚本或其他东西使用的密钥。
推荐阅读
- python - ROS CPP 等效于 Python subprocess.call() with shell=True
- javascript - Angular 从 json api 返回空白 response.data
- matlab - 增加 parfor 循环的工作人员数量
- c++ - 如何检查提升消息队列是否存在
- java - 如何配置hibernate search 5.9工作线程池大小
- r - 计算前 6 个数据点的平均值
- javascript - 作为函数的结果增加特定元素的变量值
- excel - 选择前一个文件夹的文件夹对话框
- jmeter - 多次调用 JMeter 预处理器
- android - 如何在 firebase Live Database 中保存模型?