知识养成了思想,思想同时又在融化知识。这篇文章主要讲述分布式|老板让我实现附近人发现的功能,我用它实现了相关的知识,希望能为你提供帮助。
二、如何使用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非常大时,
建议按不同维度进行查分。
推荐阅读
- 接入第三方|接入声网灵动课堂 流程图
- 路由基础学习笔记之MPLS基本概念
- 一分钟上手SpringBootTest
- 分布式|你有了解过redis过期策略么?
- ABAP RSA方式调用银行API
- 分布式|单线程的redis为何如此快()
- 从Excel批量导入数据说到ForkJoin的原理
- 分布式|《SpringCloud 微服务实战 》 第1章(基础知识)
- Redis sort排序指令