首页/数据/Redis 进阶速查/GEO 地理检索:GEOADD 与 GEOSEARCH
数据结构与选型42 条

GEO 地理检索:GEOADD 与 GEOSEARCH

基于 ZSet 的 GeoHash 实现:GEOADD 写入经纬度,GEOSEARCH 按半径或矩形范围查询并可返回距离与排序,GEOPOS/GEODIST 取坐标与两点距离。

Redis 进阶速查数据更新于 2026-10-13

GEO 是什么

Redis 的地理检索建立在 ZSet 之上:经纬度先被编码成 52 位整数(GeoHash),这个整数就是 ZSet 的分数,因此「按距离找附近」在实现上等价于「在分数接近的区间里取成员」。GEOADD 负责写入,GEOSEARCH 按圆形或矩形范围查询并能返回距离、按距离排序,GEODIST 计算两点间距离,GEOPOS 反查坐标。因为底层就是 ZSet,GEO 键也可以用 ZREM、ZCARD 等命令操作。

基本信息

写入GEOADD key 经度 纬度 成员名,坐标顺序为经度在前
范围查询GEOSEARCH key FROMLONLAT lon lat BYRADIUS 100 km ASC
距离计算GEODIST key member1 member2 km,单位可为 m/km/mi/ft
反查坐标GEOPOS key member,返回经纬度
废弃命令GEORADIUS 与 GEORADIUSBYMEMBER 自 6.2 起标记为废弃,新代码用 GEOSEARCH

典型使用场景

  • 附近的门店或服务点:给定用户坐标找半径内的对象,并按距离排序返回最近几家
  • 配送范围判断:判断骑手或车辆是否落在某个商圈范围内
  • 同城内容推荐:按距离阈值筛选候选对象,再交给业务排序
  • 仓库与自提点匹配:按用户位置找出最近的若干自提点
  • 轨迹点存储:把设备位置按时间片写入 GEO 键,用于最近位置查询

写入与查询

写入与查询
redis-cli GEOADD cities 116.4074 39.9042 beijing 121.4737 31.2304 shanghai
redis-cli GEOSEARCH cities FROMLONLAT 116.4074 39.9042 BYRADIUS 1200 km WITHDIST ASC
redis-cli GEOSEARCH cities FROMMEMBER beijing BYRADIUS 500 km COUNT 10   # 以已有成员为中心
redis-cli GEOSEARCH cities FROMLONLAT 116.4 39.9 BYBOX 100 100 km ASC    # 矩形范围
redis-cli GEODIST cities beijing shanghai km                             # 两点直线距离
redis-cli GEOPOS cities beijing                                          # 反查坐标
redis-cli ZCARD cities                                                   # 底层就是 ZSet,可当普通集合统计

常用参数

参数含义说明
FROMLONLAT以给定经纬度为中心经纬度顺序不能颠倒
FROMMEMBER以已有成员的位置为中心成员不存在时返回空结果
BYRADIUS圆形范围,需带单位m / km / mi / ft
BYBOX矩形范围,宽高加单位适合按街区或网格筛选
WITHDIST / ASC返回距离并按距离升序取最近 N 个的常规组合
距离是直线距离而非路网距离:GEO 计算的是两点间的地理直线,实际驾车或步行距离需要另行计算。用于「附近 3 公里」这类业务时,通常先把半径适当放大作为候选集,再用第三方路网服务精算。
经纬度顺序写反不会报错但结果完全错误:GEOADD 的语法是「经度 纬度」,经度范围约在负 180 到 180 之间,纬度在负 85 到 85 之间。如果纬度值超过 85 会因越界而报错,但两个都在范围内时错误会静默产生。

易错点

  • 把经纬度写反导致查询结果错得离谱却不报错,这是最高频的低级错误,写入与查询两侧都要核对参数顺序
  • 把 GEO 当作路网距离使用,业务上算出「直线 1 公里」却实际需要绕行数公里,配送时长预估严重失真
  • 继续使用已废弃的 GEORADIUS 系列命令,新代码应统一改为 GEOSEARCH 或 GEOSEARCHSTORE
  • 把所有城市或所有设备塞进一个 GEO 键,成员数量巨大影响查询性能,应按区域或业务分片成多个键

数据来源与参考

  • Redis 官方文档:Geo 数据类型 / GEOSEARCH 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