核心知识点:

1.GEO是利用zset来存储地理位置信息,可以用来计算地理位置之间的距离,也可以做统计;

2.命令:geoadd geopos geodist geohash georadius/georadiusbymember;

3.geohash字符串越长越精准,字符串越相近距离越近。

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

摇一摇这类依赖于地理位置信息的功能,对于需要实现这些功能的开发者来说是一大福音。

GEO功能是Redis的另一位作者Matt Stancliff借鉴NoSQL数据库Ardb实现的,Ardb的作者来自中国,它提供了优秀的GEO功能。

使用GEO的主要命令如下:

1.增加地理位置信息

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

longitude、latitude、member分别是该地理位置的经度、纬度、成员。本篇文章以下表的5个城市为例:

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

返回的结果代表添加成功的个数,如果返回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

2.获取地理位置信息

geopos key member [member ...]

获取地理位置信息:

127.0.0.1:6379> geopos cities:locations tianjin
1) 1) "117.12000042200088501"
2) "39.0800000535766543"

3.获取两个地理位置的距离

geodist key member1 member2 [unit]

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

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

下面结算北京到天津的距离,并以公里为单位:

127.0.0.1:6379> geodist cities:locations beijing tianjin km
"89.2061"

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

georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [COUNT count] [asc|desc] [store key] [storedist key]

georadiusbymember key member radiusm 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;
  • COUNT count:指定返回结果的数量;
  • asc|desc:指定结果按照离中心节点的距离做升序或者降序;
  • store key:将返回结果的地理位置信息保存到指定键;
  • storedist key:将返回结果离中心离中心节点的距离保存到指定键。
127.0.0.1:6379> georadiusbymember cities:locations beijing 100 km  #距离北京100km内的城市
1) "beijing"
2) "tianjin"

5.获取geohash 

geohash key member [member ... ]

Redis使用geohash将二维经纬度转换为一维字符串:

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

geohash有如下特点:

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

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

6.删除地理位置信息

zrem key member

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

127.0.0.1:6379> zrem cities:locations tangshan
(integer) 1

GEO(地理信息定位)的更多相关文章

  1. php使用redis的GEO地理信息类型

    redis3.2中增中了对GEO类型的支持,该类型存储经纬度,提供了经纬设置,查询,范围查询,距离查询,经纬度hash等操作. <?php $redis = new Redis(); $redi ...

  2. 走进 Redis 的世界

    NoSQL(Not Only SQL) 在现今已经应用非常普遍了,尤其是 Redis 和 MongoDB.我们现在来说说 Redis. 前世 Redis 是一个意大利人 Salvatore Sanfi ...

  3. Redis 学习-Redis 的其他功能

    一.慢查询 找到 系统中瓶颈的命令 1. 客户端请求的生命周期: ①. 慢查询通常发生在第三阶段. ②. 客户端超时不一定是慢查询,但慢查询是客户端超时的一个可能因素. 2. 相关配置 慢查询命令会存 ...

  4. Redis的高级特性一览

    更多内容,欢迎关注微信公众号:全菜工程师小辉.公众号回复关键词,领取免费学习资料. 应用场景 缓存系统:用于缓解数据库的高并发压力 计数器:使用Redis原子操作,用于社交网络的转发数,评论数,粉丝数 ...

  5. Redis 入门到分布式 (四) 瑞士军刀Redis其他功能

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 目录: 慢查询 Pipeline 发布订阅 Bitmap(位图) HyperLogLog GEO 一.慢 ...

  6. Java 面试知识点【背诵版 240题 约7w字】

    -- 转载自牛客网 是瑶瑶公主吖 Java 基础 40 语言特性 12 Q1:Java 语言的优点? ① 平台无关性,摆脱硬件束缚,"一次编写,到处运行". ② 相对安全的内存管理 ...

  7. 1.初识Redis

    作者 微信:tangy8080 电子邮箱:914661180@qq.com 更新时间:2019-08-14 20:35:36 星期三 欢迎您订阅和分享我的订阅号,订阅号内会不定期分享一些我自己学习过程 ...

  8. Redis 学习笔记(一)redis 数据类型和对象机制

    Redis 简介 Redis 是(key-value)的 NoSQL 数据库,所有的 key 都是 String ,它的 value 可以是 String.hash.list.set.zset(有序集 ...

  9. Redis GEO 功能使用场景

    本文来源:https://www.dazhuanlan.com/2020/02/05/5e3a0a3110649/ 背景 前段时间自己在做附近直播相关业务,其中有一个核心的点就是检索用户附近的主播,也 ...

随机推荐

  1. iOS进行单元测试OCUnit+xctool

    单元测试 什么是单元测试 wiki解释 简单说来就是为你的方法多专门写一个测试函数.以保证你的方法在不停的修改开发中.保持正确.如果出错,第一时间让你知道,这样从最小单位开始监控来保证软件的质量. 我 ...

  2. GIS可视化——属性图

    一.简介 SuperMap iClient for JavaScript 提供了UTFGrid图层(属性图),用于客户端属性信息的快速交互. UTFGrid图层从UTFGrid切片数据源读取数据,其本 ...

  3. es6 - 箭头

    class User { constructor(name, age) { this.name = name; this.age = age; } changeName(name) { this.na ...

  4. vue prop单向数据流

    Prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是反过来不会.这是为了防止子组件无意间修改了父组件的状态,来避免应用的数据流变得难以理解. 另外,每次父组件更新时,子组件的所有 pro ...

  5. java equals与==区别

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  6. Java 加载器

    类的加载是由类加载器完成的,类加载器包括: 根加载器( BootStrap ).扩展加载器( Extension ).系统加载器( System )和用户自定义类加载器( java.lang.Clas ...

  7. Apc缓存Opcode(转)

    1.PHP执行 PHP的运行阶段也分成三个阶段: Parse.语法分析阶段. Compile.编译产出opcode中间码. Execute.运行,动态运行进行输出.                   ...

  8. vue proxyTable

    Vue-cli proxyTable 解决开发环境的跨域问题 字数474 阅读1685 评论1 喜欢3 和后端联调时总是会面对恼人的跨域问题,最近基于Vue开发项目时也遇到了这个问题,两边各自想了一堆 ...

  9. ubuntu下matlab的无界面启动---命令行操作

    命令行下运行 Matlab 及 函数 首先参考命令行下matlab的运行参数的定义与作用:http://www.cnblogs.com/beanocean/p/3677404.html 创建示例程序: ...

  10. 使用Chrome(PC)调试移动设备上的网页

    最早开始调试移动端网页时,本人都是采取PC上改几行代码,手机上刷新一下看效果这种笨方法来开发的,效率低而且容易让人抓狂.最近偶然发现原来可以使用PC上的浏览器来调试移动设备,不由得感叹相逢恨晚. 工具 ...