能快速回答半径与范围问题的空间索引。

Redis 按距离处理地理位置

Redis 地理命令为带名称的位置建立索引,可以直接回答附近有哪些点,不必把全部坐标传回应用。它适合能够接受球面距离模型的场景,但不会提供道路路线、考虑海拔的空间距离、任意多边形分析,也不会保证查询到的每个位置仍然新鲜。这些不是查询速度更快就能顺带解决的问题。 经度必须放在纬度前面 GEOADD 按经度、纬度、成员名的顺序接收参数。有效经度从负一百八十度到正一百八十度,纬度则限制在大约负 85.05112878 度到正 85.05112878 度之间,极区不属于该索引支持的范围。如果把两个各自仍合法的数值交换位置,命令可能正常成功,却把成员放到完全不同的地方。 索引底层是有序集合,分数保存五十二位地理哈希编码,不能用普通排行榜分数覆盖这些位置编码。成员是唯一的:更新同名成员只会改变位置,不会增加一份记录。GEOADD 默认统计新增成员数,加 CH 才统计新增及实际变化。删除位置使用 ZREM,读取存储坐标则使用 GEOPOS;不要把一次更新返回零当成更新失败。 坐标编码具有有限精度,因此 GEOPOS 不一定原样返回输入的小数。GEODIST 使用理想球面地球计算表面距离,不是穿过地球内部的直线弦长,更不是驾车路线。默认单位为米,也可以选择公里、英尺和英里。任何一个端点缺失时,返回空结果,而不是把不存在的位置当作距离为零的重合点。 把查询条件写成明确契约 Redis 6.2 开始提供 GEOSEARCH,可以围绕已有成员或显式经纬度查询。BYRADIUS 指定圆形范围,BYBOX 则按所选单位指定轴向对齐矩形的宽和高。新的查询应使用该命令,而不是已弃用的 GEORADIUS 系列。请求中的单位与结果解释必须一致,否则正确的数值也会被应用解读成错误的距离。 ASC 按距离从近到远排列,COUNT 限制返回数量。要找最近的若干个结果,应使用 ASC 和 COUNT,避免 ANY;ANY 允许找到足够数量后提前结束,不能保证拿到查询区域内全局最近的那些点。另外,返回数量少不代表查询一定便宜:范围巨大且点位密集时,即使只要求少量结果,也可能需要检查很多候选。 FROMMEMBER 查询可以包含作为中心的成员自身。如果业务要找“附近的其他人”,就需要处理这个结果,而不是直接把第一条当作别人。WITHDIST 返回所选单位下的距离,WITHCOORD 返回坐标。结果反映的是查询时索引里存放的数据,并不等于已经独立确认某台设备或某个商户此刻就在该位置。 坏掉的样子 文档说明,在边界情况下,球面近似与地球实际形状之间的误差可以达到约百分之零点五。因此,“城市尺度”并不自动意味着误差小于一米。应用应明确可接受误差及距离边界如何判定;测绘、安全关键接近判断、道路规划或严格地理围栏,可能需要更合适的空间模型,不能只凭一次示例距离看起来合理就验收精度。 ...

一月 25, 2028 · 3 分钟 · XB Field Notes