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