*Redis GEOPOS 命令
GEOPOS 用于返回一个或多个地理位置成员的经纬度坐标。
*语法
GEOPOS key member [member ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 键名(Geo 键) |
| member | String | 是 | 地理位置成员(可多个) |
*返回值
- Array:每个成员对应一个坐标数组 [longitude, latitude]
- 不存在的成员返回对应的元素为 (nil)
*时间复杂度
O(log(N)),其中 N 是 Geo 集合中的成员数量,M 是请求的成员数量
*示例
*基本用法
> GEOADD cities 116.40 39.90 "beijing" 121.47 31.23 "shanghai"
2
> GEOPOS cities beijing shanghai
1) 1) "116.399998960495"
2) "39.900000091670986"
2) 1) "121.470001637935638"
2) "31.229999039135836"
*部分成员不存在
> GEOPOS cities beijing shenzhen
1) 1) "116.399998960495"
2) "39.900000091670986"
2) (nil)
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 参数数量不足 | 提供 key 和至少一个 member |
| WRONGTYPE Operation against a key holding the wrong kind of value | key 不是 Geo 类型 | 确认 key 是通过 GEOADD 创建的 |
*最佳实践
- 场景:获取地点坐标、验证位置数据、与地图服务集成
- 注意:返回的坐标与原始 GEOADD 的坐标可能有微小差异(由于 GeoHash 编码精度)
- 建议不要依赖返回的坐标进行精确匹配,而是用于展示或近似计算
- 如需原始精确坐标,建议在 Redis 中单独存储一份
*FAQ
Q1: 返回的坐标和 GEOADD 时输入的完全一样吗? A: 不完全一样。Redis 内部使用 GeoHash 编码,会引入约 0.5% 的精度损失。返回的坐标是解码后的值。
Q2: 可以一次查询多个成员吗? A: 可以,支持多个 member 参数,返回对应的坐标数组。
Q3: 坐标顺序是 [经度, 纬度] 吗? A: 是的,Redis Geo 命令统一使用 [longitude, latitude] 顺序,与很多地图服务一致。