【问题标题】:redis: Get all keys that contain queried element in setredis:获取集合中包含查询元素的所有键
【发布时间】:2019-12-17 23:37:19
【问题描述】:

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

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

我看不出如何有效地完成此操作(每 10k 个键大约 5 毫秒)?

【问题讨论】:

  • 你能提供你已经尝试过的细节以及如何优化它吗?

标签: redis set


【解决方案1】:

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

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 毫秒内执行,还有待观察。

【讨论】:

  • 这按预期工作,因此标记为已接受的答案。然而,性能远非每 5 毫秒 10k (由于涉及网络,这是预期的,它更像是每 10k 1 秒)。对于测试集,它比在弹性搜索中做类似的事情快两倍。然而,鉴于 SINTER (O(N*M)) 的时间复杂度的描述,我相当相信这不会扩展。
猜你喜欢
  • 2012-10-31
  • 1970-01-01
  • 2020-01-01
  • 2015-03-03
  • 1970-01-01
  • 2014-03-27
  • 1970-01-01
  • 2015-06-18
  • 2020-02-04
相关资源
最近更新 更多