美文网首页
redis GEO数据结构

redis GEO数据结构

作者: handsomemao666 | 来源:发表于2020-04-06 23:35 被阅读0次

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

  1. 增加地理位置信息
geoadd key longitude latitude member [longitude latitude member ...]

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


5个城市经纬度

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

127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
(integer) 1

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

127.0.0.1:6379> geoadd cities:locations 116.28 39.55 beijing
(integer) 0

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

127.0.0.1:6379> geoadd cities:locations 117.12 39.08 tianjin 114.29 38.02
shijiazhuang 118.01 39.38 tangshan 115.29 38.51 baoding
(integer) 4
  1. 获取地理位置信息
geopos key member [member ...]

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

127.0.0.1:6379> geopos cities:locations tianjin
1) 1) "117.12000042200088501"
2) "39.0800000535766543"
  1. 获取两个地理位置的距离。
geodist key member1 member2 [unit]

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

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

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

127.0.0.1:6379> geodist cities:locations tianjin beijing km
"89.2061"
  1. 获取指定位置范围内的地理信息位置集合
georadius key longitude latitude radiusm|km|ft|mi [withcoord] [withdist]
[withhash] [COUNT count] [asc|desc] [store key] [storedist key]

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

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

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

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

127.0.0.1:6379> georadiusbymember cities:locations beijing 150 km
1) "beijing"
2) "tianjin"
3) "tangshan"
4) "baoding"
  1. 获取geohash
geohash key member [member ...]

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

127.0.0.1:6379> geohash cities:locations beijing
1) "wx4ww02w070"

geohash有如下特点:

  • GEO的数据类型为zset,Redis将所有地理位置信息的geohash存放在zset中。
127.0.0.1:6379> type cities:locations
zset
  • 字符串越长,表示的位置更精确,表3-8给出了字符串长度对应的精度,例如geohash长度为9时,精度在2米左右。


    geohash长度与精度对应关系
  • 两个字符串越相似,它们之间的距离越近,Redis利用字符串前缀匹配
    算法实现相关的命令。
  • geohash编码和经纬度是可以相互转换的。
    Redis正是使用有序集合并结合geohash的特性实现了GEO的若干命令。
  1. 删除地理位置信息
zrem key member

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

[1] https://matt.sh/
[2] https://github.com/yinqiwen/ardb
[3] https://en.wikipedia.org/wiki/Geohash

相关文章

  • 项目中Redis应用场景

    一、Redis GEO-实现附近的人 1.1 Redis GEO介绍 Redis GEO主要用于存储地理位置信息,...

  • Redis Geo数据结构

    1、Geo指令的基本用法 Redis提供的Geo指令只有6个,读者们瞬间就可以掌握。使用时,读者务必想到,它只是一...

  • redis GEO数据结构

    Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地...

  • redis-geo

    redis-geo 介绍 算法看geo那个 内部实现就是zset(skiplist) 实例

  • Redis实现地理信息计算

    1 Redis的GEO Redis 在 3.2 版本以后增加了地理位置 GEO 模块,意味着我们可以使用 Redi...

  • Redis源码剖析之GEO——Redis是如何高效检索地理位置的

    Redis GEO 用做存储地理位置信息,并对存储的信息进行操作。通过geo相关的命令,可以很容易在redis中存...

  • redis命令大全

    1、Redis 地理位置(geo) 命令 2、 Redis 键(key) 命令 3、Redis 字符串(Strin...

  • redis GEO

    CEO(地理信息定位): 存储经纬度,计算两地距离,范围计算等API geoaddgeo key logitude...

  • 使用Redis实现附近的人的查询功能 - 例子记录

    1. 数据结构 - GEO GEO 3.2版本开始对GEO(地理位置)的支持使用场景:LBS应用开发 常用命令 G...

  • redis 学习(15)-- GEO

    GEO GEO 简介 Redis 3.2添加新特性 功能:存储经纬度、计算两地距离、范围计算等 基于ZSet实现 ...

网友评论

      本文标题:redis GEO数据结构

      本文链接:https://www.haomeiwen.com/subject/evdwphtx.html