GEOADD key [NX|XX] [CH] longitude latitude member [longitude latitude member ...]

自 3.2.0 起可用。

时间复杂度: O(log(N)) 对于添加的每个项目,其中 N 是排序集中的元素数。

将指定的地理空间项(经度、纬度、名称)添加到指定键。数据作为排序集存储到键中,从而可以使用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%,因此您可能需要考虑其他系统用于错误关键应用程序。

返回值

整数回复,具体来说:

当不使用可选参数时,添加到排序集中的元素数量(不包括分数更新)。
如果CH指定了该选项,则为已更改(添加或更新)的元素数。

例子

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

历史

  • Redis 版本 >= 6.2.0:添加了 CHNXXX 选项。

GEODIST key member1 member2 [M|KM|FT|MI]

自 3.2.0 起可用。

时间复杂度: O(log(N))

返回排序集表示的地理空间索引中两个成员之间的距离。

给定一个表示地理空间索引的排序集,使用GEOADD命令填充,该命令返回指定单元中两个指定成员之间的距离。

如果缺少一个或两个成员,则该命令返回 NULL。

单位必须是以下之一,默认为米:

  • m为米。
  • 公里换公里。
  • 英里数英里。
  • 英尺换英尺。

距离的计算假设地球是一个完美的球体,因此在边缘情况下可能出现高达 0.5% 的误差。

返回值

批量字符串回复,具体来说:

该命令以指定单位的双精度(表示为字符串)形式返回距离,如果缺少一个或两个元素,则返回 NULL。

例子

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEODIST Sicily Palermo Catania
"166274.1516"
redis> GEODIST Sicily Palermo Catania km
"166.2742"
redis> GEODIST Sicily Palermo Catania mi
"103.3182"
redis> GEODIST Sicily Foo Bar
(nil)
redis> 

GEOHASH key member [member ...]

自 3.2.0 起可用。

时间复杂度:每个请求成员的 O(log(N)),其中 N 是排序集中的元素数。

返回有效的Geohash字符串,表示一个或多个元素在表示地理空间索引的排序集合值中的位置(其中元素是使用GEOADD添加的)。

通常 Redis 使用 Geohash 技术的变体表示元素的位置,其中位置使用 52 位整数编码。与标准相比,编码也不同,因为在编码和解码过程中使用的初始最小和最大坐标不同。但是,此命令以字符串形式返回标准 Geohash,如Wikipedia 文章中所述,并且与geohash.org网站兼容。

Geohash 字符串属性
该命令返回 11 个字符的 Geohash 字符串,因此与 Redis 内部 52 位表示相比,不会丢失任何精度。返回的 Geohashes 具有以下属性:

  1. 它们可以缩短从右侧删除字符。它会失去精度,但仍会指向同一区域。
  2. 可以在geohash.orgURL 中使用它们,例如http://geohash.org/. 这是此类 URL 的一个示例。
  3. 具有相似前缀的字符串在附近,但事实并非如此,具有不同前缀的字符串也可能在附近。

返回值

数组回复,具体来说:

该命令返回一个数组,其中每个元素是对应于作为参数传递给命令的每个成员名称的 Geohash。

例子

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOHASH Sicily Palermo Catania
1) "sqc8b49rny0"
2) "sqdtr74hyu0"
redis> 

GEOPOS key member [member ...]

自 3.2.0 起可用。

时间复杂度: O(N),其中 N 是请求的成员数。

返回由key处的排序集表示的地理空间索引的所有指定成员的位置(经度、纬度)。

给定一个表示地理空间索引的排序集,使用GEOADD命令填充,获取指定成员的坐标通常很有用。当通过GEOADD填充地理空间索引时,坐标将转换为 52 位 geohash,因此返回的坐标可能与添加元素所使用的坐标不完全相同,但可能会引入小错误。

该命令可以接受可变数量的参数,因此即使指定了单个元素,它也始终返回位置数组。

返回值

数组回复,具体来说:

该命令返回一个数组,其中每个元素是一个两元素数组,表示作为参数传递给命令的每个成员名称的经度和纬度 (x,y)。

不存在的元素被报告为数组的 NULL 元素。

例子

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOPOS Sicily Palermo Catania NonExisting
1) 1) "13.36138933897018433"
   2) "38.11555639549629859"
2) 1) "15.08726745843887329"
   2) "37.50266842333162032"
3) (nil)
redis> 

GEORADIUS key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]

自 3.2.0 起可用。

