*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 为距离)。