redis学习六-地理信息定位(GEO)的使用

1 GEO简介

redis3.2版本支持存储地理位置信息来存储地理位置,很多app中地理位置相关功能如附近位置、摇一摇等功能可以通过GEO来实现

2 常用命令

2.1 添加地理位置信息

geoadd key longitude latitude member [longitude latitude member ...]
    longitude:经度
    latitude:维度
    member:成员
    return:添加成功的个数
添加5个个城市的经纬度

redis学习六-地理信息定位(GEO)的使用

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左右

redis学习六-地理信息定位(GEO)的使用

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命令删除成员