我有许多排序后的集合用作系统上的二级索引,用户查询可能会碰到其中的一些。
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/,而我的上述端口是Redis lua https://www.reddit.com/r/redis/comments/3s0h73/ luaredimension_redis_multiDimension_query /。您可以在多维索引中阅读有关该方法的更多信息。