Redis 3.2提供了GEO功能,支持存储地理位置信息用来实现类似微信中附近的人的功能,使用起来十分方便。
下面简单介绍一下Redis中几个和GEO相关的命令
geoadd key long lat member [longitude latitude member]
城市 | 经度 | 纬度 | 成员 |
---|---|---|---|
上海 | 121.47 | 31.23 | shanghai |
北京 | 116.40 | 39.90 | beijing |
南京 | 118.78 | 32.07 | nanjing |
可以执行下面的命令将上面三个城市的经纬度加到Redis GEO中:
192.168.1.4>geoadd cities:locations 121.47 31.23 shanghai
116.40 39.90 beijing
118.78 32.07 nanjing
"3"
返回值 3 表示添加成功 3 条记录。
geopos cities:locations member [member ...]
执行下面的操作会获取到上海的经纬度:
192.168.1.4>geopos cities:locations shanghai
1) 1) "121.47000163793563843"
2) "31.22999903975783553"
geodist key member1 member2 [unit]
其中unit为可选参数,可选以下四种,默认 m:
- m:代表单位米
- km:代表单位千米
- mi:代表单位英里
- ft:代表单位尺
执行下面的操作可以得到北京到上海的距离,单位米:
192.168.1.4>geodist cities:locations beijing shanghai
"1067378.7564"
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
georadius 命令和 georadiusbymember 命令的作用都是根据一个经纬度,查询出制定半径内其他地理位置集合,不同的是 georadius 命令需要给出经纬度,georadiusbymember 命令可以给出中心位置的member。
命令中有很多可选参数,这里一一解释一下:
- withcoord:返回结果中包含经纬度
- withdist:返回结果中包含离中心节点位置的距离
- withhash:返回结果中包含geopath
- COUNT count:指定返回结果的数量
- asc|desc:返回结果根据离中心节点位置的距离进行升序或降序
- store key:将返回结果的地理位置信息保存到指定key
- storedist key:将返回结果离中心节点的距离保存到指定key
下面操作将计算距离上海500公里以内的城市:
192.168.1.4>georadiusbymember cities:locatiopns shanghai 50 km
1) nanjing
zrem key member
GEO并没有提供删除成员的命令,但因为GEO底层实现是zset,所以可以借助 zrem 命令来实现删除地理位置信息。
geohash key member [member ...]
执行下面的操作可以得到shanghai 的geohash值:
192.168.1.4>geohash cities:locations shanghai
1) "wtw3sj5zbj0"
Redis GEO是一个很新的数据结构,使用geohash和zset实现。
可以方便我们关于地理位置的存取,在特定的使用场景还是很有价值的。