资讯专栏INFORMATION COLUMN

【redis专题(10)】命令语法介绍之GEO

BicycleWarrior / 1122人阅读

摘要:获取指定元素范围的地理信息位置集合使用命令即可查询附近的位置例如查找距离杭州以内的城市的个城市按距离排序在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。距离的单位和用户给定的范围单位保持一致。

简述

移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等,那这种附近各种形形色色的XX是如何实现的呢

我么你都知道地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180),纬度范围 (-90, 90),只要我们确定一个点的经纬度就可以明确在地球上的位置。

redis3.2版本新增的一个功能就是对GEO(地理位置)的支持。

地理位置大概提供了6个命令,分别为:

GEOADD

GEODIST

GEOHASH

GEOPOS

GEORADIUS

GEORADIUSBYMEMBER

使用 添加地理位置

将给定的空间元素(纬度、经度、名字)添加到指定的键里面

GEOADD key longitude latitude member [longitude latitude member …]

# 如添加杭州北京上海的地理位置  
127.0.0.1:6379> geoadd city 120.20000 30.26667 hangzhou 116.41667 39.91667 beijing 121.47 31.23 shanghai
获取地理位置信息

从键里面返回所有给定位置元素的位置(经度和纬度),可以获取集合中任意元素的经纬度坐标,可以一次获取多个

GEOPOS key member [member …]

127.0.0.1:6379> geopos city hangzhou beijing shanghai  
1) 1) "120.15000075101852417"  
2) "30.2800007575645509"  
2) 1) "116.39999896287918091"  
2) "39.90000009167092543"  
3) 1) "121.47000163793563843"  
2) "31.22999903975783553"  
127.0.0.1:6379> geopos city hangzhou  
1) 1) "120.15000075101852417"  
2) "30.2800007575645509"
计算距离

距离单位可以是 m、km、ml、ft,分别代表米、千米、英里和尺。如果用户没有显式地指定单位参数, 那么GEODIST默认使用米作为单位。

GEODIST key member1 member2 [unit]

127.0.0.1:6379> geodist city shanghai hangzhou km  
"164.5694"  
127.0.0.1:6379> geodist city beijing hangzhou km  
"1122.7998"
[info] GEODIST命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。
获取指定元素范围的地理信息位置集合

使用GEORADIUSBYMEMBER命令即可查询附近的位置

GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]

# 例如查找距离杭州300km以内的城市的10个城市按距离排序  

127.0.0.1:6379> GEORADIUSBYMEMBER city hangzhou 300 km WITHCOORD WITHDIST WITHHASH ASC COUNT 10  
1) 1) "hangzhou"  
2) "0.0000"  
3) (integer) 4054134257390783  
4) 1) "120.15000075101852417"  
2) "30.2800007575645509"  
2) 1) "shanghai"  
2) "164.5694"  
3) (integer) 4054803462927619  
4) 1) "121.47000163793563843"  
2) "31.22999903975783553"

WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。

WITHCOORD: 将位置元素的经度和维度也一并返回。

WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

获取元素的 hash 值

返回的其实是元素的经纬度经过goehash计算后的base32编码字符串。可以通过连接 http://geohash.org/${hash}中进行直接定位,它是 geohash 的标准编码值。

127.0.0.1:6379> geohash city hangzhou  
1) "wtmkq069cc0"  
127.0.0.1:6379> geohash city beijing  
1) "wx4fbxxfke0"
原理 存储结构

其存储结构主要使用的是Redis的有序结构,其score是GeoHash的52位整数值

127.0.0.1:6379> ZRANGE city 0 -1 WITHSCORES  
1) "hangzhou"  
2) "4054134257390783"  
3) "shanghai"  
4) "4054803462927619"  
5) "beijing"  
6) "4069885360207904"
原理

其原理比较容易理解,核心思想就是将球体转换为球面,区块转换为一点

主要分为三步

将三维的地球变为二维的坐标

在将二维的坐标转换为一维的点块, 并进行标记

最后将一维的点块转换为二进制在通过base32编码(比如wtmkq069cc0)

在标记的点块中找到w块,在w块中找到t块,在t块中找到m块.....

详细原理解析可以参考这边文章GeoHash核心原理解析

其他Geo处理

目前很多数据存储引擎都支持Geo的处理,如MongoDB、MySql、PgSql、Elasticsearch等等。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37261.html

相关文章

  • redis专题(2)】命令语法介绍string

    摘要:当不存在时,返回一个错误。,对给定求逻辑非,并将结果保存到。空字符空格求逻辑或注意对于操作不能多个查返回的。通配任意多个字符包括没有如和等。通配括号内的某个字符如和,但不匹配。 REDIS有6大数据结构:string,link,sortedset,sets,hash,Geo。 这6个结构我将用6篇文章来记录各自是怎么用的,然后再用一篇文章来说一下各自的应用场景; string 增 se...

    laoLiueizo 评论0 收藏0
  • redis专题(2)】命令语法介绍string

    摘要:当不存在时,返回一个错误。,对给定求逻辑非,并将结果保存到。空字符空格求逻辑或注意对于操作不能多个查返回的。通配任意多个字符包括没有如和等。通配括号内的某个字符如和,但不匹配。 REDIS有6大数据结构:string,link,sortedset,sets,hash,Geo。 这6个结构我将用6篇文章来记录各自是怎么用的,然后再用一篇文章来说一下各自的应用场景; string 增 se...

    luffyZh 评论0 收藏0
  • redis专题(4)】命令语法介绍sorted_set

    摘要:如果中不存在,就在中添加一个,是就好像它之前的是。如果不存在,就创建一个只含有指定成员的有序集合。 有序集合可以模拟优先级队列与延时队列,排行榜等功能的实现 增 zadd key score1 value1 score2 value2 .. redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lilei 21 lilei (integer...

    Astrian 评论0 收藏0
  • redis专题(8)】命令语法介绍通用KEY

    摘要:通配任意多个字符包括没有如和等。通配括号内的某个字符如和,但不匹配。查询的生命周期默认永久有效单位秒数如果为单位就变为毫秒不让失效从当前数据库中随机返回不删除一个。 基础命令 select num 数据库选择 默认有16[0到15]个数据库,默认自动选择0号数据库 move key num 移动key到num服务器 del key [key ...] 删除给定的一个或多个 ke...

    elina 评论0 收藏0
  • redis专题(7)】命令语法介绍Pub/Sub

    摘要:主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。订阅者可以通过和命令向订阅自己感兴趣的消息类型,将消息类型称为通道。当发布者通过命令向发送特定类型的消息时。将信息发送到指定的频道。 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和...

    DevTTL 评论0 收藏0

发表评论

0条评论

BicycleWarrior

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<