从Redis3.2 版本以后,增加了地理位置 GEO 模块,这个模块提供了6个Geo指令,分别是geoadd、geodist、geopos、geohash、georadiusbymember及georadius,通过这个模块的这些命令,可以用来实现平时开发需求当中的“附近的什么什么”,例如即时通讯中附近的人、外卖中附近的餐馆、共享单车中附近的车等等。

地图元素的位置数据使用经纬度表示,经纬度是经度与纬度的合称组成一个坐标系统,称为地理坐标系统,它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统,能够标示地球上的任何一个位置。经度范围 (-180, 180],纬度范围 (-90, 90],纬度正负以赤道为界,北正南负,也是称为北纬和南纬,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负,也是称为东经和西经。

无论人或者物,我们存储这一个地理位置点的时候,会存储元素 id,、经度 x,、纬度 y,当我们用关系型数据库存储时,计算两点之间的距离时可以满足需求的,如果要是给定一点,算出该点附近的点,那么我们不可能通过遍历来计算所有的元素和目标元素的距离然后再进行排序,这个计算量太大了,性能指标肯定无法满足。临时的解决方法就是通过矩形区域来限定元素的数量,然后对区域内的元素进行全量距离计算再排序,这样可以明显减少计算量。但是数据库查询性能毕竟有限,如果附近的功能查询请求非常多,在高并发场合,这可能并不是一个很好的方案。

市场的需求,就是程序员努力提升自我能力的方向。IT界的解决方案,通常是层出不穷并且包罗万象,对于地理位置距离排序,通常用的算法是 GeoHash 算法,Redis 也使用 GeoHash 算法。GeoHash 算法将二维的经纬度数据映射到一维的整数,这样所有的元素都将在挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。当我们想要计算“附近的什么”时,首先将目标位置映射到这条线上,然后在这个一维的线上获取附近的点就行了。先来讲一讲Redis 的 Geo 指令基本使用:

1、geoadd:
语法:geoadd key longitude latitude member [longitude latitude member……]
功能:将给定的空间元素(维度、经度、名字)添加到指定的键里面
2、geopos
语法:geopos key member [member……]
功能:从键里面返回所有给定位置元素的位置(经度和维度)
3、geodist
语法:geodist key member1 member2 [unit]
功能:返回两个给定位置之间的距离
4、georadius
语法:georadius key longitude latitude radius m|km|gt|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
功能:以给定的经纬度为中心,返回键包含的位置元素当中,与中心的距离不超过给定最大距离的而所有位置元素。
选项:
WITHDIST:在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。
WITHCOORD:将位置元素的经度和纬度也一并返回。
WITHHASH:以52位有符号整数的形式,返回位置元素经过原始geohash编码的有序集合分值。这个选项主要用于底层应用或者调试,实际中的作用并不大。
ASC:根据中心的位置,按照从近到远的方式返回位置元素
DESC:根据中心的位置,按照从远到近的方式返回位置元素
5、georadiusbymember
语法:georadiusbymemeber key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
功能:这个命令和georadius命令一样,不同的是中心点是由给定的位置元素决定的
6、geohash
语法:geohash key member [member……]
功能:返回一个或多个位置元素的geohash表示

下面我们来实际操作一下,比如查询附近的公司,先来添加一些公司,可以使用百度的坐标拾取器来获取坐标点:

geodist 指令可以用来计算两个元素之间的距离,参数传集合名称、2 个名称和距离单位。

geopos 指令可以获取集合中任意元素的经纬度坐标,可以一次获取多个。

geohash 可以获取元素的经纬度编码字符串,上面已经提到,它是 base32 编码。 你可以使用这个编码值去 http://geohash.org/${hash} 中进行直接定位,它是 geohash 的标准编码值。

georadiusbymember 指令是最为关键的指令,它可以用来查询指定元素附近的其它元素,按照我们上面说的语法可以来查询附近的元素:

看来阿里离腾讯有些远呀!

除了 georadiusbymember 指令根据元素查询附近的元素,Redis 还提供了根据坐标值来查询附近的元素,这个指令更加有用,它可以根据用户的定位来计算“附近的什么”,这个指令就是georadius:

到此为止,我们介绍了Redis的GEO地理模块,也介绍了模块中的指令及使用,是不是可以满足需求中要开发“附近的什么”的功能了?

