核心知识点:

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

最新文章

  1. IIS设置默认主页无效
  2. iOS UIMenuController菜单
  3. 嵌入式Linux驱动学习之路(二十三)NAND FLASH驱动程序
  4. 百度地图API多个点聚合时,标注添加的标签label地图刷新就丢失的问题解决
  5. [51nod1515]明辨是非
  6. DataTable to byte[]、DataTable to XML(string)
  7. 【Leetcode】【Medium】Group Anagrams
  8. windows 程序设计自学:添加图标资源
  9. 找回使用过的QQ头像
  10. Cocos2d-JS中的文本菜单
  11. WordPress数据库中的表、字段、类型及说明
  12. 【架构师之路】依赖注入原理---IoC框架
  13. 在Mac上使用Nginx和FastCGI部署Flask应用
  14. PHP第一章学习——了解PHP(上)
  15. 怎样让你的安卓手机瞬间变Firefox os 畅玩firefox os 应用
  16. 广播,多播,IGMP:网际组管理协议
  17. AngularJS数据双向绑定
  18. ●BZOJ 1767 [Ceoi2009]harbingers
  19. 2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践
  20. ***远程连接MYSQL提示1130 - Host is not allowed to connect to this MySQL server

热门文章

  1. 【LeetCode-面试算法经典-Java实现】【139-Word Break(单词拆分)】
  2. POJ 3254 Corn Fields 状态压缩
  3. MAC - 命令行中用sublime打开指定文件,使用ln命令建立软链接
  4. hdfs笔记
  5. Win 8.1 安装后要做的优化
  6. 3、C++新的关键字
  7. sprint3 【每日scrum】 TD助手站立会议第二天
  8. C 语言学习 3
  9. bash学习记录
  10. animate和scrollTop的使用