设为首页 收藏本站
查看: 577|回复: 0

[经验分享] Redis新特性GEOHASH-DBAspace

[复制链接]

尚未签到

发表于 2018-11-3 09:46:28 | 显示全部楼层 |阅读模式
  一、简言
  Redis 的 GEO 特性将在 Redis 3.2 版本释出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作
  将指定的地理空间项目(纬度,经度,名称)添加到指定的键。数据作为排序集存储到密钥中,使得可以使用GEORADIUS或GEORADIUSBYMEMBER命令使用半径查询稍后检索项目。
  该命令采用标准格式x,y的参数,因此必须在纬度之前指定经度。可以索引的坐标有限制:非常靠近极点的区域不可索引。如EPSG:900913 / EPSG:3785 / OSGEO:41001规定的具体限值如下:
  有效经度为-180至180度。
  有效纬度为-85.05112878至85.05112878度。
  注意:没有GEODEL命令,可以使用ZREM来删除元素。地理索引结构只是一个排序集。
  二、Redis GEO实现
  Redis GEO实现主要包含了以下两项技术:
  1、使用geohash保存地理位置的坐标。
  2、使用有序集合(zset)保存地理位置的集合。
  三、GEOHASH
  geohash的思想是将二维的经纬度转换成一维的字符串,geohash有以下三个特点:
  1、字符串越长,表示的范围越精确。编码长度为8时,精度在19米左右,而当编码长度为9时,精度在2米左右。
  2、字符串相似的表示距离相近,利用字符串的前缀匹配,可以查询附近的地理位置。这样就实现了快速查询某个坐标附近的地理位置。
  3、geohash计算的字符串,可以反向解码出原来的经纬度。
  四、GEOHASH命令语法
  1、geoadd 用来增加地理位置的坐标,可以批量添加地理位置,其格式为:
  GEOADD key longitude latitude member [longitude latitude member ...]
  字段的介绍:
  key标识一个地理位置的集合。longitude latitude member标识了一个地理位置的坐标。longitude是地理位置的经度,latitude是地理位置的纬度。
  member是该地理位置的名称。GEOADD可以批量给集合添加一批地理位置
  egg:GEOADD beijing-area 39.8865577059 116.2161254883 shijingshan
  2、geopos 可以获取地理位置的坐标,可以批量获取多个地理位置的坐标,命令格式为:
  GEOPOS key member [member ...]
  3、geodist 用来获取两个地理位置的距离,命令格式为:
  单位可以指定为以下四种类型:
  m:米,距离单位默认为米,不传递该参数则单位为米。
  km:公里。
  mi:英里。
  ft:英尺。
  4、georadius 可以根据给定地理位置坐标获取指定范围内的地理位置集合。命令格式为:
  GEORADIUS key longitude latitude radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]
  longitude latitude标识了地理位置的坐标,radius表示范围距离,距离单位可以为m|km|ft|mi,还有一些可选参数:
  WITHCOORD:传入WITHCOORD参数,则返回结果会带上匹配位置的经纬度。
  WITHDIST:传入WITHDIST参数,则返回结果会带上匹配位置与给定地理位置的距离。
  ASC|DESC:默认结果是未排序的,传入ASC为从近到远排序,传入DESC为从远到近排序。
  WITHHASH:传入WITHHASH参数,则返回结果会带上匹配位置的hash值。
  COUNT count:传入COUNT参数,可以返回指定数量的结果。
  5、georadiusbymember  可以根据给定地理位置获取指定范围内的地理位置集合。georadius命令传递的是坐标,georadiusbymember传递的是地理位置。georadius更为灵活,
  可以获取任何坐标点范围内的地理位置。但是大多数时候,只是想获取某个地理位置附近的其他地理位置,使用georadiusbymember则更为方便。
  georadiusbymember命令格式为(命令可选参数与georadius含义一样):
  georadiusbymember key member radius [m|km|ft|mi] [WITHCOORD] [WITHDIST] [ASC|DESC] [WITHHASH] [COUNT count]
  ###命令示例
  1、单一添加区域
  GEOADD beijing-area 116.2161254883 39.8865577059 shijingshan
  批量添加区域
  geoadd Beijing-areas 116.2161254883 39.8865577059 ShiJingShan 116.1611938477 39.7283134103 FangShan 116.3534545898 39.7071866568 DaXing 116.4166259766 39.9097362345 DongChenQu
  2、查看已经添加的地理信息,可以单个member或多个查询
  192.168.1.130:6379> geopos Beijing-areas ShiJingShan FangShan
  1) 1) "116.21612817049026489"
  2) "39.88655846536294547"
  2) 1) "116.16119652986526489"
  2) "39.72831328866426048"
  3、GEODIST命令来实现计算两个位置之间的距离,通过已存在的KEY下的2个位置计算距离,单位的距离有m米km千米等
  192.168.1.130:6379> geodist Beijing-areas ShiJingShan FangShan m
  "18216.0860"
  4、georadius查看当前位置的附近的所有位置 以及参数使用:[WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
  添加测试数据:
  geoadd beijing 116.6638183594 39.8928799003 tongzhou
  geoadd beijing 116.3534545898 39.7071866568 daxing
  geoadd beijing 116.2161254883 39.8865577059 shijingshan
  geoadd beijing 116.1611938477 39.7283134103 fangshan
  georadius beijing 116.6875076294 39.8953822745 5000 m
  1、统计5000m范围内附近的位置取最远一个位置
  georadius beijing 116.6875076294 39.8953822745 50000 m COUNT 1 DESC ##ASC 当前位置最近的位置排序,当使用count类似limit
  2、统计5000m范围内附近的位置取最远一个位置相差的距离--withdist 当前位置相差的距离计算
  georadius beijing 116.6875076294 39.8953822745 50000 m COUNT 1 DESC withdist
  3、统计5000m范围内附近的位置并显示的经纬度信息 ---withcoord 显示经纬度
  georadius beijing 116.6875076294 39.8953822745 50000 m  DESC withcoord
  4、georadiusbymember 显示已添加的某个位置为中心点的距离多少范围内的信息。
  192.168.1.130:6379> georadiusbymember beijing shijingshan 5000 m
  1) "shijingshan"
  192.168.1.130:6379> georadiusbymember beijing shijingshan 50000 m
  1) "shijingshan"
  2) "tongzhou"
  3) "fangshan"
  4) "daxing"


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630110-1-1.html 上篇帖子: redis 主从的sentinel实现高可用 下篇帖子: zabbix redis监控
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表