Redis3.2支持GEO(地理信息定位)功能,能够存储地理位置信息来实现附近的位置等依赖于地理位置信息的功能。

添加地理位置

geoadd key longitude latitude member

longitude、latitude、member分别是地理位置的经度、维度、成员。如果需要更新地理位置信息也可以使用geoadd命令。

获取地理位置

geopos key member

geopos可以用来获取一个或多个成员的地理位置信息

获取两个地理位置的距离

geodist key member1 member2 [unit]

其中unit表示返回结果的单位,包含下列四种:

  • m(meters)代表米
  • km(kilometers)代表公里
  • mi(miles)代表英里
  • ft(feet)代表尺

获取指定位置范围内的地理信息位置集合

georadius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [storedist key]
georadiusbymember key member radiusm|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [storedist key]

georadius和georadiusbymember两个命令的作用是一样的,都是以一个地理位置为中心计算出指定半径内的其它地理位信息位置,不同的是georadius命令的中心位置给出了具体的经纬度,georadiusbymembers只需给出成员即可。

其中radiusm |km|ft|mi是必须参数,指定了半径,其提供了很多可选参数

  • withcoord:返回结果中包含经纬度的
  • withdist:返回结果中离中心节点位置的距离
  • withhash:返回结果中包含geohash
  • COUNT count:指定返回结果的数量
  • asc|desc:返回结果按照距离中心点的距离做升序或者降序
  • store key:将返回结果的地理位置信息保存到指定key中
  • storedist key:将返回结果距离中心点的距离保存到指定key中

获取geohash

geohash key member

Redis使用geohash将二维经纬度转换为字符串,其具有以下特点:

  • geo的数据类型为zset,Redis将所有地理位置信息的geohash存放在zset中
  • 字符串越长,表示的位置约精确
  • 两个字符串越相似,它们之间的距离越近,Redis利用字符串前缀匹配算法实现
  • geohash编码和经纬度是可以互相转换的

删除地理位置信息

zrem key member

GEO未提供专门的删除命令,但其类型是zset,可以通过zrem命令来删除对应的地理位置信息。