从 Redis 中的有序集合的范围创建新集合
Creating a new set from a range of a Sorted Set in Redis
我有许多排序集用作我系统上的二级索引,用户查询可能会命中其中的一些。
ZADD scoreSet 1 "fred"
ZADD scoreSet 5 "bob"
ZADD scoreSet 2 "spodrick"
ZADD ageSet 25 "fred"
ZADD ageSet 29 "bob"
ZADD ageSet 38 "spodrick"
使用这些索引获取所有 30 岁以下且得分 >2 的用户
ZRANGEBYSCORE scoreSet (2 +inf
(store these in my application code)
ZRANGEBYSCORE ageSet -inf (30
(store these in my application code)
(Perform Set intersection in my application code)
但这意味着我已经将所有数据从 redis 复制到我的应用程序服务器以执行交集,是否有更有效的方法来执行此操作,而不是通过网络传输所有匹配范围,而是执行Rediss 中的路口?
我想要的是
ZRANGEBYSCORESTORE tempSet1 scoreSet (2 +inf
ZRANGEBYSCORESTORE tempSet2 ageSet -inf (30
SINTER tempSet1 tempSet2
其中 ZRANGEBYSCORESTORE 执行 ZRANGEBYSCORE 操作并将结果存储在新集合中而不是返回它们。这样 Redis 就完成了所有繁重的工作,只向我发送我感兴趣的实际交集。
我怎么能这样做,因为我可以做 ZINTERSTORE 和 ZUNIONSTORE 没有 RANGESTORE 似乎我错过了什么。
这是一个有很多可能答案的问题。这是我的前两个:
利用 Lua 的强大功能避免将数据移动到客户端并在服务器端完成所有工作。您可以通过这种方式解决缺少 RANGESTORE 的问题。
使用位交错维护一个排序集,其中分数由两个属性组成。在 Redis-verse 中,antirez 进行了一项名为 redimension 的实验,它正是这样做的。链接是 https://www.reddit.com/r/redis/comments/3qjlkk/redimension_ruby_library_implementing/ and my port of the above to Redis lua https://www.reddit.com/r/redis/comments/3s0h73/luaredimension_redis_multidimensional_query/. You can read more about the approach at Multi dimensional indexes.
我有许多排序集用作我系统上的二级索引,用户查询可能会命中其中的一些。
ZADD scoreSet 1 "fred"
ZADD scoreSet 5 "bob"
ZADD scoreSet 2 "spodrick"
ZADD ageSet 25 "fred"
ZADD ageSet 29 "bob"
ZADD ageSet 38 "spodrick"
使用这些索引获取所有 30 岁以下且得分 >2 的用户
ZRANGEBYSCORE scoreSet (2 +inf
(store these in my application code)
ZRANGEBYSCORE ageSet -inf (30
(store these in my application code)
(Perform Set intersection in my application code)
但这意味着我已经将所有数据从 redis 复制到我的应用程序服务器以执行交集,是否有更有效的方法来执行此操作,而不是通过网络传输所有匹配范围,而是执行Rediss 中的路口?
我想要的是
ZRANGEBYSCORESTORE tempSet1 scoreSet (2 +inf
ZRANGEBYSCORESTORE tempSet2 ageSet -inf (30
SINTER tempSet1 tempSet2
其中 ZRANGEBYSCORESTORE 执行 ZRANGEBYSCORE 操作并将结果存储在新集合中而不是返回它们。这样 Redis 就完成了所有繁重的工作,只向我发送我感兴趣的实际交集。
我怎么能这样做,因为我可以做 ZINTERSTORE 和 ZUNIONSTORE 没有 RANGESTORE 似乎我错过了什么。
这是一个有很多可能答案的问题。这是我的前两个:
利用 Lua 的强大功能避免将数据移动到客户端并在服务器端完成所有工作。您可以通过这种方式解决缺少 RANGESTORE 的问题。
使用位交错维护一个排序集,其中分数由两个属性组成。在 Redis-verse 中,antirez 进行了一项名为 redimension 的实验,它正是这样做的。链接是 https://www.reddit.com/r/redis/comments/3qjlkk/redimension_ruby_library_implementing/ and my port of the above to Redis lua https://www.reddit.com/r/redis/comments/3s0h73/luaredimension_redis_multidimensional_query/. You can read more about the approach at Multi dimensional indexes.