Redis GEO的使用

Redis 3.2提供了GEO功能,支持存储地理位置信息用来实现类似微信中附近的人的功能,使用起来十分方便。

下面简单介绍一下Redis中几个和GEO相关的命令

1.添加地理位置
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 条记录。

2.获取地理位置信息
geopos cities:locations member [member ...]

执行下面的操作会获取到上海的经纬度:

192.168.1.4>geopos cities:locations shanghai
  1)    1)   "121.47000163793563843"
        2)   "31.22999903975783553"
3.获取两个地理位置的距离
geodist key member1 member2 [unit]

其中unit为可选参数,可选以下四种,默认 m:
- m:代表单位米
- km:代表单位千米
- mi:代表单位英里
- ft:代表单位尺

执行下面的操作可以得到北京到上海的距离,单位米:

192.168.1.4>geodist cities:locations beijing shanghai
"1067378.7564"
4.获取指定位置内的地理位置集合
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
5.删除地理位置信息
zrem key member

GEO并没有提供删除成员的命令,但因为GEO底层实现是zset,所以可以借助 zrem 命令来实现删除地理位置信息。

6.获取geohash
geohash key member [member ...]

执行下面的操作可以得到shanghai 的geohash值:

192.168.1.4>geohash cities:locations shanghai
  1)  "wtw3sj5zbj0"
  • GEO的数据类型是zset,Redis将所有地理位置信息的geohash存在zset中
  • geohash字符串越长表示地理位置精度越高
  • 两个geohash字符串越相似,两个位置距离越近
  • geohash和经纬度之间有着一一对应的关系
  • Redis GEO的命令都是基于geohash来实现的

总结

Redis GEO是一个很新的数据结构,使用geohash和zset实现。

可以方便我们关于地理位置的存取,在特定的使用场景还是很有价值的。


喜欢这篇文章的朋友,欢迎扫描下图关注公众号lebronchen,第一时间收到更新内容。
Redis GEO的使用_第1张图片

你可能感兴趣的:(Redis)