dot 您所在城市的活动即将迎来快速发展的未来。

加入我们在 Redis 发布会

地理空间索引

返回词汇表

地理空间索引定义

地理空间索引是一种用于数据库的技术,可以根据地理位置高效地存储和检索数据。它涉及使用专门的数据结构对数据库中的空间数据进行索引,该数据结构可以快速识别位于特定地理区域内的哪些对象或数据点。

地理空间索引在处理大量地理数据的应用程序中特别有用,例如地图应用程序、地理定位服务和空间分析。通过使用地理空间索引,这些应用程序可以根据位置快速查询和分析数据,而无需扫描大量数据以查找相关信息。

Redis 地理空间最佳实践

Redis 有几个与地理空间索引(GEO 命令)相关的命令,但与其他命令不同,这些命令缺少自己的数据类型。这些命令实际上是在排序集数据类型上搭便车。这是通过使用 geohash 算法将经度和纬度编码到排序集的得分来实现的。

将项目添加到地理空间索引非常容易。例如,假设您正在跟踪一组汽车在道路上行驶 - 我们简单地将这组汽车称为“汽车”。我们说您的特定汽车可以被识别为成员“my-car”(我们使用术语*成员*,因为地理索引只是集合的一种形式)。要将汽车添加到集合中,我们可以运行命令

> GEOADD cars -115.17087 36.12306 my-car 

第一个参数是我们添加到的集合,第二个是经度,第三是纬度,第四是成员名称。

要更新汽车的位置,您只需要使用新的坐标再次运行命令即可。这是有效的,因为地理索引只是一个集合 - 不允许重复项。

> GEOADD cars -115.17172 36.12196 my-car

让我们向“汽车”集合添加第二辆车 - 这次是罗宾驾驶的

> GEOADD cars -115.171971 36.120609 robins-car

查看坐标,您可以看出这两辆车非常近,但有多近?您可以通过运行 GEODIST 命令来确定这一点。

> GEODIST cars my-car robins-car
"90.7082"

这意味着两辆车相距约 90 米。您也可以指定其他单位

> GEODIST cars my-car robins-car ft
"297.5990"

这以英尺为单位拉出了相同的距离。您也可以使用英里 (mi) 或公里 (km)。

现在,让我们看看从某个点开始的半径内有哪些项目

> GEORADIUS cars -115.17258 36.11996 100 m
1) "my-car"
2) "robins-car"

这将返回给定点 100 米范围内的所有成员。您也可以返回集合中另一个成员半径范围内的成员

> GEORADIUSBYMEMBER cars robins-car 100 m
1) "robins-car"
2) "my-car"

我们还可以通过添加可选参数 WITHDIST 来包含距离 - 这适用于 GEORADIUS 或 GEORADIUSBYMEMBER

> GEORADIUSBYMEMBER cars robins-car 100 m WITHDIST
1) 1) "robins-car"
   2) "0.0000"
2) 1) "my-car"
   2) "90.7082"

GEORADIUS 和 GEORADIUSBYMEMBER 的另一个可选参数是 WITHCOORD,它将返回每个成员的坐标。WITHDIST 和 WITHCOORD 可以一起使用或单独使用

> GEORADIUSBYMEMBER cars robins-car 100 m WITHDIST WITHCOORD
1) 1) "robins-car"
   2) "0.0000"
   3) 1) "-115.17197102308273315"
      2) "36.12060917648089031"
2) 1) "my-car"
   2) "90.7082"
   3) 1) "-115.17258256673812866"
      2) "36.11996028786411017"

由于地理空间索引只是操纵排序集的另一种方式,因此可以通过使用排序集命令来实现某些操作。如果要从“汽车”集合中删除“my-car”,我们需要使用排序集命令 ZREM

> ZREM cars my-car

Redis 提供了一组丰富的地理空间操作工具,本模式中只介绍了基础知识。您可以在 redis.io 上阅读有关完整命令集的更多信息。