从Redis中的排序集范围创建新集

时间:2018-04-10 14:02:05

标签: redis sortedset

我有许多排序集用作我系统上的辅助索引,用户查询可能会遇到其中的一些。

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似乎我错过了什么。

1 个答案:

答案 0 :(得分:1)

这是一个有很多可能答案的问题。这是我的前两名:

  1. 使用Lua的强大功能避免将数据移动到客户端,并在服务器端完成所有工作。你可以通过这种方式解决RANGESTORE的问题。

  2. 使用位交错维护一个排序集,其中得分由两个属性组成。在Redis-verse中,有一个名为redimension的antirez实验正是如此。这些链接是https://www.reddit.com/r/redis/comments/3qjlkk/redimension_ruby_library_implementing/,我的上面的端口是Redis lua https://www.reddit.com/r/redis/comments/3s0h73/luaredimension_redis_multidimensional_query/。您可以在Multi dimensional indexes了解有关该方法的更多信息。