Redis中地理位置GEO模块,非常便捷的来查找附近的人或物相关推荐

  1. Geohash的原理介绍、Redis的Geo命令总结、Python使用Redis的Geo模块

    Geohash 一.GeoHash编码介绍 参考: https://hogwartsrico.github.io/2015/01/22/About-GeoHash/ Geohash原理 - 简书 (j ...

  2. redis 经纬度_Redis 中的 GEO(地理信息)类型

    Redis 中的 GEO(地理信息)类型 1 概述 2 GEOADD,添加成员的经纬度信息 3 GEODIST,计算成员间距离 4 GEORADIUS 基于经纬度坐标的范围查询 5 GEORADIUS ...

  3. Redis 中的发布/订阅功能

    发布/ 订阅系统 是 Web 系统中比较常用的一个功能.简单点说就是 发布者发布消息,订阅者接受消息,这有点类似于我们的报纸/ 杂志社之类的: 虽然可以使用一个 list 列表结构结合 lpush 和 ...

  4. python的re模块是自带的吗_python内置模块手册 python中的re模块是自带的吗

    python3有哪些内置模块 python内置模块无法调用,pycharm环境,怎么办 python内置模块无法调用,pycharm环境是设置错误造成的,解决方法为: 点击左上角的file菜单 在下拉 ...

  5. redis 经纬度_原来用Redis实现查找附近的人这么容易

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

  6. 实现类似微信中查找“附近的人”的功能!

    前几天收到一个新的需求,需要实现类似"附近的人"的功能:根据自己当前的定位,获取距离范围内的所有任务地点.刚看到这个需求时有点懵逼,第一想到的就是要利用地球的半径公式去计算距离,也 ...

  7. Redis(6)——GeoHash查找附近的人

    像微信 "附近的人",美团 "附近的餐厅",支付宝共享单车 "附近的车" 是怎么设计实现的呢? 一.使用数据库实现查找附近的人 我们都知道, ...

  8. 原来用Redis实现查找附近的人这么容易

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

  9. redis:地理位置信息geo

    简介 redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信息. 可以用来实现比如附近位置,摇一摇这类依附于地理位置的功能 GEO功能是 Redis 的另一位作者Matt Stanc ...

最新文章

  1. 黑马java教程是什么_Java教程:揭秘什么是面向接口编程
  2. Java 解惑(Java Puzzler)
  3. Spring Cloud 云架构下的微服务架构:部门微服务(Dept)
  4. bootstrap搜索框:click下拉展开改hover展开(两种代码)
  5. [wp7游戏]wp7~~超级血腥类游戏~~集合贴~~
  6. 几个常用的shell脚本
  7. Spring的9种设计模式(二)
  8. Java动态生成excel模板、和动态模板数据导出
  9. 汇编rep movsb,rep stosb,repne scasb
  10. Postgresql模糊查询插件pg_bigm安装
  11. 服务器Socket概述与实例
  12. 【教3妹学算法-每日3题(2)】分割字符串的最大得分
  13. hdu 2576 Queen Collisions
  14. 多线程&高并发(全网最新:面试题 + 导图 + 核心学习笔记)面试手稳心不慌,轻松拿下 offer,秋招跳槽必不可少的底层能力
  15. 如何实现跳转至QQ 或者QQ的加好友页面。
  16. c语言怎么返回数组,c++从函数返回数组的方法代码
  17. Nginx 反向代理https
  18. 常规计算机控制系统的控制过程,计算机过程控制系统
  19. android中自动翻译你看不懂的英文代码插件,让你实现在androistudio中学习英语!!
  20. Javascript常用的一些数据结构与算法

热门文章

  1. 申宝股票-市场指数窄幅震荡整理
  2. Android组件安全
  3. 2021最新 MySQL面试题精选(附刷题小程序)
  4. ​我的第三本译作《机器学习即服务》上架啦
  5. Mysql—忘记密码重置密码报错
  6. Zookeeper 安装配置(大数据工程师工作笔记)
  7. matlab heart scale,libsvm-3.18 heart_scale文件格式错误
  8. 八道简单入门编程题详解+拓展(水花仙,二进制序列……)
  9. java long 除_java中long型除法
  10. 根据当前时间获取当前周的周一到周日的日期