首页 > 解决方案 > redis:获取集合中包含查询元素的所有键

问题描述

我正在研究 redis 以满足我的特定需求,但我知道我不知道如何实现我所需要的。

我想存储整数集(每组 100 到数千个条目),然后通过输入集“查询”。包含查询应匹配的所有元素的所有集合。(SDIFF query key应该返回空集,然后遍历所有键)。

我看不出如何有效地做到这一点(每 10k 个键大约 5ms)?

标签: redisset

解决方案


如果您只按整数查询数据,请考虑使用整数作为键进行存储。代替:

SADD a 3 5
SADD b 3 7

你可以:

SADD int:3 a
SADD int:5 a
SADD int:3 b
SADD int:7 b

然后你SINTER int:3 int:7 ...用来获取所有匹配的整数集名称(你最初用于键的名称)。

如果您确实需要同时查询两种方式,那么您可能需要同时进行这两种方式。这就像在 Redis 中做一个多对多的关系

在这里,您需要权衡插入时间和内存使用以换取快速查询性能。每次添加一对时,都需要 SADD:SADD setName intSADD prefix:int setName.

如果这种额外的内存和插入工作不适合您的情况,那么您的下一个选择是使用 Lua 脚本循环遍历键(与您的集合名称匹配的模式)并使用SISMEMBER来测试查询的整数。有关使用 Lua 循环遍历一组键的示例,请参阅Redis 的 Lua 脚本,该脚本对键的值求和。

Lua 脚本就像一个存储过程,它将在您的 Redis 服务器上自动运行。但是,对于多个整数成员测试的 10k 组,它是否会在 5 毫秒内执行,还有待观察。


推荐阅读