首页/数据/数据库速查/GEO 地理位置命令(GEOADD/GEODIST/GEOSEARCH)
Redis 命令96 条

GEO 地理位置命令(GEOADD/GEODIST/GEOSEARCH)

GEO 系列把经纬度存进 ZSet(score 为 geohash)并支持距离与范围检索:GEOADD 写入、GEODIST 测距、GEOSEARCH 找附近成员。

数据库速查数据更新于 2026-10-13

GEO 命令族是什么

GEO 把经纬度套进 ZSet 实现:成员是地点标识,score 是 52 位 geohash 编码,因此既支持 GEODIST 测距、GEOSEARCH 范围检索,也能直接用 ZRANGE、ZREM 等有序集合命令操作。写入用 GEOADD(顺序是先经度后纬度),检索推荐 GEOSEARCH(6.2+ 起替代 GEORADIUS)。需要说明的是 GEO 提供的是按距离检索,不提供游标分页。

基本信息

适用版本GEOADD 等基础命令 3.2+,GEOSEARCH 需 6.2+
底层结构ZSet,score 为 geohash 编码
参数顺序longitude latitude(先经度后纬度)
距离单位m / km / ft / mi
检索方式FROMMEMBER 或 FROMLONLAT + BYRADIUS / BYBOX
分页无游标分页,常用 COUNT 与逐步扩大半径变通

典型使用场景

  • 附近的门店或网点:按半径检索并返回距离
  • 同城或跨城距离计算:GEODIST 直接给出直线距离
  • 区域筛选:用 BYBOX 做矩形范围查询,适配地图可视区域
  • 骑手与车辆调度:按距离排序取出最近的若干个体
  • 与业务缓存配合:结果集小、无需分页的检索场景最合适

写入与检索

写入与检索
GEOADD shops 116.404 39.915 shop:a 121.474 31.230 shop:b
GEODIST shops shop:a shop:b km            # 约 1067 公里(直线距离)

# 按半径检索:以某成员为中心,5 公里内最多返回 10 个并带距离
GEOSEARCH shops FROMMEMBER shop:a BYRADIUS 5 km ASC COUNT 10 WITHDIST

# 按矩形检索:以坐标为中心,10 公里 × 10 公里的盒子
GEOSEARCH shops FROMLONLAT 116.40 39.91 BYBOX 10 10 km ASC

GEOPOS shops shop:a                       # 取回存储的坐标
GEOHASH shops shop:a                      # 取 geohash 字符串

命令与参数

命令 / 参数作用注意
GEOADD写入经纬度先经度后纬度,写反不报错但结果离谱
GEODIST计算两成员直线距离受地球球面近似影响,与地图导航距离不同
GEOSEARCH范围检索(圆形或矩形)6.2+ 推荐,支持 ASC/DESC 与 COUNT
WITHDIST / WITHCOORD附加返回距离或坐标返回结构变复杂,解析要相应调整
ZREM / ZRANGE直接按 ZSet 操作底层是 ZSet,可复用于清理与统计
「附近的人/店」分页:GEO 本身没有游标,常见变通是固定 COUNT 逐步扩大半径,或把结果按业务侧缓存后自行分页;数据规模大、检索条件复杂时应考虑专门的检索服务。
纬度超出 ±85.05 度会直接报错:geohash 编码用固定纬度范围,超出范围的坐标无法写入;另外经纬度写反不会报错,只会得到一个合法但完全错误的位置,调试时优先用 GEOPOS 复核。

易错点

  • 经纬度顺序写反:GEODIST 结果离谱却没有任何报错提示
  • 把 GEO 当分页接口用:没有游标,深翻页只能靠扩大半径或缓存变通
  • 用 GEODIST 的结果当实际行驶距离:它是直线球面距离,会明显小于真实路线
  • 对同一成员重复 GEOADD 不同坐标:ZSet 更新 score,旧位置直接丢失,需要额外记录历史
  • 在集群中把相关 GEO 键散落到不同分片:多键 GEO 操作会报 CROSSSLOT,需用哈希标签

数据来源与参考

  • Redis 官方文档: GEOADD
  • Redis 官方文档: GEOSEARCH

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