Ruby Redis存储地理信息,

Ruby Redis存储地理信息,,ruby,database,node.js,memcached,redis,Ruby,Database,Node.js,Memcached,Redis,我只是遇到了一个问题。我使用redis来存储地理信息。对于 例如: 或 大约40000个关键值 该键用于终端id,并设置值,用于存储termianl gps信息。 我需要计算终端周围的数据。 例如,我的位置是41.000123、121.999988,我希望 以最快的速度计算我所在位置附近的终端,我知道如何 计算两个位置的距离。 我只想想想一种快速迭代所有数据的方法。在Redis2.6中有lua支持。它能帮助解决我的问题吗?我理解你的问题,你想找到接近某个坐标的所有值吗?一种方法是使用Lua脚本,

我只是遇到了一个问题。我使用redis来存储地理信息。对于 例如:

大约40000个关键值 该键用于终端id,并设置值,用于存储termianl gps信息。 我需要计算终端周围的数据。 例如,我的位置是41.000123、121.999988,我希望 以最快的速度计算我所在位置附近的终端,我知道如何 计算两个位置的距离。
我只想想想一种快速迭代所有数据的方法。在Redis2.6中有lua支持。它能帮助解决我的问题吗?

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

zadd la.41 41.000333 pk-value
zadd lo.121 121.999999 pk-value
然后,当您需要找到接近某些坐标的东西时(比如说
(42.01122.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}
应该包含靠近所提供坐标的每个端子的id


显然,您可以以更大的粒度存储每个坐标,例如
la.41.0
lo.121.0
,并且只查找关闭的终端。或者,您可以在客户端代码中进一步过滤结果。

您可能希望使用GeoHash,然后您可以以任何精度存储(并按lon/lat搜索),并且可以相对容易地获取给定边界框中的点


对于redis的实现,请查看。

在生产过程中切勿使用
键。从:“警告:将密钥视为只在极端环境中使用的命令。当对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改密钥空间布局。不要在常规应用程序代码中使用密钥。”谢谢你的支持。但是我不能绕开它。谢谢,但是它不起作用。我的数据是这样的:-------------------------------------------------------------------------------------id | la | lo | name | others |-------------------------------------------------------------------------------------------1 | 39.1111 | 116.1111 | xxx |------------------------------------------------------------------2 | 39.2211 | 116.2233 | yyyyyy |或者我使用SORED集合来选择geo zadd la.39.00 39.0000 1 zaddla.39.00 39.0001 2扎德la.39.00 39.0003 3。。。扎德洛杉矶39.01 39.0100 4。。。zadd lo.116.00 116.0000 1 zadd lo.116.00 116.0001 2。。。锌店a 6 la.39.00 la.39.01 la.39.02 lo.116.00 lo.116.01 lo.116.02
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)
zinterstore close.${lat},${lon} 6 la.${lat_min}, la.${lat_mid}, la.${lat_max}, lo.${lon_min}, lo.${lon_mid}, lo.${lon_max}