移动互联网时代LBS应用愈来愈多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等,那这种附近各类形形色色的XX是如何实现的呢git
我么你都知道地球上的地理位置是使用二维的经纬度表示,经度范围 (-180, 180),纬度范围 (-90, 90),只要咱们肯定一个点的经纬度就能够明确在地球上的位置。redis
redis3.2版本新增的一个功能就是对GEO(地理位置)的支持。编码
地理位置大概提供了6个命令,分别为:.net
将给定的空间元素(纬度、经度、名字)添加到指定的键里面调试
GEOADD key longitude latitude member [longitude latitude member …]code
# 如添加杭州北京上海的地理位置 127.0.0.1:6379> geoadd city 120.20000 30.26667 hangzhou 116.41667 39.91667 beijing 121.47 31.23 shanghai
从键里面返回全部给定位置元素的位置(经度和纬度),能够获取集合中任意元素的经纬度坐标,能够一次获取多个blog
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
默认使用米做为单位。ci
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 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的做用并不大。返回的实际上是元素的经纬度通过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"
其原理比较容易理解,核心思想就是将球体转换为球面,区块转换为一点
主要分为三步
详细原理解析能够参考这边文章GeoHash核心原理解析
目前不少数据存储引擎都支持Geo的处理,如MongoDB、MySql、PgSql、Elasticsearch等等。