系列文章html
移动互联网时代LBS应用愈来愈多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等,那这种附近各类形形色色的XX是如何实现的呢,git
我么你都知道地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],只要咱们肯定一个点的经纬度就能够名曲他在地球的位置redis
例如打车,最直观的操做就是实时记录更新各个车的位置,而后去咱们要找车时,在数据库中查找距离咱们(坐标x0,y0)附近r千米的车辆,使用以下SQL便可:数据库
select cart from position where x0-r < x < x0+r and y0-r < y < y0+r
复制代码
可是这样会有什么问题呢?c#
今天咱们讲的是使用Redis来解决附近的问题。bash
Redis在3.2版本之后增长了地理位置的处理,其提供了6个地理位置相关的命令微信
geo add 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 指令能够获取集合中任意元素的经纬度坐标,能够一次获取多个。并发
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,分别表明米、公里、英里和尺。异步
127.0.0.1:6379> geodist city shanghai hangzhou km
"164.5694"
127.0.0.1:6379> geodist city beijing hangzhou km
"1122.7998"
复制代码
使用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"
复制代码
在给定如下可选项时, 命令会返回额外的信息:
可能你还注意到有一个命令GEOHASH
,那他是作什么的呢
127.0.0.1:6379> geohash city hangzhou
1) "wtmkq069cc0"
127.0.0.1:6379> geohash city beijing
1) "wx4fbxxfke0"
复制代码
返回的实际上是元素的经纬度通过goehash计算后的base32编码字符串。能够经过链接 geohash.org/${hash}中进行直… geohash 的标准编码值。
其存储结构主要使用的是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"
复制代码
其原理比较容易理解,核心思想就是将球体转换为球面,区块转换为一点
主要分为三步
详细原理解析能够参考这边文章GeoHash核心原理解析
目前不少数据存储引擎都支持Geo的处理,如MongoDB、MySql、PgSql、Elasticsearch等。感兴趣的读者能够去研究一下。
本文亦在微信公众号【小道资讯】发布,欢迎扫码关注!