*Redis GEORADIUS_RO 命令
GEORADIUS_RO 以只读模式查询指定坐标范围内的地理空间元素,与 GEORADIUS 功能相同但不会执行任何写操作。
*语法
GEORADIUS_RO key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count [ANY]] [ASC | DESC] [STORE key] [STOREDIST key]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 有序集合键名 |
| longitude | Double | 是 | 中心点经度 |
| latitude | Double | 是 | 中心点纬度 |
| 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
> GEORADIUS_RO cities 116.4074 39.9042 1000 km
1) "beijing"
*带距离和坐标
> GEORADIUS_RO cities 116.4074 39.9042 1500 km WITHDIST WITHCOORD
1) 1) "beijing"
2) "0.0001"
3) 1) "116.407396495342"
2) "39.9042000174522"
2) 1) "shanghai"
2) "1067.5984"
3) 1) "121.473696947098"
2) "31.2304162988836"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE | key 不是有序集合 | 确认 key 类型 |
| ERR radius cannot be negative | 半径为负数 | 使用正数半径 |
*最佳实践
- 在只读节点或副本上执行查询
- 使用 COUNT 限制返回数量,避免大数据集
- 使用 WITHDIST 获取精确距离,用于排序展示
- 配合 ASC 获取最近的元素
*FAQ
Q1: GEORADIUS_RO 和 GEORADIUS 有什么区别?
A: 功能相同,但 _RO 版本在只读节点安全执行,不执行写操作。
Q2: 可以跨数据库查询吗? A: 不能,key 必须在当前数据库中。
Q3: 距离精度如何? A: 使用 Haversine 公式,精度约 0.5%。