GEORADIUS

查询距离坐标一定距离内的成员的地理空间索引,并可选择存储结果。

语法

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

引入版本:3.2.0

复杂度摘要:O(N+log(M)

[!NOTE] 此命令的行为在集群 Redis 环境中有所不同。请参阅 多键操作 页面了解更多信息。

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

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

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

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

  • m 用于仪表。
  • km 代表公里。
  • mi 代表里程。
  • 脚的ft。

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

  • WITHDIST:同样返回返回物品距指定中心的距离。返回的距离单位与指定为命令半径参数的单位相同。
  • WITHCOORD:同时返回匹配项的经度、纬度坐标。
  • WITHHASH:还以 52 位无符号整数的形式返回该项目的原始 geohash 编码的有序集合分数。这仅对低级黑客或调试有用,否则一般用户不会感兴趣。

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

  • ASC:相对于中心,从最近到最远对返回的项目进行排序。
  • DESC:相对于中心,从最远到最近对返回的项目进行排序。

默认情况下返回所有匹配的项目。通过使用 COUNT <count> 选项,可以将结果限制为前 N 个匹配项。当提供 ANY 时,一旦找到足够的匹配项,该命令就会返回,因此结果可能不是最接近指定点的结果,但另一方面,服务器投入的工作量会显着降低。当未提供 ANY 时,该命令将执行与匹配指定区域的项目数量成正比的工作并对它们进行排序,因此使用非常小的 COUNT 选项查询非常大的区域可能会很慢,即使只返回一些结果。

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

  • STORE:将项目存储在填充有其地理空间信息的有序集合中。
  • STOREDIST:将项目存储在有序集合中,并以浮点数形式填充距中心的距离,并采用半径中指定的相同单位。

必需参数

key

保存地理空间索引(有序集合)的键的名称。

longitude

中心点的经度。

latitude

中心点的纬度。

radius

搜索圆的半径,单位由以下参数给出。

M | KM | FT | MI

radius 的单位:米 (M)、公里 (KM)、英尺 (FT) 或英里 (MI)。

可选参数

WITHCOORD

同时返回每个匹配项的经度和纬度。

WITHDIST

同时返回每个匹配项距中心的距离,单位与半径相同。

WITHHASH

还返回每个匹配项的原始 52 位 geohash 编码分数。

COUNT count [ANY]

最多返回count个匹配项。使用 ANY,一旦找到足够的匹配项,该命令就会返回 — 速度更快,但结果可能未排序。

ASC | DESC

按距中心的距离对结果进行排序:最近的优先 (ASC) 或最远的优先 (DESC)。

STORE key

将结果作为地理空间索引存储在 key 中,而不是返回它们。 STORE 和 STOREDIST 是互斥的。

STOREDIST key

将结果作为距中心距离的有序集合存储在 key 中,而不是返回它们。

示例

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.361389338970184"
      2) "38.1155563954963"
2) 1) "Catania"
   2) 1) "15.087267458438873"
      2) "37.50266842333162"
redis> GEORADIUS Sicily 15 37 200 km WITHDIST WITHCOORD
1) 1) "Palermo"
   2) "190.4424"
   3) 1) "13.361389338970184"
      2) "38.1155563954963"
2) 1) "Catania"
   2) "56.4413"
   3) 1) "15.087267458438873"
      2) "37.50266842333162"

详细说明

只读变体

由于 GEORADIUS 和 GEORADIUSBYMEMBER 具有 STORE 和 STOREDIST 选项,因此从技术上讲,它们在 Redis 命令表中被标记为写入命令。因此,只读副本会对它们进行标记,并且即使连接处于只读模式,Redis 集群副本也会将它们重定向到主实例(请参阅 Redis 集群的 READONLY 命令)。

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

Redis Software 与 Redis Cloud 兼容性

Redis
软件
Redis
Cloud
说明
✅ 标准
✅ 主动-主动
✅ 标准
✅ 主动-主动
从 Redis v6.2.0 开始已弃用。

返回值

RESP2

以下之一: * 如果未指定 WITH* 选项,则为匹配成员名称的 数组回复 * 如果指定了 WITHCOORD、WITHDIST 或 WITHHASH 选项,则该命令返回数组的 数组回复,其中每个子数组代表单个项目: 1. 距中心的距离为浮点数,采用与半径中指定的相同单位。 1. Geohash 整数。 1. 坐标为两个 x,y 数组(经度、纬度)。例如,命令 GEORADIUS Sicily 15 37 200 km WITHCOORD WITHDIST 将按以下方式返回每个项目: ["Palermo","190.4424",["13.361389338970184","38.115556395496299"]]

RESP3

以下之一: * 如果未指定 WITH* 选项,则为匹配成员名称的 数组回复 * 如果指定了 WITHCOORD、WITHDIST 或 WITHHASH 选项,则该命令返回数组的 数组回复,其中每个子数组代表单个项目: 1. 距中心的距离为浮点数,采用与半径中指定的相同单位。 1. Geohash 整数。 1. 坐标为两个 x,y 数组(经度、纬度)。例如,命令 GEORADIUS Sicily 15 37 200 km WITHCOORD WITHDIST 将按以下方式返回每个项目: ["Palermo","190.4424",["13.361389338970184","38.115556395496299"]]

资料来源:Redis 官方 GEORADIUS 文档;中文内容参考 Redis 文档许可。