前言:
大家好我是小面~今天给大家带来的主题是:
每当星期四,是不是群里一直流传着:想要搞大我肚子吗?v我50,请我去吃肯德基。
不过小面这边v不了你50,但小面可以教你如何用redis去看你离KFC有多远!
正文:
Redis中命令应用:
进入正题,用redis实现地理位置信息,我们可以使用redis(3.2版本以上支持)中的GeoHash的结构去实现。首先我们先看一下geohash的命令与使用:
//我们先添加一下我们的地址,以及kfc的地址。 // GEOADD: 将给定的位置对象(纬度、经度、名字)添加到指定的key; GEOADD location 111 23 myhome (小面随机选的深圳的地址) GEOADD location 112 25 KFC (小面随机选的深圳的随机KFC地址地址) //想要查看我们添加的地址的经纬度 // GEOPOS: 从key⾥⾯返回所有给定位置对象的位置(经度和纬度); GEOPOS location myhome GEOPOS location KFC //查看我们和kfc的距离 // GEODIST: 返回两个给定位置之间的距离; GEODIST location myhome KFC (此处可以添加距离参数,不添加默认m,可以是km,mi) //查看以我们的地址为中心,给一个半径内的位置 // GEORADIUS: 以给定的经纬度为中⼼,返回⽬标集合中与中⼼的距离不超过给定最⼤距离的所有位置对象; // GEORADIUSBYMEMBER: 以给定的位置对象为中⼼,返回与其距离不超过给定最⼤距离的所有位置对象。 GEORADIUS location 经度 维度 距离 单位长度 //查看位置的geohash值 // GEOHASH: 返回⼀个或多个位置对象的Geohash表⽰; GEOHASH location myhome (此处分享两个网站,可以在线查询geohash值) (http://geohash.gofreerange.com) (http://www.geohash.cn)
这样子,我们就可以通过redis查看我们与kfc的距离,经纬度,geohash值。
Redis GEOHASH原理:
GEOHASH原理讲述:
GeoHash本质上是一串字符串,他经过经纬度的转换计算得出的一串字符串,并且在一定范围内(可以把地图看成一个个矩形组成)的字符串是相同的。在同一个矩形内的geohash值 是相同的。
这样子是为了只表示大概的一个区域,并不是特别具体精确的一个点。假设此时我们想要查询我们的住址的geohash ,假设是abc01,在abc01区域内有很多的小区,我们 把geohash值作为key,然后在这个abc01的区域内的各种场所作为value 进行缓存。这就很方便缓存了,换做是普通我们根据经纬度计算的话,那缓存起来的内容非常的多了。
geohash还有一个特性,那就是字符串越长的话,范围就越小,位置就越精确。同时如果字符串越相似,那说明二者区域越相近。
GEOHASH计算方法:
geohash值的计算方法有点和二分的思想类似。我们地球得到经纬度的范围是[-90,90], kfc的纬度是25,然后我们就可以下面锁展示的方法对纬度25进行编码:
我们把地球的维度区间进行二分,分为[-90,0),[0,90],而此时kfc的维度是25,那么是在右区间,我们标记为1。
同理我们再把[0,90]使用二分法分为 [0,45),[45,90],此时我们就认为25属于左区间,给标记为0;
同理我们再把[0,45)使用二分法分为为 [0,22.5),[22.5,45],我们就认为25属于右区间,标记为1;
同理我们再把[22.5,45]使用二分法分为为 [22.5,28.75),[28.75,45],我们就认为25属于左区间,标记为0;
同理我们再把[22.5,28.75)使用二分法分为为 [22.5,25.625),[25.625,28.75],我们就认为25属于左区间,标记为0;
同理我们再把[22.5,25.625)使用二分法分为为 [22.5,24.0625),[24.0625,25.625],我们就认为25属于右区间,标记为1;
………………以此类推,我们就计算到此处。kfc维度的计算结果为101001,经度的计算结果为110011 合并:此时我们就做合并操作,我们把经度放在偶数位置上,纬度放在奇数位置上,用这样子的方法去组成新的字符串,最终得到:110110000111。
最后我们把我们生成的字符串110110000111转换成十进制,所得的base32编码就是最后的geohash值。
Geohash能实现什么功能?
地图导航;各种地图app 附近功能;附近商铺,附近的好友 定位信息
总结
5分钟教你用redis看你与kfc的距离,你会了吗?
我是小面,感谢各位人才的:点赞、收藏和评论,我们下期更精彩!