*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"

*常见错误

  1. FROMMEMBER 和 FROMLONLAT 必须选一个:两个都不选或都选会报错。

*最佳实践

  1. 新版地理位置搜索:Redis 6.2+ 优先使用 GEOSEARCH 替代 GEORADIUS/GEORADIUSBYMEMBER,功能更完整且语义更清晰。

*FAQ

Q: GEOSEARCH 和 GEORADIUS 有什么区别? A: GEOSEARCH 是 Redis 6.2+ 引入的统一搜索命令,支持 FROMMEMBER/FROMLONLAT 和 BYRADIUS/BYBOX 组合;GEORADIUSGEORADIUSBYMEMBER 是老版本命令,功能已被 GEOSEARCH 覆盖。

Q: GEOSEARCH 支持 STORE 吗? A: 不支持。GEOSEARCH 是只读命令,存储结果使用 GEOSEARCHSTORE