当前位置:首页 > 服务端 > 分布式|老板让我实现附近人发现的功能,我用它实现了

分布式|老板让我实现附近人发现的功能,我用它实现了

二、如何使用redis实现附近的人的功能

当两个元素相距不是很远,可以直接用勾股定理就能算的元素之间的距离,但是当我们的坐标是经纬度这种数据时,使用勾股定理就不容易计算了,那么如何计算两个经纬度之间的距离呢,筛选附近的人呢?假如我们现在想要获取(x0,y0)坐标 附近为r的元素,可以这样去查询:
select id from pos where x0-r < x <x0+r and y0-r <y <y0+r
但是把所有数据全部放到数据库中,肯定不是很好的解决方案,量大了就无法使用了。业界比较通用的计算距离的方法是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
    

※:单个一般都很大,一般部署geo的redis不建议做集群,key迁移时会很耗时间,另外当单个key非常大时,
建议按不同维度进行查分。

作者:乐哥聊编程
来源链接:https://lglbc.blog.csdn.net/article/details/108290585

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/10466.html

分享给朋友:

“分布式|老板让我实现附近人发现的功能,我用它实现了” 的相关文章