登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  Redis

Redis GEOSEARCH 怎样限制矩形范围

来源:17golang原创

时间:2026-10-15 01:13:28 291浏览 收藏

如果需求是“以某个位置为中心,找出一个宽 10 公里、高 6 公里的配送区域”,Redis 不应该使用 BYRADIUS,而应使用 GEOSEARCH 的 BYBOX 10 6 KM。其中 10 是矩形宽度,6 是矩形高度,单位必须写在后面;查询中心可以来自经纬度,也可以来自已有成员。

要点速览
  • BYBOX width height unit 定义轴对齐矩形,宽高不是左上角和右下角坐标。
  • FROMLONLAT longitude latitude 与 FROMMEMBER member 二选一,坐标顺序是经度在前。
  • COUNT、排序和 WITHDIST 改变返回结果与成本,但不改变矩形的几何边界。

BYBOX 的两个数字分别代表什么

BYBOX 适合门店配送区、地图视口、瓦片邻域这类“横向一段距离、纵向另一段距离”的场景。它以查询中心为基准生成一个轴对齐矩形:第一个数字是宽度,第二个数字是高度,二者使用同一个距离单位。Redis 官方命令参考列出的单位包括 M、KM、FT 和 MI;GEOSEARCH 从 Redis 6.2.0 起提供。

在Redis里限制GEOSEARCH查询的矩形范围,核心是用自带的BYBOX参数,配合指定的宽高和坐标原点就能实现,不用额外写复杂的范围过滤逻辑。
GEOADD stores 116.397 39.908 store-beijing
GEOADD stores 116.430 39.915 store-east
GEOADD stores 116.360 39.900 store-west

# 以经纬度为中心,搜索宽 10 公里、高 6 公里的矩形
GEOSEARCH stores FROMLONLAT 116.397 39.908 BYBOX 10 6 KM ASC WITHDIST WITHCOORD

上例中的经度 116.397 在纬度 39.908 前面。把顺序写反时,命令可能仍然是合法的,但中心点会落到完全不同的位置,这是最容易漏掉的业务错误。

Redis GEOSEARCH BYBOX 以经纬度中心点连接宽度高度和距离单位的矩形结构说明图
图1:GEOSEARCH BYBOX 的几何结构说明图,展示中心点、宽高和统一单位的静态关系,不是运行截图。

中心点和矩形参数如何组合

中心点有两种写法。知道坐标时使用 FROMLONLAT longitude latitude;已经把某个位置作为成员写入地理索引时,可以使用 FROMMEMBER member。这两个来源互斥,不能同时传入。

# 使用已有成员 store-beijing 作为矩形中心
# 只返回最近的 20 个成员,并附带距离
GEOSEARCH stores FROMMEMBER store-beijing BYBOX 10 6 KM ASC COUNT 20 WITHDIST

ASC 按距离从近到远,DESC 则相反;不指定排序时不要把返回顺序当成稳定业务顺序。COUNT 20 只限制最多返回多少个成员。若再加 ANY,Redis 找到足够数量后可以更早返回,但结果未必是全局最近的 20 个。

矩形查询和圆形查询不要混用

BYRADIUS 5 KM 表示半径为 5 公里的圆,BYBOX 10 6 KM 表示宽 10 公里、高 6 公里的矩形。前者只有一个距离参数,后者有两个边长参数。两者不能同时出现,选择哪一个取决于业务边界:配送圈、附近门店通常偏向圆形;地图视口或规则网格通常更适合矩形。

目标写法需要留意
圆形范围BYRADIUS radius KM所有方向使用同一个半径
矩形范围BYBOX width height KM宽高是距离,不是经纬度差
结果补充WITHDIST WITHCOORD返回字段增加,客户端解析要匹配
Redis GEOSEARCH 中心点来源、BYBOX与BYRADIUS互斥以及排序返回选项的关系说明图
图2:GEOSEARCH 参数关系说明图,展示中心点来源、范围形状和结果选项的边界,不是运行截图。

上线前的四项检查

第一,确认所有成员都写在同一个地理索引 key 下,并检查经度、纬度顺序。第二,统一单位:业务输入是米就使用 M,不要把“10 米”写成 10 KM。第三,明确是否需要稳定的近远排序;需要时显式写 ASC,再根据结果数量决定是否使用 COUNT。第四,注意矩形是轴对齐的,它不会随着道路方向或地图旋转;如果业务边界是行政区、多边形或复杂形状,GEOSEARCH 的简单 GEO 数据类型就不够了,需要评估 Redis Search 的 GEO/GEOSHAPE 能力。

常见问题

BYBOX 的 width 和 height 能使用不同单位吗?

不能。单位只写一次,宽度和高度共同使用它;需要把米换成公里后再传入。

BYBOX 能直接传左上角和右下角坐标吗?

不能。它接受中心点加宽高,不能把两个经纬度点直接当作参数。

为什么加了 COUNT 结果仍然不固定?

没有显式排序时,返回顺序不应当被当成稳定顺序;加上 ASC 或 DESC,并确认客户端正确解析距离。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>