redis 经纬度_如何使用redis实现附近人的功能

d38269da94d14580341634ef58106221.png点击上方蓝字关注我们  文末有惊喜哦    

86d7d786700f7b35eeb36af91cb9190e.png

如何理解?

当两个元素相距不是很远,可以直接用勾股定理就能算出元素之间的距离,但是当我们的坐标是经纬度这种数据时,使用勾股定理就不容易计算了,那么如何计算两个经纬度之间的距离呢?如何筛选附近的人呢?

假如我们现在想要获取(x0,y0)坐标 附近为r的元素,可以这样去查询:select id from pos where x0-r < x 但是把所有数据全部放到数据库中,肯定不是很好的解决方案,量大了就无法使用了。业界比较通用的计算距离的方法是geohsh算法,刚好redis也支持这种算法

dbbc5c8d1fc692ee13a9281be5d5718a.gif

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认真读一本书

按照惯例,文末必推一本书,这本书我也买过纸质书,本系列所有内容都是围绕本书结合自身学习进行总结归纳的。

b23a1e337e50dee3883d36e3a7ae947b.png 0d2870bfe70d8abe2584920e87b78ed2.png 如果需要电子版,也可以关注公众号“乐哉开讲“,后台点击“干货领取“。「当然,写书不易,条件允许的话,还请支持正版。」
作者:乐哉 图片:来源于网络,如有侵权,联系删除。

免费技术干货/经验分享

9dd303b145a4051035cbe7669d2d979b.png

乐哉开讲 一个努力成为全栈大佬的小学生

往期推荐

学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?

聊完AQS,面试官为何对我竖起大拇指?

跟着“乐哉”学习并发编程系列教程-搞懂线程池原理

现在学习Redis还来得及么(1)

跟着“乐哉”学习并发编程系列教程-彻底搞懂volatile

902696ccbe7e4601db04a19a44d32136.png

点个赞,证明你还爱我

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值