【问题标题】:Redis store geo infomation,Redis 存储地理信息,
【发布时间】:2012-05-30 22:11:21
【问题描述】:

我只是遇到了一个问题。我使用 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 全球定位系统信息。 我需要计算周围的终端。 例如,我的位置是 41.000123、121.999988,我想 最快计算我所在位置的终端,我知道如何 计算两个位置的距离。 我想要的只是想一种快速迭代所有数据的方法。在 Redis 2.6 中有 lua 支持。它可以帮助解决我的问题吗?

【问题讨论】:

  • 你不应该在生产中使用KEYS。来自the docs:“警告:将 KEYS 视为仅应极其小心地在生产环境中使用的命令。在对大型数据库执行时可能会破坏性能。此命令用于调试和特殊操作,例如更改您的键空间布局。不要在常规应用程序代码中使用 KEYS。"

标签: ruby database node.js memcached redis


【解决方案1】:

您可能想要使用 geohashes,然后您将能够以您想要的任何精度存储(和搜索)经度/纬度,而且获取给定边界框中的点也相对容易。

要使用 redis 实现,请查看geodis

【讨论】:

    【解决方案2】:

    据我了解您的问题,您想找到接近某个坐标的所有值吗?一种方法是使用 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,并仅查找关闭的终端。或者,您可以在客户端代码中进一步过滤结果。

    【讨论】:

    • 谢谢你的回答。但我无法绕过它。
    • 谢谢,但它不起作用。我的数据是这样的:-------------------------------------------- - |编号 |拉 |罗 |姓名 |其他 | ---------------------------------------------- | 1 | 39.1111 | 116.1111 | xxx | ---------------------------------------------- | 2 | 39.2211 | 116.2233 |年年 |或者我使用 soered 组来运行 geo zadd la.39.00 39.0000 1 zadd la.39.00 39.0001 2 zadd la.39.00 39.0003 3 ... zadd la.39.01 39.0100 4 ... zadd lo.116.00 116.0000 1 zadd lo.116.00 116.0001 2 ... zinterstore a 6 la.39.00 la.39.01 la.39.02 lo.116.00 lo.116.01 lo.116.02
    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    相关资源
    最近更新 更多