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

知识养成了思想,思想同时又在融化知识。这篇文章主要讲述分布式|老板让我实现附近人发现的功能,我用它实现了相关的知识,希望能为你提供帮助。
二、如何使用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非常大时,
建议按不同维度进行查分。




    推荐阅读