分布式|老板让我实现附近人发现的功能,我用它实现了
Posted John_yyll
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式|老板让我实现附近人发现的功能,我用它实现了相关的知识,希望对你有一定的参考价值。
二、如何使用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非常大时,
建议按不同维度进行查分。
以上是关于分布式|老板让我实现附近人发现的功能,我用它实现了的主要内容,如果未能解决你的问题,请参考以下文章
老板发了我2千奖金,原因是我用Java实现了管理员可以修改任意用户Session的功能