*Redis GEORADIUS 命令

GEORADIUS 用于返回指定坐标点半径范围内的所有地理位置成员。


*语法

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

*参数说明

参数 类型 必填 说明
key String 是 键名(Geo 键)
longitude Float 是 中心点经度
latitude Float 是 中心点纬度
radius Float 是 半径
M Flag 是 半径单位:米
KM Flag 是 半径单位:千米
FT Flag 是 半径单位:英尺
MI Flag 是 半径单位:英里
WITHCOORD Flag 否 返回成员的坐标
WITHDIST Flag 否 返回与中心点的距离
WITHHASH Flag 否 返回成员的 GeoHash
COUNT Flag 否 限制返回数量
count Integer 否 返回数量(配合 COUNT)
ANY Flag 否 任意返回 count 个(非最近)
ASC Flag 否 按距离升序排列
DESC Flag 否 按距离降序排列
STORE Flag 否 将结果存储到指定键
STOREDIST Flag 否 将结果和距离存储到指定键

*返回值

  • Array:成员列表,或包含坐标/距离/GeoHash 的数组

*时间复杂度

O(N + log(M)),其中 N 是半径范围内的成员数,M 是集合总成员数


*示例

*基本用法

> GEOADD cities 116.40 39.90 "beijing" 121.47 31.23 "shanghai" 113.23 23.16 "guangzhou"
3
> GEORADIUS cities 116.40 39.90 1000 KM
1) "beijing"
2) "shanghai"

*返回距离和坐标

> GEORADIUS cities 116.40 39.90 1000 KM WITHDIST WITHCOORD
1) 1) "beijing"
   2) "0.0001"
   3) 1) "116.399998960495"
      2) "39.900000091670986"
2) 1) "shanghai"
   2) "1067.8674"
   3) 1) "121.470001637935638"
      2) "31.229999039135836"

*限制返回数量

> GEORADIUS cities 116.40 39.90 1000 KM COUNT 1
1) "beijing"

*存储结果

> GEORADIUS cities 116.40 39.90 1000 KM STOREDIST nearby_dist
2
> ZRANGE nearby_dist 0 -1 WITHSCORES
1) "beijing"
2) "0.0001"
3) "shanghai"
4) "1067.8674"

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足 检查必填参数
ERR unsupported unit 单位错误 使用 M/KM/FT/MI
WRONGTYPE Operation against a key holding the wrong kind of value key 不是 Geo 类型 确认 key 是通过 GEOADD 创建的

*最佳实践

  • 场景:附近的人/商家/服务、地理围栏、位置推荐
  • 建议配合 COUNT 限制返回数量,避免大数据集返回过多结果
  • 使用 ASC 按距离排序,优先展示最近的
  • 注意:GEORADIUS 以中心点为中心,不是以某个成员为中心(用 GEORADIUSBYMEMBER)

*FAQ

Q1: GEORADIUS 和 GEORADIUSBYMEMBER 有什么区别? A: GEORADIUS 以指定坐标点为中心,GEORADIUSBYMEMBER 以某个已有成员为中心。

Q2: COUNT 返回的是最近的 N 个吗? A: 默认是最近的 N 个。如果加 ANY,则返回任意 N 个(性能更好,但不保证最近)。

Q3: STORE 和 STOREDIST 有什么区别? A: STORE 存储成员到有序集合(score 为 GeoHash),STOREDIST 存储成员到有序集合(score 为距离)。