Redis GEO功能出错主因是坐标系、单位、连接配置三处问题:经度需-180~180、纬度-90~90,Point参数顺序为longitude,latitude,Redis版本须≥3.2;GEORADIUS单位必须显式小写如"m",且基于WGS84坐标系计算距离。

直接用 RedisTemplate.opsForGeo() 调用 GEOADD 和 GEORADIUS 就能跑通,但线上一压就出错、距离不准、查不到人——问题几乎都出在坐标系、单位、连接配置这三处。
Spring Boot里调用geoOperations.add()总失败?检查这三点
常见错误现象:ERR invalid longitude,latitude 或插入后 GEORADIUS 返回空列表。
- 经度必须在
-180.0到180.0之间,纬度必须在-90.0到90.0之间 —— 很多前端传的是百度坐标系(BD09)或国测局偏移坐标(GCJ02),直接塞进去会越界 -
geoOperations.add(key, new Point(longitude, latitude), member)中Point构造参数顺序是longitude, latitude,反了就全错(不是lat, lng) - Redis 版本必须 ≥ 3.2 —— Spring Boot 2.x 默认兼容,但如果你用的是 Docker 镜像或云 Redis 实例,得手动确认:
redis-cli INFO | grep redis_version
GEORADIUS 返回结果距离不准?单位和精度陷阱
现象:明明用户 A 和 B 直线距离 300 米,GEORADIUS 却返回 distance: 426.7m;或者半径设成 500 却只返回 1 条。
-
GEORADIUS的单位参数必须显式指定:"m"(米)、"km"、"mi"、"ft"—— 漏写或写成"M"(大写)会触发默认单位("m"),但某些客户端解析异常导致范围失效 - Redis GEO 使用 WGS84 坐标系 + Haversine 公式计算球面距离,理论误差
- 不要依赖
WITHDIST返回的数值做前端距离展示 —— 它是近似值;如需高精度,应把经纬度取回后用标准 Haversine 在业务层重算
高并发下 GEORADIUS 延迟飙升?连接池和 key 设计是关键
现象:QPS 过 500 后平均响应从 2ms 涨到 80ms,redis-cli --latency 显示实例延迟正常。
-
lettuce连接池必须配满:max-active: 20、max-idle: 10、min-idle: 5,否则请求排队等连接,不是 Redis 慢,是客户端卡住 - 所有 GEO 操作必须落在同一个 Redis key 下 —— 如果你按城市分 key(如
geo:beijing、geo:shanghai),那没问题;但千万别跨 key 查询(比如想查“全国附近的人”,GEO 不支持) - 避免在单个 GEO key 里塞超 100 万成员 —— 虽然 Redis 支持,但
GEORADIUS的O(log N + M)中 M 是结果集大小,M 大时排序开销明显;建议按业务维度分片(如geo:user:active/geo:user:offline)
最常被忽略的一点:Redis GEO 不校验坐标合法性,也不会自动拒绝非法值。你传一个 Point(1000, 200) 它照收,但后续所有查询都失效——所以务必在 addUserLocation() 方法入口加经纬度范围断言,别等线上报警才想起这事。


















