GEO的介绍
Redis3.2版本提供了GEO地址位置信息定位的功能。支持存储地理位置信息来实现诸如摇一摇,附近位置这类地理位置信息的功能。
Redis也是使用业界比较通用的地理位置距离排序算法GeoHash算法。将二维的经纬度坐标数据映射到一维的整数,将所有元素都挂在到一条线上。在距离靠经二维坐标映射到一维之后点之间的距离也会很近。
例如我们想要计算附近的人时,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就可以。
在Redis中,经纬度使用52位的整数进行编码,放进入zset里面。zset的value是元素的key,score是GeoHash的52位整数值。
GEO的常用操作命令
-
增加地理位置信息
-
geoadd key longitude latitude member [ longitude latitude member ]
-
longitude latitude member 分别代表地理位置的经度、纬度、成员
-
返回信息是添加成功的个数
-
获取地理位置信息
-
获取两个地理位置坐标之间的距离、默认是米,mi(miles英里)、ft(feet)英尺
-
获取指定范围内的地理位置信息位置集合
-
georadius key longitude latitude radius m|km|ft|mi [withcoord][withdist]
[withhash][COUNT count] [ascldesc] [store key] [storedist key]
georadiusbymember key member radius m|km|ft|mi [withcoord][withdist]
[withhash] [COUNT count][ascldesc] [store key] [storedist key] -
上述两个命令效果是一样的,都是以一个地理位置为中心,计算出指定半径之内的其他地理位置信息。
-
不同之处在于下面这个命令需要给出成员
-
withcoord 返回结果包含经纬度
-
withdist 返回结果包含离中心位置的距离
-
withhash 返回结果包含geohash
-
COUNT count 指定半径之后返回的结果数量
-
ascldesc 返回结果是按照距离中心节点距离做升序还是降序
-
store key 将返回结果的地理位置信息保存到指定的键
-
storedist key 将返回结果距离中心节点的距离保存到指定的键
- -
获取geohash、字符串越长表示位置越精确
-
删除地理位置信息、因为GEO底层基础Zset实现,可以使用Zset的命令实现删除