2015-05-04 66 views
0

的有序集合十字路口,我要的位置三元组存储在Redis的数据存储,但想要让他们搜索的为好。这将使得有可能进行范围查询,例如'给我点1 < x 3和y> 2'。因此,我使用了有序集合的组合。Redis的:按分数

每个三元组被保存在Redis的像这样(其中x = 1,Y = 2例如,位置A,Z = 3):

hset /locations/A x "1" 
hset /locations/A y "2" 
hset /locations/A z "3" 
hset /locations/A payload "{ ...some json payload... }" 
zadd /locations:x 1 locations/A 
zadd /locations:y 2 locations/A 
zadd /locations:z 3 locations/A 

这样,我可以很容易地找到的所有位置(或路径,以地点)与例如x值介于4和5之间:

zrangebyscore /locations:x 4 5 

或者所有具有例如1至3之间的Y值:

zrangebyscore /locations:x 1 3 

当我尝试搭配4,5及1和3之间的Y值之间的x值的所有位置出现问题,因为那时我要做两个查询到Redis,随后将这些值与NodeJS中的Javascript进行比较,当定义了很多位置时这可能非常耗时。有没有人遇到过这样的问题?

我尝试用zinterstore和zunionstore,但还没有找到一个满意的解决方案呢。我认为zrangebyscores存储到一个临时组,然后做一个zinterstore,但没有找到一个Redis的命令存储zrangebyscore的直接输出到Redis的(在相同的命令)。

回答

2

我想忽略的用例(位置路径/距离)本身因为有多个成熟的方式来应对这一挑战,也与Redis的(搜索地理空间就寻见),而专注于技术。所以,假设你要发明和实现你自己的地理逻辑,最有效的方法(修改Redis的代码不足)来解决评分/测距/相交/ ......这些分类集合中遇到的挑战将在一个Lua脚本中。这就是您可能流传的称之为“数据重力”的原因 - 处理器接近数据,因此访问和操作数据的速度最快,并且不需要网络。

例如,在这样的脚本中,您可以将ZRANGEBYSCORE的结果存储在局部变量中,根据需要在其中执行任何操作,并将最终结果回复给(Node.js)客户端。