在单个命令调用中多个ZRANGEBYSCORE的Redis ZINTERSTORE?

时间:2019-06-14 00:34:18

标签: redis

问题在于这些Redis命令以及如何在单个调用中使用3°和4°。

1)

HMSET key field value [field value ...]

2)

ZADD key [NX|XX] [CH] [INCR] score member [score member ...]

3)

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

4)

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

我有x y z个坐标的一千个点:p1,p2,p3,p4,p5,p6,p7 ...

HMSET p_1 x 10 y 20 z 30
HMSET p_2 x 20 y 30 z 40
HMSET p_3 x 30 y 40 z 50
...
...

我有三个排序集:xsorted,ysorted,zsorted

zadd xsorted 10 p_1
zadd xsorted 20 p_2
zadd xsorted 30 p_3
... 

(全部x为分数,点p_1,p_2,p_3 ...的键为成员

zadd ysorted 20 p_1
zadd ysorted 30 p_2
zadd ysorted 40 p_3
....

(全部y为分数和点p_1,p_2,p_3 ...的键为成员

zadd zsorted 30 p_1
zadd zsorted 40 p_2
zadd zsorted 50 p_3
...

(全部z为分数,点p_1,p_2,p_3 ...的键为成员

由于ZRANGEBYSCORE的结果,我在客户端具有range_x,range_y和range_z:

range_x = ZRANGEBYSCORE xsorted min max    
range_y = ZRANGEBYSCORE ysorted min max 
range_z = ZRANGEBYSCORE zsorted min max 

由于ZINTERSTORE,我有xyzinter客户端:

ZINTERSTORE xyzinter 3 range_x range_y range_z

因此,xyzinter具有具有x,y,z坐标的值范围内的点的键。好,我需要。

是否可以仅通过“两次”调用以更快的方式执行上述命令?

类似:

1)

ZINTERSTORE xyzinter 3 
ZRANGEBYSCORE xsorted min max    
ZRANGEBYSCORE ysorted min max 
ZRANGEBYSCORE zsorted min max 

2)

ZRANGE xyzinter start stop

预先感谢 马里奥

2 个答案:

答案 0 :(得分:0)

否,您必须同时调用这两个命令。但是,您可以将它们包装在将在服务器端运行的Lua脚本中,然后您的客户端将对Redis进行一次调用。在https://redis.io/commands/eval

上了解有关Redis中Lua脚本的更多信息。

答案 1 :(得分:0)

比我发现的更好的解决方案:使用在Ruby开头创建的三个数组“ sort_id”,然后将其存储为Redis中的排序集。我只得到Redis的最小值,最大值。约100点/秒,三个结果排序数组相交 每个有30-40个元素。但是仍然太慢(Ruby客户端)

def points_id_in_range crng

    sort_key=[:x=>"sort_x",:y=>"sort_y",:z=>"sort_z"]
    rrng = {:x=>[],:y=>[],:z=>[]}

    [:x,:y,:z].each{|sym|

        rrng[sym] << $r.ZRANGEBYSCORE(sort_key[sym], crng[sym].min, 
        crng[sym].max, :LIMIT,0,1)[0].to_i

        rrng[syn] << $r.ZREVRANGEBYSCORE(sort_key[sym], 
        crng[sym].max, crng[sym].min, :LIMIT,0,1)[0].to_i

    }

    #intersection in Ruby

    @@sort_id[:x][rrng[:x].min..rrng[:x].max] &
    @@sort_id[:y][rrng[:y].min..rrng[:y].max] &
    @@sort_id[:z][rrng[:z].min..rrng[:z].max] 

end