*Redis GEORADIUSBYMEMBER_RO 命令
GEORADIUSBYMEMBER_RO 以只读模式查询以指定成员为中心、给定半径范围内的地理空间元素。
*语法
GEORADIUSBYMEMBER_RO key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key] [STOREDIST key]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 有序集合键名 |
| member | String | 是 | 中心点成员名称 |
| radius | Double | 是 | 搜索半径 |
| unit | String | 是 | 单位:m、km、ft、mi |
| WITHCOORD | Flag | 否 | 返回成员坐标 |
| WITHDIST | Flag | 否 | 返回距离 |
| WITHHASH | Flag | 否 | 返回原始 geohash |
| COUNT | Integer | 否 | 限制返回数量 |
| ASC / DESC | Flag | 否 | 按距离升序/降序 |
| STORE | String | 否 | 存储结果到指定 key(仅主节点) |
| STOREDIST | String | 否 | 存储距离到指定 key(仅主节点) |
*返回值
- Array:成员列表,可选包含坐标、距离、geohash
*时间复杂度
O(N+log(M)),N 为范围内元素数量,M 为集合总元素数
*示例
*基本查询
> GEOADD cities 116.4074 39.9042 "beijing" 121.4737 31.2304 "shanghai"
(integer) 2
> GEORADIUSBYMEMBER_RO cities beijing 1000 km
1) "beijing"
*带距离查询
> GEORADIUSBYMEMBER_RO cities beijing 1500 km WITHDIST
1) 1) "beijing"
2) "0.0001"
2) 1) "shanghai"
2) "1067.5984"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR could not decode requested zset member | 成员不存在 | 确认成员在集合中 |
| WRONGTYPE | key 不是有序集合 | 确认 key 类型 |
*最佳实践
- 在只读节点执行查询,提高主节点性能
- 使用 COUNT 限制结果集大小
- 查找"附近的人"等场景非常有用
- 配合 ASC 获取最近的结果
*FAQ
Q1: 和 GEORADIUS_RO 有什么区别? A: GEORADIUS_RO 以坐标为中心;GEORADIUSBYMEMBER_RO 以集合成员为中心。
Q2: 中心成员会被包含吗? A: 是的,中心成员(如果存在)会被包含在结果中,距离为 0。
Q3: 可以查询不存在的成员吗? A: 不可以,会返回错误。