地理空间索引是一种用于数据库的技术,可以根据地理位置高效地存储和检索数据。它涉及使用专门的数据结构对数据库中的空间数据进行索引,该数据结构可以快速识别位于特定地理区域内的哪些对象或数据点。
地理空间索引在处理大量地理数据的应用程序中特别有用,例如地图应用程序、地理定位服务和空间分析。通过使用地理空间索引,这些应用程序可以根据位置快速查询和分析数据,而无需扫描大量数据以查找相关信息。
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 上阅读有关完整命令集的更多信息。