GEOADD
Syntax
GEOADD key [NX | XX] [CH] longitude latitude member [longitude latitude member ...]
- Available since:
- 3.2.0
- Time complexity:
- O(log(N)) for each item added, where N is the number of elements in the sorted set.
- ACL categories:
-
@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 回复
Integer reply: When used without optional arguments, the number of elements added to the sorted set (excluding score updates). If the CH option is specified, the number of elements that were changed (added or updated).历史
- 从Redis版本6.2.0开始:添加了
CH
、NX
和XX
选项。