地理添加
语法
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]
- 从以下位置开始可用:
- 3.2.0
- 时间复杂度:
- O(log(N)) 表示,其中 N 是排序集中的元素数。
- ACL 类别:
-
@write
,@geo
,@slow
,
将指定的地理空间项(经度、纬度、名称)添加到指定的键中。数据作为排序集存储到键中,这样就可以使用GEOSEARCH
命令。
该命令采用标准格式 x,y 的参数,因此必须在纬度之前指定经度。可以索引的坐标存在限制:非常靠近极点的区域不可索引。
EPSG:900913 / EPSG:3785 / OSGEO:41001 指定的确切限制如下:
- 有效经度为 -180 度到 180 度。
- 有效纬度为 -85.05112878 到 85.05112878 度。
当用户尝试为指定范围之外的坐标编制索引时,该命令将报告错误。
注意:没有 GEODEL 命令,因为您可以使用ZREM
以删除元素。Geo 索引结构只是一个排序集。
GEOADD 选项
GEOADD
还提供以下选项:
- XX:仅更新已存在的元素。从不添加元素。
- NX:不要更新已存在的元素。始终添加新元素。
- CH:将返回值从添加的新元素数修改为已更改元素的总数(CH 是 changed 的缩写)。更改的元素是添加的新元素和已存在的元素,这些元素的坐标已更新。因此,在命令行中指定的元素与过去具有相同的分数不会被计算在内。注意:正常情况下,
GEOADD
仅计算添加的新元素的数量。
注: XX 和 NX 选项是互斥的。
它是如何工作的?
填充排序集的方式是使用一种称为 Geohash 的技术。纬度和经度 位交错形成唯一的 52 位整数。我们知道 排序集 double score 可以表示 52 位整数而不会丢失 精度。
这种格式允许通过检查覆盖整个形状所需的 1+8 区域并丢弃其外部的元素来查询边界框和半径。通过计算所覆盖的框的范围,从排序集分数的不太重要的部分中删除足够的位,并计算每个区域的排序集中要查询的分数范围来检查区域。
它使用什么地球模型?
该模型假设地球是一个球体,因为它使用 Haversine 公式来计算距离。这个公式在应用于地球时只是一个近似值,地球并不是一个完美的球体。 例如,当社交网络和需要此类查询的类似应用程序使用时,引入的错误不是问题。 但是,在最坏的情况下,误差可能高达 0.5%,因此您可能需要考虑使用其他系统来处理错误严重型应用程序。
例子
RESP2/RESP3 回复
Integer reply:当使用时不带可选参数,则为添加到排序集的元素数(不包括分数更新)。如果指定了 CH 选项,则为已更改(添加或更新)的元素数。历史
- 从 Redis 版本 6.2.0 开始:添加了
CH
,NX
和XX
选项。