redis学习六-地理信息定位(GEO)的使用
1 GEO简介
redis3.2版本支持存储地理位置信息来存储地理位置,很多app中地理位置相关功能如附近位置、摇一摇等功能可以通过GEO来实现
2 常用命令
2.1 添加地理位置信息
geoadd key longitude latitude member [longitude latitude member ...]
longitude:经度
latitude:维度
member:成员
return:添加成功的个数
添加5个个城市的经纬度
127.0.0.1:6379> geoadd city:location 116.28 39.55 beijing
(integer) 1
127.0.0.1:6379> geoadd city:location 117.12 39.08 tianjin
(integer) 1
127.0.0.1:6379> geoadd city:location 114.29 38.02 shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 3
如果需要修改仍然可以使用geoadd,尽管返回结果为0
2.2 获取地理位置信息
geopos key member [member ...]
127.0.0.1:6379> geopos city:location beijing
1) 1) "116.28000229597091675"
2) "39.5500007245470826
2.3 获取两个位置距离
geodist key member1 member2 [unit]
unit:距离单位,m-米,km-千米,mi-英里,ft-尺
按照公里计算天津到北京距离:
127.0.0.1:6379> geodist city:location beijing tianjin km
"89.2061"
2.4 获取指定范围内地理位置信息集合
georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
georadius和georadiusbymember两个命令一样,只不过前者给出具体经纬度,后者给出成员即可
withcoord:返回结果包含经纬度
withdist:返回结果包含离中心节点的距离
count:返回结果数量
asc|desc:返回结果按照离中心位置升序、降序
store key:返回结果地理位置信息保存在指定键中
storedist key:返回结果离中心节点距离保存在指定的键中
计算离北京150km范围内的城市:
127.0.0.1:6379> georadiusbymember city:location beijing 150 km
1) "beijing"
2) "tianjin"
3) "tangshan"
4) "baoding"
2.5 获取geohash
geohash key member [member ...]
redis使用geohash将二维经纬度转化为一维字符串,geohash越长,位置越精确。geohash长度为9时,精度在2m左右
127.0.0.1:6379> geohash city:location beijing
1) "wx48ypbe2q0"
GEO的数据类型为zset,redis将所有的地理位置信息的geohash存储在zset中。
127.0.0.1:6379> type city:location
zset
127.0.0.1:6379> zrange city:location 0 -1 withscores
1) "shijiazhuang"
2) "4068409216745297"
3) "baoding"
4) "4068467794757282"
5) "beijing"
6) "4069140618056030"
7) "tianjin"
8) "4069185565231353"
9) "tangshan"
10) "4069273368540169"
两个字符串越相近,她们距离越近,redis利用字符串前缀匹配来实现相关命令
2.6 删除地理位置信息
GEO没有提供删除成员的命令,不过GEO底层实现是zset,可以通过zrem命令删除成员