*Redis GEOSEARCH 命令
在 Geo 集合中搜索指定范围内的地理位置。Redis 6.2+ 引入,替代 GEORADIUS 和 GEORADIUSBYMEMBER。
*语法
GEOSEARCH key [FROMMEMBER member] [FROMLONLAT lon lat] [BYRADIUS rad m | km | ft | mi] [BYBOX w h m | km | ft | mi] [ASC | DESC] [COUNT count] [WITHCOORD] [WITHDIST] [WITHHASH]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Geo 集合键名 |
| FROMMEMBER | String | 条件 | 以集合中指定成员为中心搜索 |
| FROMLONLAT | Double | 条件 | 以指定经纬度为中心搜索 |
| BYRADIUS | Double | 条件 | 圆形半径搜索,单位 m/km/ft/mi |
| BYBOX | Double | 条件 | 矩形搜索,宽 w 高 h,单位 m/km/ft/mi |
| ASC | 标志 | 否 | 按距离升序(默认) |
| DESC | 标志 | 否 | 按距离降序 |
| COUNT | Integer | 否 | 最多返回数量 |
| WITHCOORD | 标志 | 否 | 同时返回经纬度 |
| WITHDIST | 标志 | 否 | 同时返回距离 |
| WITHHASH | 标志 | 否 | 同时返回 geohash |
*返回值
| 条件 | 返回值 |
|---|---|
| 有结果 | 成员数组;WITH 选项时返回更详细信息 |
| 无结果 | 空数组 |
*时间复杂度
O(N+log(M)),N 为搜索范围内的元素数,M 为集合元素数。
*示例
> GEOADD cities 116.4074 39.9042 "Beijing" 121.4737 31.2304 "Shanghai" 113.2644 23.1291 "Guangzhou"
(integer) 3
# 以 Beijing 为中心,1000km 半径搜索
> GEOSEARCH cities FROMMEMBER Beijing BYRADIUS 1000 km
1) "Beijing"
2) "Shanghai"
# 以指定经纬度为中心,矩形搜索
> GEOSEARCH cities FROMLONLAT 116 39 BYBOX 500 500 km WITHDIST WITHCOORD
1) 1) "Beijing"
2) "48.35"
3) 1) "116.4073948860168457"
2) "39.9042117239123224"
*常见错误
- FROMMEMBER 和 FROMLONLAT 必须选一个:两个都不选或都选会报错。
*最佳实践
- 新版地理位置搜索:Redis 6.2+ 优先使用 GEOSEARCH 替代 GEORADIUS/GEORADIUSBYMEMBER,功能更完整且语义更清晰。
*FAQ
Q: GEOSEARCH 和 GEORADIUS 有什么区别? A: GEOSEARCH 是 Redis 6.2+ 引入的统一搜索命令,支持 FROMMEMBER/FROMLONLAT 和 BYRADIUS/BYBOX 组合;GEORADIUS 和 GEORADIUSBYMEMBER 是老版本命令,功能已被 GEOSEARCH 覆盖。
Q: GEOSEARCH 支持 STORE 吗? A: 不支持。GEOSEARCH 是只读命令,存储结果使用 GEOSEARCHSTORE。