小编典典

在Redis中从一系列排序集中创建一个新集合

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似乎是我缺少了一些东西。


阅读 335

收藏
2020-06-20

共1个答案

小编典典

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

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

  2. 维护一个排序的集合,其中使用位交织对两个属性进行评分。在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 /。您可以在多维索引中阅读有关该方法的更多信息。

2020-06-20