GEOADD
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]
- 可用版本
- Redis Open Source 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 位整数。我们知道有序集合的双精度浮点数得分可以表示 52 位整数而不会丢失精度。
这种格式允许通过检查覆盖整个形状所需的 1+8 个区域并丢弃外部元素来进行边界框和半径查询。检查这些区域的方法是计算覆盖的范围,从有序集合得分的低位部分移除足够的位,并计算每个区域在有序集合中查询的得分范围。
使用何种地球模型?
该模型假设地球是球形的,因为它使用 Haversine 公式计算距离。将此公式应用于地球时,它只是一个近似值,因为地球不是完美的球体。例如,当社交网络和需要此类查询的类似应用使用此模型时,引入的误差不是问题。但是,在最坏的情况下,误差可能高达 0.5%,因此对于对误差要求严格的应用,您可能需要考虑其他系统。
示例
RESP2/RESP3 回复
整型回复:当不带可选参数使用时,返回添加到有序集合的元素数量(不包括分数更新)。如果指定了 CH 选项,则返回更改(添加或更新)的元素数量。历史
- 从 Redis 6.2.0 版本开始:增加了
CH
、NX
和XX
选项。