*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] 顺序,与很多地图服务一致。