Redis使用geoadd存储经纬度后geopos查询结果变更的原因及解决方案
Redis GEO命令坐标精度偏差说明
偏差产生原因
Redis的GEOADD、GEOPOS等GEO系列命令底层采用Geohash编码实现空间坐标存储:写入时会将输入的经纬度坐标转换为52位的整数Geohash值,再存入有序集合结构,这个转换过程天然存在精度损失:
- 52位Geohash的理论空间精度约为±0.6米,最多仅能保留小数点后5-6位的经纬度精度,你输入的8-9位小数精度已经超出了Redis GEO的存储上限,写入时会自动做近似处理,查询时返回的就是近似转换后的坐标值
- 浮点型数值在计算机二进制存储、转换过程中也会产生微小误差,两者叠加最终就会出现输入输出坐标不一致的情况
避免坐标变更的方案
- 若业务对经纬度精度要求高于±0.6米,不要依赖GEO结构存储原始坐标:单独使用普通的
STRING或HASH结构存储原始高精度经纬度的字符串/数值,GEO结构仅用于附近位置检索、距离计算等对精度要求不高的空间计算场景 - 若业务可接受±0.6米的误差,无需额外处理:这个级别的偏差完全不影响周边搜索、LBS打卡、路径规划等常见场景的正常使用
- 若需保留GEO结构使用且降低感知偏差,可以提前将原始经纬度截断至小数点后6位再执行
GEOADD写入,查询返回值就不会和输入值出现明显差异
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

