点击上方蓝字关注我们 文末有惊喜哦
当两个元素相距不是很远,可以直接用勾股定理就能算出元素之间的距离,但是当我们的坐标是经纬度这种数据时,使用勾股定理就不容易计算了,那么如何计算两个经纬度之间的距离呢?如何筛选附近的人呢?
假如我们现在想要获取(x0,y0)坐标 附近为r的元素,可以这样去查询:select id from pos where x0-r < x 但是把所有数据全部放到数据库中,肯定不是很好的解决方案,量大了就无法使用了。业界比较通用的计算距离的方法是geohsh算法,刚好redis也支持这种算法
在redis中,geo将二维经纬度使用52位的整数进行编码,然后放入zset集合中,zset的value是key,scroe存储的是52位的整数值,然后通过score排序,算出附近的人。
基本指令添加位置信息
geoadd anhuiprovince 117.283043 31.861191 hefei
geoadd anhuiprovince 117.043549 30.508829 anqing
geoadd anhuiprovince 117.489159 30.656036 chizhou
geoadd anhuiprovince 118.317322 29.709238 huangshan
删除位置信息
zrem anhuiprovince hefei anqing
获取元素间的距离
# km,m ,ml,ft 代表距离单位
geodist anhuiprovince anqing hefei km[m,ml,ft]
获取某个元素的未知
geopos anhuiprovince hefei
获取元素hash值
geohash anhuiprovince hefei
获取附近的元素
georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] [STOREDIST key]
#示例 距离安庆152km的最多4个元素 升序排序
georadiusbymember anhuiprovince anqing 152 km count 4 asc
※:单个key一般都很大,一般部署geo的redis不建议做集群,key迁移时会很耗时间,另外当单个key非常大时,建议按不同维度进行查分。
![b55543ba644027b414b7e8d0c1dc14f1.png](https://i-blog.csdnimg.cn/blog_migrate/702c2195d3ddba445f6679d407c8a4ca.png)
按照惯例,文末必推一本书,这本书我也买过纸质书,本系列所有内容都是围绕本书结合自身学习进行总结归纳的。
![b23a1e337e50dee3883d36e3a7ae947b.png](https://i-blog.csdnimg.cn/blog_migrate/bca42a1af8a37c7461961d0038ff2154.jpeg)
![0d2870bfe70d8abe2584920e87b78ed2.png](https://i-blog.csdnimg.cn/blog_migrate/36d6dce8544a56271fa194bb53c00fad.png)
作者:乐哉 图片:来源于网络,如有侵权,联系删除。
免费技术干货/经验分享
往期推荐
学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?
聊完AQS,面试官为何对我竖起大拇指?
跟着“乐哉”学习并发编程系列教程-搞懂线程池原理
现在学习Redis还来得及么(1)
跟着“乐哉”学习并发编程系列教程-彻底搞懂volatile
点个赞,证明你还爱我