时间复杂度: O(N+log(M)) 其中 N 是由中心和半径分隔的圆形区域的边界框内的元素数,M 是索引内的项目数。

弃用通知: 从 Redis 版本 6.2.0 开始,此命令被视为已弃用。虽然它不太可能被完全删除,但最好使用带有 BYRADIUS 参数的 GEOSEARCHGEOSEARCHSTORE

使用GEOADD返回填充有地理空间信息的排序集的成员,这些成员位于以中心位置和距中心的最大距离(半径)指定的区域的边界内。

本手册页还涵盖了GEORADIUS_RO和GEORADIUSBYMEMBER_RO变体(有关更多信息,请参阅下面的部分)。

此命令的常见用例是检索指定点附近不超过给定米(或其他单位)数量的地理空间项目。例如,这允许向附近地点的应用程序的移动用户推荐。

半径以下列单位之一指定:

  • m为米。
  • 公里换公里。
  • 英里数英里。
  • 英尺换英尺。

该命令可以选择使用以下选项返回附加信息:

WITHDIST: 也返回返回的物品到指定中心的距离。距离以与指定为命令的半径参数的单位相同的单位返回。

  • WITHCOORD: 同时返回匹配项的经纬度坐标。
  • WITHHASH:还以 52 位无符号整数的形式返回项目的原始 geohash 编码排序集分数。这仅对低级 hack 或调试有用,否则对一般用户来说没什么兴趣。

命令默认是返回未排序的项目。可以使用以下两个选项调用两种不同的排序方法:

  • ASC:相对于中心,从最近到最远对返回的项目进行排序。
  • DESC:相对于中心,从最远到最近对返回的项目进行排序。
    默认情况下,返回所有匹配项。可以使用COUNT选项将结果限制为前 N 个匹配项。提供时ANY,一旦找到足够的匹配项,该命令将立即返回,因此结果可能不是最接近指定点的结果,但另一方面,服务器投入的工作量要低得多。如果ANY未提供,该命令将执行与匹配指定区域的项目数成正比的工作并对其进行排序,因此COUNT即使只返回几个结果,使用非常小的选项查询非常大的区域也可能会很慢。

默认情况下,该命令将项目返回给客户端。可以使用以下选项之一存储结果:

  • STORE:将项目存储在填充了其地理空间信息的排序集中。
  • STOREDIST:将项目存储在一个排序集中,该集合与中心的距离为浮点数,与半径中指定的单位相同。

返回值

数组回复,具体来说:

  • 如果没有指定任何WITH选项,该命令只返回一个线性数组,如 ["New York","Milan","Paris"]。
  • 如果指定或选项WITHCOORD,则该命令返回一个数组数组,其中每个子数组代表一个项目。WITHDISTWITHHASH
    当附加信息作为每个项目的数组数组返回时,子数组中的第一项始终是返回项目的名称。其他信息按以下顺序作为子数组的连续元素返回。
  1. 与中心的距离为浮点数,与半径中指定的单位相同。
  2. geohash 整数。
  3. 坐标作为两个项目 x,y 数组(经度,纬度)。

因此,例如,该命令GEORADIUS Sicily 15 37 200 km WITHCOORD WITHDIST将以下列方式返回每个项目:

["Palermo","190.4424",["13.361389338970184","38.115556395496299"]]

只读变体

由于GEORADIUS和GEORADIUSBYMEMBER有一个STOREandSTOREDIST选项,它们在技术上被标记为在 Redis 命令表中写入命令。出于这个原因,只读副本会标记它们,即使连接处于只读模式,Redis 集群副本也会将它们重定向到主实例(请参阅 Redis 集群的READONLY命令)。

至少在 Redis 4.0 中,考虑过破坏与过去的兼容性但被拒绝,因此添加了两个只读命令变体。它们与原始命令完全相同,但拒绝STOREandSTOREDIST选项。这两个变体称为GEORADIUS_ROand GEORADIUSBYMEMBER_RO,可以安全地用于副本。

例子

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUS Sicily 15 37 200 km WITHDIST
1) 1) "Palermo"
   2) "190.4424"
2) 1) "Catania"
   2) "56.4413"
redis> GEORADIUS Sicily 15 37 200 km WITHCOORD
1) 1) "Palermo"
   2) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"
redis> 

历史

  • Redis 版本 >= 6.2.0:为 COUNT 添加了 ANY 选项。

GEORADIUSBYMEMBER key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC] [STORE key] [STOREDIST key]

