Redis存储地理信息,

时间:2012-05-24 10:22:40

标签: ruby database node.js memcached 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个键值 关键是终端ID,并设置值,存储termianl gps信息。 我需要计算周围的终端。 例如,我的位置是41.000123,121.999988,我想要的 最快的计算我的位置周围的终端,我知道如何 计算两个位置的距离。 我想要的只是想一种快速迭代所有数据的方法。在Redis 2.6中有lua支持。它有助于解决我的问题吗?

2 个答案:

答案 0 :(得分:2)

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

要使用redis实现,请查看geodis

答案 1 :(得分:1)

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

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

然后,当你需要找到一些靠近某些坐标的东西时(让我们说(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}应该包含靠近提供的坐标的每个终端的id。

显然,您可以更精细地存储每个坐标,例如la.41.0lo.121.0,并且只查看关闭的终端。 (可选)您可以在客户端代码中进一步过滤结果。