Redis存储地理信息,

我刚遇到一个问题。 我使用redis来存储地理信息。 例如:

hset 10001 la 41.000333 hset 10001 lo 121.999999 

要么

 zadd la 41.xxxxx pk-value zadd lo 121.xxxxx pk-value 

约40000个键值为terminalID的关键字,并设置值,存储termianl GPS信息。 我有要求计算周围的terminal。 例如,我的位置是41.000123,121.999988,而且我想以最快的速度计算我的位置周围的terminal,我已经知道如何计算两个位置的距离。 我想要的是想办法快速迭代所有数据。 在Redis 2.6中有lua的支持。 它可以帮助解决我的问题?

据我了解你的问题,你想要find所有的值接近一些坐标? 一种方法是使用Lua脚本,另一种方法是为每个近似的纬度/经度存储一个有序的集合(如果事先知道你要求的粒度)。 例:

 zadd la.41 41.000333 pk-value zadd lo.121 121.999999 pk-value 

那么,当你需要find一些接近于某些坐标的东西时(比如说(42.01, 122.03) ),你可以这样做:

 lat = 42.01 lon = 122.03 lat_min, lat_mid, lat_max = round(lat - 1), round(lat), round(lat + 1) lon_min, lon_mid, lon_max = round(lon - 1), round(lon), round(lon + 1) 

因此,你可以看看有序集合la.41la.42la.43lo.121lo.122lo.123

 zinterstore close.${lat},${lon} 6 la.${lat_min}, la.${lat_mid}, la.${lat_max}, lo.${lon_min}, lo.${lon_mid}, lo.${lon_max} 

现在, close.${lat},${lon}应该包含接近提供的坐标的每个terminal的id。

很明显,你可以存储每个坐标更大的粒度,如la.41.0lo.121.0 ,只查看closures的terminal。 或者,您可以在客户端代码中进一步筛选结果。

你可能想要使用geohashes,那么你将能够以任何你想要的精度来存储(和search)lon / lat,并且获得给定边界框中的点也是相对容易的。

要用redis实现,请看geodis 。