自 3.2.0 起可用。

时间复杂度: O(N+log(M)) 其中 N 是由中心和半径分隔的圆形区域的边界框内的元素数,M 是索引内的项目数。

弃用通知: 从 Redis 版本 6.2.0 开始,此命令被视为已弃用。虽然它不太可能被完全删除,但最好使用带有 BYRADIUSFROMMEMBER 参数的 GEOSEARCHGEOSEARCHSTORE 来代替。

该命令与GEORADIUS完全一样,唯一的区别是,它不是将经度和纬度值作为要查询的区域的中心,而是采用排序集表示的地理空间索引中已经存在的成员的名称。

指定成员的位置作为查询的中心。

请查看下面的示例和GEORADIUS文档以获取有关命令及其选项的更多信息。

请注意,GEORADIUSBYMEMBER_RO从 Redis 3.2.10 和 Redis 4.0.0 开始也可以使用,以便提供可在副本中使用的只读命令。有关详细信息,请参阅GEORADIUS页面。

例子

redis> GEOADD Sicily 13.583333 37.316667 "Agrigento"
(integer) 1
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEORADIUSBYMEMBER Sicily Agrigento 100 km
1) "Agrigento"
2) "Palermo"
redis> 

GEORADIUSBYMEMBER_RO key member radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC]

自 3.2.10 起可用。

时间复杂度: O(N+log(M)) 其中 N 是由中心和半径分隔的圆形区域的边界框内的元素数,M 是索引内的项目数。

弃用通知: 从 Redis 版本 6.2.0 开始,此命令被视为已弃用。虽然它不太可能被完全删除,但最好使用带有 BYRADIUSFROMMEMBER 参数的 GEOSEARCH 来代替。

GEORADIUSBYMEMBER命令的只读变体。

此命令与GEORADIUSBYMEMBER命令相同,只是它不支持可选参数STORE和STOREDIST参数。

GEORADIUS_RO key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC|DESC]

自 3.2.10 起可用。

时间复杂度: O(N+log(M)) 其中 N 是由中心和半径分隔的圆形区域的边界框内的元素数,M 是索引内的项目数。

弃用通知: 从 Redis 版本 6.2.0 开始,此命令被视为已弃用。虽然它不太可能被完全删除,但最好使用带有 BYRADIUS 参数的 GEOSEARCH 来代替。

GEORADIUS命令的只读变体。

该命令与GEORADIUS命令相同,只是它不支持可选参数STORE和STOREDIST参数。

返回值

数组回复:一个数组,每个条目都是在同一位置给出的子命令的相应结果。

历史

  • Redis 版本 >= 6.2.0:为 COUNT 添加了 ANY 选项。

GEOSEARCH key [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius M|KM|FT|MI] [BYBOX width height M|KM|FT|MI] [ASC|DESC] [COUNT count [ANY]] [WITHCOORD] [WITHDIST] [WITHHASH]

从 6.2.0 开始可用。

时间复杂度: O(N+log(M)) 其中 N 是作为过滤器提供的形状周围的网格对齐边界框区域中的元素数,M 是形状内的项目数

使用GEOADD返回填充了地理空间信息的排序集的成员,这些成员位于给定形状指定的区域的边界内。该命令扩展了GEORADIUS命令,因此除了在圆形区域内搜索外,它还支持在矩形区域内搜索。

应使用此命令代替已弃用的GEORADIUS和GEORADIUSBYMEMBER命令。

查询的中心点由以下强制选项之一提供:

  • FROMMEMBER: 使用给定存在于排序集中的位置。
  • FROMLONLAT:使用给定的位置。

查询的形状由以下强制选项之一提供:

  • BYRADIUS:类似于GEORADIUS,根据给定的圆形区域内搜索
  • BYBOX:在轴对齐的矩形内搜索,由和确定

该命令可以选择使用以下选项返回附加信息:

  • WITHDIST: 也返回返回的物品到指定中心点的距离。距离返回的单位与为半径或高度和宽度参数指定的单位相同。
  • WITHCOORD: 同时返回匹配项的经度和纬度。
  • WITHHASH:还以 52 位无符号整数的形式返回项目的原始 geohash 编码排序集分数。这仅对低级 hack 或调试有用,否则对一般用户来说没什么兴趣。

