Redis能做GIS查询吗?Geo命令怎么用?
别再让空间查询拖慢你的系统!Redis Geo 的实战救场指南
你是不是也遇到过这样的场景:用户在 App 上滑动地图,想查找“附近5公里内的咖啡馆”,结果后端接口卡成PPT?传统GIS数据库(比如PostGIS)虽然强大,但在高并发、低延迟的互联网场景下,常常力不从心。这时候,很多人会问:Redis 这个内存数据库,能做 GIS 查询吗?答案是——不仅能,而且特别快!

Redis 不是GIS软件,但它的Geo模块专治“附近搜索”
先泼一盆冷水:Redis 不是 ArcGIS,也不是 QGIS。它没有拓扑分析、缓冲区生成、叠加运算这些高级功能。但如果你的需求是“查找附近的人/店/车”,或者“计算两点间距离”,那 Redis Geo 命令就是为你量身定制的瑞士军刀。
我在参与某外卖平台“骑手热力图”项目时,高峰期每秒要处理上万次“骑手位置上报 + 商家范围查询”。用 PostGIS 直接扛不住,改用 Redis Geo 后,平均响应时间从 300ms 降到 8ms —— 用户体验直接起飞。
核心原理:把地球“拍扁”存进内存,用有序集合当空间索引
Redis Geo 的底层其实是个“空间换时间”的天才设计。它把经纬度坐标通过 Geohash 算法 编码成一个字符串(比如 “wx4g0e”),然后把这个字符串存入一个 有序集合(Sorted Set)。这个集合的“分数”(score)就是 Geohash 的数值化结果,天然具备空间邻近性——地理上靠近的点,它们的 Geohash 值也相近。
想象一下:你把地球仪拍扁成一张世界地图,然后给每个国家贴上邮政编码。想找“北京附近的城市”,你不用遍历全球,只要查“邮编100开头”的区域就行了。Redis Geo 干的就是这事。
五分钟上手:六个命令解决90%的空间查询需求
实战才是硬道理。下面我手把手教你用最常用的六个命令,搞定主流 LBS 应用。
1. 添加坐标:GEOADD
语法:GEOADD key longitude latitude member [longitude latitude member ...]
# 添加三家咖啡馆的位置
GEOADD coffee_shops 116.404 39.915 "星巴克(国贸)"
GEOADD coffee_shops 116.407 39.918 "瑞幸(大望路)"
GEOADD coffee_shops 116.399 39.912 "Manner(三里屯)"
2. 计算距离:GEODIST
语法:GEODIST key member1 member2 [unit] (unit 可选 m, km, ft, mi)
# 计算 国贸星巴克 到 三里屯Manner 的距离(单位:公里)
GEODIST coffee_shops "星巴克(国贸)" "Manner(三里屯)" km
# 返回:约 1.2 公里
3. 查找附近:GEORADIUS / GEORADIUSBYMEMBER
这是最高频的命令!GEORADIUS 以经纬度为中心找附近;GEORADIUSBYMEMBER 以某个成员为中心找附近。
# 查找 距离 (116.404, 39.915) 3公里内的所有咖啡馆,按距离排序
GEORADIUS coffee_shops 116.404 39.915 3 km WITHDIST ASC
# 查找 距离 “瑞幸(大望路)” 2公里内的店(更常用!)
GEORADIUSBYMEMBER coffee_shops "瑞幸(大望路)" 2 km WITHDIST WITHCOORD
参数说明:
WITHDIST:返回距离WITHCOORD:返回坐标ASC/DESC:按距离升序/降序COUNT n:只返回前 n 个结果
4. 获取坐标:GEOPOS
GEOPOS coffee_shops "星巴克(国贸)" "瑞幸(大望路)"
# 返回:[[116.40399843454361, 39.91499961750732], [116.4070001244545, 39.91800002935547]]
5. 获取 Geohash:GEOHASH
调试或需要原始编码时用:
GEOHASH coffee_shops "星巴克(国贸)"
# 返回:["wx4g0e1c3u0"]
6. 删除成员:ZREM(没错,用的是有序集合命令)
ZREM coffee_shops "瑞幸(大望路)"
避坑指南:Dr.Gis 的三个血泪经验
- 精度陷阱:Geohash 有精度损失!默认约 50cm 误差,对米级定位够用,但别拿它做厘米级测绘。我在国土调查项目里吃过亏——千万别混用!
- 范围过大慎用:GEORADIUS 搜索半径别设太大(比如 1000km),它会扫描大量无用数据,反而慢。建议分层查询:先粗筛城市,再细查街区。
- 内存不是无限的:Redis 是内存数据库!百万级 POI 没问题,但千万级要考虑分片或冷热分离。我们曾因没设过期时间,半夜被 OOM 警报吵醒…
性能对比:Redis Geo vs PostGIS
| 指标 | Redis Geo | PostGIS |
|---|---|---|
| 写入速度 | 极快(内存操作) | 快(需写磁盘) |
| 查询延迟 | 亚毫秒级 | 毫秒~秒级 |
| 功能丰富度 | 仅基础空间查询 | 支持复杂空间分析 |
| 适用场景 | 高并发 LBS、实时推荐 | 专业 GIS 分析、历史数据挖掘 |
总结:选对工具,别用大炮打蚊子
Redis Geo 不是万能钥匙,但它绝对是“附近搜索”这类高频、简单空间查询的性能王者。记住它的定位:轻量、快速、专精。复杂空间分析?请交给 PostGIS 或 ArcGIS。两者结合才是王道——用 Redis 处理实时请求,用传统 GIS 做离线计算。
现在轮到你了!你在项目中用过 Redis Geo 吗?遇到过什么奇葩问题?或者对 Geohash 算法还有疑问?评论区留下你的故事,我会挑三个最有意思的问题,下期专门写一篇《Redis Geo 高阶调优实战》来解答!