三、GEO

Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能,对于需要实现这些功能的开发者来说是一大福音。GEO功能是Redis的另一位作者Matt Stancliff借鉴NoSQL数据库Ardb实现的,Ardb的作者来自中国,它提供了优秀的GEO功能。

一、增加地理位置信息

geoadd key longitude latitude member [longitude latitude member ...]

longitude、latitude、member分别是该地理位置的经度、维度、成员。

城市经度纬度成员
北京116.2839.55beijing
天津117.1239.08tianjin

cities:locations是上面5个城市地理位置信息的集合,现向其添加北京的地理位置信息:

geoadd cities:locations 116.28 39.55  beijing

返回结果代表添加成功的个数,如果cities:locations没有包含beijing,那么返回结果为1,如果已经存在则返回0:

geoadd cities:locations 116.28 39.55 beijing

如果需要更新地理位置信息,仍然可以使用geoadd命令,虽然返回结果为0。geoadd命令可以同时添加多个地理位置信息。

geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02 shijiazhuang 118.01.39.38 tangshan 115.29 38.51 baoding

二、获取地理位置信息

geopos key member [member ...]

下面操作会获取天津的经纬度:

geopos cities:locations tianjin

三、获取两个地理位置的距离

geodist key member1 member2  [unit]

其中unit代表返回结果的单位

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

下面操作用于计算天津到北京的距离,并以公里为单位:

geodist cities:locations tianjin beijing km

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

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两个命令的作用是一样的,都是以一个地理位置为中心算出指定半径内的其他地理信息位置,不同的是georadius命令的中心位置给出了具体的经纬度,georadiusbymember只需要给出成员即可。其中radius m|km|ft|mi 是必须参数,指定了半径(带单位),这两个命令有很多可选参数,如下所示:

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

下面操作计算五座城市中,距离北京150公里以内的城市:

georadiusbymember cities:locations beijing 150 km

五、获取geohash

geohash key member [member ...]

Redis使用geohash将二维经纬度转换为一维字符串,下面操作会返回beijing的geohash值。

geohash cities:locations beijing

geohash有如下特点

  • GEO的数据类型为zset,Redis将所有地理位置信息的geohash存放在zset中。
type cities:locations
  • 字符串越长,表示的位置更精确,表给出了字符串长度对应的精度,例如geohash长度为9时,精度在2米左右。
    在这里插入图片描述
  • 两个字符串越相似,它们之间的距离越近,Redis利用字符串前缀匹配算法实现相关的命令。
  • geohash编码和经纬度是可以相互转换的。

Redis正是使用使用有序集合并结合geohash的特性实现了GEO的若干命令。

六、删除地理位置信息

zrem key member

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值