默认情况下,匹配项未排序返回。要对它们进行排序,请使用以下两个选项之一:

  • ASC:相对于中心点,从最近到最远对返回的项目进行排序。
  • DESC:相对于中心点,从最远到最近对返回的项目进行排序。
    默认返回所有匹配项。要将结果限制为前 N 个匹配项,请使用COUNT选项。使用该ANY选项时,只要找到足够的匹配项,该命令就会返回。这意味着返回的结果可能不是最接近指定点的结果,但服务器为生成它们所付出的努力要少得多。如果ANY未提供,该命令将执行与匹配指定区域的项目数成正比的工作并对其进行排序,因此COUNT即使只返回几个结果,使用非常小的选项查询非常大的区域也可能会很慢。

返回值

数组回复,具体来说:

  • 如果没有指定任何WITH选项,该命令只返回一个线性数组,如 ["New York","Milan","Paris"]。
  • 如果指定或选项WITHCOORD,则该命令返回一个数组数组,其中每个子数组代表一个项目。WITHDISTWITHHASH

当附加信息作为每个项目的数组数组返回时,子数组中的第一项始终是返回项目的名称。其他信息按以下顺序作为子数组的连续元素返回。

  1. 与中心的距离为浮点数,与形状中指定的单位相同。
  2. geohash 整数。
  3. 坐标作为两个项目 x,y 数组(经度,纬度)。

例子

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOADD Sicily 12.758489 38.788135 "edge1" 17.241510 38.788135 "edge2"
(integer) 2
redis> GEOSEARCH Sicily FROMLONLAT 15 37 BYRADIUS 200 km ASC
1) "Catania"
2) "Palermo"
redis> GEOSEARCH Sicily FROMLONLAT 15 37 BYBOX 400 400 km ASC WITHCOORD WITHDIST
1) 1) "Catania"
   2) "56.4413"
   3) 1) "15.08726745843887329"
      2) "37.50266842333162032"
2) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.36138933897018433"
      2) "38.11555639549629859"
3) 1) "edge2"
   2) "279.7403"
   3) 1) "17.24151045083999634"
      2) "38.78813451624225195"
4) 1) "edge1"
   2) "279.7405"
   3) 1) "12.7584877610206604"
      2) "38.78813451624225195"
redis> 

GEOSEARCHSTORE destination source [FROMMEMBER member] [FROMLONLAT longitude latitude] [BYRADIUS radius M|KM|FT|MI] [BYBOX width height M|KM|FT|MI] [ASC|DESC] [COUNT count [ANY]] [STOREDIST]

从 6.2.0 开始可用。

时间复杂度: O(N+log(M)) 其中 N 是作为过滤器提供的形状周围的网格对齐边界框区域中的元素数,M 是形状内的项目数

此命令类似于GEOSEARCH,但将结果存储在目标键中。

此命令代替现在已弃用的GEORADIUS和GEORADIUSBYMEMBER。

默认情况下,它将结果destination及其地理空间信息存储在排序集中。

使用该STOREDIST选项时,该命令将项目存储在一个排序集中,该排序集中填充了它们与圆或框中心的距离,作为浮点数,采用为该形状指定的相同单位。

返回值

整数回复:结果集中的元素数。

例子

redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
(integer) 2
redis> GEOADD Sicily 12.758489 38.788135 "edge1" 17.241510 38.788135 "edge2"
(integer) 2
redis> GEOSEARCHSTORE key1 Sicily FROMLONLAT 15 37 BYBOX 400 400 km ASC COUNT 3
(integer) 3
redis> GEOSEARCH key1 FROMLONLAT 15 37 BYBOX 400 400 km ASC WITHCOORD WITHDIST WITHHASH
1) 1) "Catania"
   2) "56.4413"
   3) (integer) 3479447370796909
   4) 1) "15.08726745843887329"
      2) "37.50266842333162032"
2) 1) "Palermo"
   2) "190.4424"
   3) (integer) 3479099956230698
   4) 1) "13.36138933897018433"
      2) "38.11555639549629859"
3) 1) "edge2"
   2) "279.7403"
   3) (integer) 3481342659049484
   4) 1) "17.24151045083999634"
      2) "38.78813451624225195"
redis> GEOSEARCHSTORE key2 Sicily FROMLONLAT 15 37 BYBOX 400 400 km ASC COUNT 3 STOREDIST
(integer) 3
redis> ZRANGE key2 0 -1 WITHSCORES
1) "Catania"
2) "56.441257870158204"
3) "Palermo"
4) "190.44242984775784"
5) "edge2"
6) "279.7403417843143"
redis>