【发布时间】:2019-12-17 23:37:19
【问题描述】:
我正在研究 redis 以满足我的特定需求,但我知道我不知道如何实现我的需求。
我想存储整数集(每组 100 到数千个条目),然后通过输入集“查询”。包含查询应匹配的所有元素的所有集合。 (SDIFF query key 应该返回空集,然后遍历所有键)。
我看不出如何有效地完成此操作(每 10k 个键大约 5 毫秒)?
【问题讨论】:
-
你能提供你已经尝试过的细节以及如何优化它吗?
我正在研究 redis 以满足我的特定需求,但我知道我不知道如何实现我的需求。
我想存储整数集(每组 100 到数千个条目),然后通过输入集“查询”。包含查询应匹配的所有元素的所有集合。 (SDIFF query key 应该返回空集,然后遍历所有键)。
我看不出如何有效地完成此操作(每 10k 个键大约 5 毫秒)?
【问题讨论】:
如果您只按整数查询数据,请考虑使用整数作为键进行存储。而不是:
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 ... 获取所有匹配的整数集名称(您最初用于键的名称)。
如果您确实需要同时查询两种方式,那么您可能需要同时进行两种方式。这就像做一个many-to-many relationship in Redis。
在这里,您需要权衡插入时间和内存使用以换取快速查询性能。每次添加一对时,都需要两个 SADD:SADD setName int 和 SADD prefix:int setName。
如果这种额外的内存和插入工作不是您的选择,您的下一个选择是使用 Lua 脚本循环遍历键(模式匹配您的集合名称)并使用 SISMEMBER 测试整数您的查询。请参阅Lua script for Redis which sums the values of keys 了解使用 Lua 循环遍历一组键的示例。
Lua 脚本就像一个存储过程,它将在您的 Redis 服务器上自动运行。但是,对于多个整数成员测试的 10k 集,它是否会在 5 毫秒内执行,还有待观察。
【讨论】: