GEOADD

用法
GEOADD key [ NX | XX ] [ CH ] longitude latitude member [ longitude latitude member ... ]
复杂度
对于添加的每个元素,复杂度为 O(log(N)),其中 N 是有序集合中的元素数量。
始于
3.2.0
ACL 类别
@geo, @write, @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 的返回值只计算新添加的元素数量。

注意:XXNX 选项是互斥的。

工作原理?

有序集合的填充方式是使用一种称为 Geohash 的技术。纬度和经度位交错排列形成一个唯一的 52 位整数。我们知道有序集合的双精度浮点分数可以表示一个 52 位整数而不会损失精度。

这种格式允许通过检查覆盖整个形状所需的 1+8 个区域并丢弃其外部元素来实现边界框和半径查询。这些区域的检查方式是:计算覆盖框的范围,从有序集合分数的低有效位中移除足够的位,并计算每个区域在有序集合中要查询的分数范围。

它使用哪种地球模型?

该模型假定地球是一个球体,因为它使用 Haversine 公式计算距离。该公式应用于地球时仅是一种近似,因为地球并非一个完美的球体。引入的误差在社交网络和类似需要这种类型查询的应用中不是问题。然而,在最坏的情况下,误差可能高达 0.5%,因此对于对误差敏感的应用程序,您可能需要考虑其他系统。

示例

127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
127.0.0.1:6379> GEODIST Sicily Palermo Catania
"166274.1516"
127.0.0.1:6379> GEORADIUS Sicily 15 37 100 km
1) "Catania"
127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km
1) "Palermo"
2) "Catania"

RESP2/RESP3 回复

整数回复:当不带可选参数使用时,表示添加到有序集合的元素数量(不包括分数更新)。如果指定了 CH 选项,则表示已更改(添加或更新)的元素数量。

历史

版本 变更
6.2.0

添加了 CHNXXX 选项。