redis - 两个或多个排序集的交集

标签 redis set nosql

我有两个排序集,想要交集,即。 (年龄在 25、35 之间)和(工资在 250、350 之间)

关于效率有没有比以下更好的方法:

ZUNIONSTORE t_age 1 age WEIGHTS 1
ZREMRANGEBYSCORE t_age -inf (25
ZREMRANGEBYSCORE t_age (35 +inf
ZINTERSTORE result 2 salary t_age WEIGHTS 1 0
ZRANGEBYSCORE result 250 350

最佳答案

你应该先用ZCARD检查哪个ZSET的元素少, 并克隆和修剪较短的那个。

其次,您将留下 2 个剩菜。您可以重复使用相同的辅助 ZSET 来进行更快的清理。

我也想建议DUMPRESTORE对于克隆,但对于排序集的情况,ZUNIONSTORE 实际上要快得多。 以下是 1M 元素集的时间安排:

1) 1) (integer) 14
   2) (integer) 1444165498
   3) (integer) 936762
   4) Complexity info: N:1000000,M:1000000
   5) 1) "ZUNIONSTORE"
      2) "temp3"
      3) "1"
      4) "temp1"
      5) "WEIGHTS"
      6) "1"
2) 1) (integer) 13
   2) (integer) 1444165421
   3) (integer) 3166360
   4)
   5) 1) "evalsha"
      2) "48286113cfe4b389d516e98646e5f4e086decc34"
      3) "2"
      4) "temp1"
      5) "temp2"
      6) "0"

关于redis - 两个或多个排序集的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32911604/

相关文章:

session - Redis Sentinel,独立或集群,哪个最适合 session ?

lua - 如何在 redis.call 中使用 Lua 表?

python - 查找数字子集的分组

java - 一组重名的集合?

redis - 如何为redis队列中的每个项目设置过期时间

java - 为什么 Redis 抛出 NullPointerException 通过 JUnit 使用 spring 和默认配置运行?

c# - 将字符串列表转换为相应的int c#

数据库搜索以返回按两个集合之间的交集大小排序的结果

nosql - 如何使用 DynamoDB 进行基本聚合?

Raspberry Pi 网状网络上的数据库复制