首页 > 其他分享 >【附近的人】实现方案

【附近的人】实现方案

时间:2022-10-24 23:44:05浏览次数:76  
标签:方案 实现 位置 距离 对象 180 给定 PI 附近

【附近的人】实现方案

方案一:Redis Commands: Geography Edition

自Redis 3.2开始,Redis基于geohash和有序集合提供了地理位置相关功能。Redis Geo模块包含了以下6个命令:

  • GEOADD: 将给定的位置对象(纬度、经度、名字)添加到指定的key;

  • GEOPOS: 从key里面返回所有给定位置对象的位置(经度和纬度);

  • GEODIST: 返回两个给定位置之间的距离;

  • GEOHASH: 返回一个或多个位置对象的Geohash表示;

  • GEORADIUS: 以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象;

  • GEORADIUSBYMEMBER: 以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。

  • GEOSEARCH: 此命令代替现在6.2已弃用的GEORADIUSand GEORADIUSBYMEMBER

其中,组合使用GEOADD和GEORADIUS可实现“附近的人”中“增”和“查”的基本功能。要实现微信中“附近的人”功能,可直接使用GEORADIUSBYMEMBER命令。其中“给定的位置对象”即为用户本人,搜索的对象为其他用户。不过本质上,GEORADIUSBYMEMBER = GEOPOS + GEORADIUS,即先查找用户位置再通过该位置搜索附近满足位置相互距离条件的其他用户对象。

优点:   效率高,API丰富。
缺点: 维护需要对API有一定的熟悉度,数据流程的可理解性相对数据库差。如果需要查询其他业务数据需要做 in 操作。

方案二:Elasticsearch GEO

ES提供了很多地理位置的搜索方式 :

geo_bounding_box: 找出落在指定矩形框中的点。

geo_distance: 找出与指定位置在给定距离内的点。

geo_distance_range: 找出与指定点距离在给定最小距离和最大距离之间的点。

优点:  天然支持,性能很优。
缺点:需要投入时间研究一下特性,以及存储,对后续维护人员有一定要求。如果需要查询其他业务数据需要做 in 操作。

方案三:Mysql :Sql 直接进行计算

SELECT *, 6378.138 * 2 * ASIN( SQRT( POW( SIN( ( 40.0497810000 * PI() / 180 - lat * PI() / 180 ) / 2 ), 2 ) + COS(40.0497810000 * PI() / 180) * COS(lat * PI() / 180) * POW( SIN( ( 116.3424590000 * PI() / 180 - lon * PI() / 180 ) / 2 ), 2 ) ) ) AS juli FROM customer ORDER BY juli ASC

优点:  开发简单,维护容易。
缺点:不走索引,当数据量达到一定程度,需要进行优化。

方案四:Mysql :GeoHash 函数(需要升级到mysql 5.7)

优点:   函数直接调用,生成目标hash、根据hash获取经纬度。可以直接连表查询业务数据。
缺点:不支持范围查询函数,需要自行处理周边8点的问题,需要补充geo的算法。

标签:方案,实现,位置,距离,对象,180,给定,PI,附近
From: https://www.cnblogs.com/gronbu1/p/16823494.html

相关文章

  • HotSpot的算法实现
    枚举根节点由于目前的主流Java虚拟机使用的都是准确式GC,当执行系统停顿下来后,并不需要一个不漏地检查完所有执行上下文和全局的引用位置,虚拟机应当是有办法直接得知哪些地......
  • Python实现常量
    目录Python实现常量一、概述二、实现1、单例模式1.1元类1.2装饰器1.3魔法方法2、常量类三、打包Python实现常量一、概述很多高级编程语言都提供了定义常量的方......
  • JWT鉴权如何实现
    如何实现jwt鉴权机制?JWT(JSONWebToken),本质就是一个字符串书写规范,作用是用来在用户和服务器之间传递安全可靠的信息为什么需要token在后台管理系统中,我们通常使用cook......
  • react是如何实现事件代理的
    _版本:v18.2.0本文为我花了大半年的时间潜心研究所写,转载请注明出处,谢谢react是如何实现事件代理的createRoot函数**用户在index.tsx中执行ReactDOM.createRoot创建roo......
  • 利用一个字符数组作函数参数,实现字符串(最大长度为80个字符 )的逆序存放。
    利用一个字符数组作函数参数,实现字符串(最大长度为80个字符)的逆序存放。要求如下:(1)在子函数Inverse中实现字符串的逆序存放。函数原型为:voidInverse(charstr[]);(2......
  • 利用inotify和rsync服务实现数据实时同步
    文件定时同步的实现:利用rsync结合cron计划任务实现:rsync-av--delete/data/10.0.0.12:/back-a:保留文件属性-v:显示过程-delete:如果源文件没有的,目标文件里面有,就......
  • 【基于hutool工具类封装雪花算法实现的工具类】
    importcn.hutool.core.lang.Snowflake;importcn.hutool.core.util.IdUtil;/***基于hutool工具类封装雪花算法实现的工具类*@author*@date2022年5月20日16:56:21*......
  • 基于ssm工商学院办公用品管理信息系统设计与实现-计算机毕业设计源码+LW文档
    摘 要本高校科研管理系统设计目标是实现高校科研管理的信息化管理,提高管理效率,使得高校科研管理工作规范化、科学化、高效化。本文研究的高校科研管理系统基于SSM架构,采......
  • 因为使用的是ip v6方案,导致Whatsapp筛号软件刷新不出解决方法
    一般Windows10系统是支持IPV6协议,有些用户连接的网络是IPV4协议,对于我们个人来说,这个几乎是用不到IPV6。而且开启IPV6协议会造成开机卡慢、未响应的假死现象。有什么好办法......
  • springboot整合elasticsearch实现MySQL模糊查询
    es关联mysql实现模糊查询的数据流:   1、使用logstash同步mysql数据到eslogstash简介及基本操作:https://blog.csdn.net/yurun_house/article/details/109025588win......