GEO 命令族是什么
GEO 把经纬度套进 ZSet 实现:成员是地点标识,score 是 52 位 geohash 编码,因此既支持 GEODIST 测距、GEOSEARCH 范围检索,也能直接用 ZRANGE、ZREM 等有序集合命令操作。写入用 GEOADD(顺序是先经度后纬度),检索推荐 GEOSEARCH(6.2+ 起替代 GEORADIUS)。需要说明的是 GEO 提供的是按距离检索,不提供游标分页。
基本信息
| 适用版本 | GEOADD 等基础命令 3.2+,GEOSEARCH 需 6.2+ |
|---|---|
| 底层结构 | ZSet,score 为 geohash 编码 |
| 参数顺序 | longitude latitude(先经度后纬度) |
| 距离单位 | m / km / ft / mi |
| 检索方式 | FROMMEMBER 或 FROMLONLAT + BYRADIUS / BYBOX |
| 分页 | 无游标分页,常用 COUNT 与逐步扩大半径变通 |
典型使用场景
- 附近的门店或网点:按半径检索并返回距离
- 同城或跨城距离计算:GEODIST 直接给出直线距离
- 区域筛选:用 BYBOX 做矩形范围查询,适配地图可视区域
- 骑手与车辆调度:按距离排序取出最近的若干个体
- 与业务缓存配合:结果集小、无需分页的检索场景最合适
写入与检索
写入与检索
GEOADD shops 116.404 39.915 shop:a 121.474 31.230 shop:b
GEODIST shops shop:a shop:b km # 约 1067 公里(直线距离)
# 按半径检索:以某成员为中心,5 公里内最多返回 10 个并带距离
GEOSEARCH shops FROMMEMBER shop:a BYRADIUS 5 km ASC COUNT 10 WITHDIST
# 按矩形检索:以坐标为中心,10 公里 × 10 公里的盒子
GEOSEARCH shops FROMLONLAT 116.40 39.91 BYBOX 10 10 km ASC
GEOPOS shops shop:a # 取回存储的坐标
GEOHASH shops shop:a # 取 geohash 字符串命令与参数
| 命令 / 参数 | 作用 | 注意 |
|---|---|---|
| GEOADD | 写入经纬度 | 先经度后纬度,写反不报错但结果离谱 |
| GEODIST | 计算两成员直线距离 | 受地球球面近似影响,与地图导航距离不同 |
| GEOSEARCH | 范围检索(圆形或矩形) | 6.2+ 推荐,支持 ASC/DESC 与 COUNT |
| WITHDIST / WITHCOORD | 附加返回距离或坐标 | 返回结构变复杂,解析要相应调整 |
| ZREM / ZRANGE | 直接按 ZSet 操作 | 底层是 ZSet,可复用于清理与统计 |
「附近的人/店」分页:GEO 本身没有游标,常见变通是固定 COUNT 逐步扩大半径,或把结果按业务侧缓存后自行分页;数据规模大、检索条件复杂时应考虑专门的检索服务。
纬度超出 ±85.05 度会直接报错:geohash 编码用固定纬度范围,超出范围的坐标无法写入;另外经纬度写反不会报错,只会得到一个合法但完全错误的位置,调试时优先用 GEOPOS 复核。