问题在于这些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
预先感谢 马里奥
答案 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