GEOADD
语法
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
来删除元素。地理索引结构只是一个排序集。
GEOADD 选项
GEOADD
还提供了以下选项
- XX: 仅更新已存在的元素。从不添加元素。
- NX: 不要更新已存在的元素。始终添加新元素。
- CH: 将返回值从添加的新元素数量修改为更改的元素总数(CH 是 changed 的缩写)。更改的元素是 添加的新元素 和 坐标已更新的已存在元素。因此,命令行中指定的具有与过去相同分数的元素不会被计算在内。注意:通常,
GEOADD
的返回值只计算添加的新元素数量。
注意:XX 和 NX 选项是互斥的。
它是如何工作的?
排序集的填充方式是使用一种称为 Geohash 的技术。经度和纬度位被交织在一起形成一个唯一的 52 位整数。我们知道,排序集双精度分数可以表示一个 52 位整数,而不会丢失精度。
此格式允许通过检查覆盖整个形状所需的 1+8 个区域并丢弃外部元素来进行边界框和半径查询。通过计算覆盖框的范围,从排序集分数的较低有效位部分删除足够的位,并计算每个区域在排序集中查询的范围来检查区域。
它使用什么地球模型?
该模型假设地球是一个球体,因为它使用海弗森公式来计算距离。该公式在应用于地球(不是完美的球体)时只是一个近似值。例如,社交网络和类似应用程序在使用此类查询时,引入的误差不是问题。但是,在最坏的情况下,误差可能高达 0.5%,因此对于错误敏感的应用程序,您可能需要考虑其他系统。
示例
RESP2/RESP3 答复
整数答复: 不使用可选参数时,添加到排序集的元素数量(不包括分数更新)。如果指定了 CH 选项,则更改(添加或更新)的元素数量。历史
- 从 Redis 版本 6.2.0 开始:添加了
CH
、NX
和XX
选项。