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.41
, la.42
, la.43
, lo.121
, lo.122
, lo.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.0
, lo.121.0
,只查看closures的terminal。 或者,您可以在客户端代码中进一步筛选结果。
你可能想要使用geohashes,那么你将能够以任何你想要的精度来存储(和search)lon / lat,并且获得给定边界框中的点也是相对容易的。
要用redis实现,请看geodis 。