GEO 看起来像 Redis 里单独的一类地理索引,但它的根其实扎在 ZSet 里。经纬度会被编码成可排序的 geohash 分数,再利用有序集合做候选范围检索。

这解释了一个常见边界:Redis GEO 很适合查附近的人、附近门店、半径内候选点;但它不是完整 GIS,不擅长复杂多边形、道路距离和空间关系分析。

先把机制边界说清楚

这一篇只讨论 Redis GEO 的索引思路和查询边界,不把它替代 PostGIS、Elasticsearch Geo 或地图服务。

整体路径

GEO 如何落在 ZSet 上

上面这张图先把主线铺开:经纬度 -> geohash score -> 范围候选 -> 精确过滤。读 Redis 这类系统,最重要的是别只停在命令接口,要继续追问它在内存里是什么形状、在主线程上走多远、失败时会留下什么状态。

底层机制

  • 写入位置时,Redis 会把经纬度编码成 geohash,并作为 ZSet 分数保存。
  • 范围查询先根据目标区域找到候选 geohash 范围,再计算真实距离过滤。
  • GEOSEARCH 比老的 GEORADIUS 更适合作为现代命令入口。
  • 返回数量和半径直接影响扫描范围,查询越宽,候选越多。

这些机制放在一起看,就能把「这个命令能不能用」改成「这个命令在当前数据规模下还便不便宜」。Redis 的很多坑,不是命令本身错了,而是数据规模和访问方式已经越过了它的舒适区。

取舍与边界

GEO 的优势是轻量和低延迟,弱点是地理语义有限。它是附近检索,不是空间数据库。

典型问题:用机制化例子排查

  • 附近门店、同城用户、车辆粗定位可以用 GEO 做候选召回。
  • 查询必须限制半径和 COUNT,不要给用户一个无限地图拖拽范围。
  • 复杂边界、多边形围栏和道路距离交给 GIS 系统,Redis 只做缓存或候选层。
  • 按城市或业务区域拆 key,避免全球点位混在一个 ZSet 里。

收束:一句判断

Redis GEO 的本质,是用 ZSet 做了一层足够快的地理候选索引。


关于十三Tech

我是十三,All in AI Agent 方向的架构师,专注 AI 工程实践。

我相信 AI 是程序员的最佳搭档,也希望帮助每一位开发者更好地驾驭 AI。

如果你想继续跟完这套「图解 Redis」,欢迎关注公众号 「十三Tech」。后续会继续按数据结构、底层机制、持久化、高可用和实战排查这条线更新。

十三Tech公众号二维码