我们知道在移动互联网时代,各种如打车、交友等APP软件都有一个查找定位附近的人的功能,但是对于我们程序开发员来说怎样能快速高效的实现这个功能?深圳APP开发公司本文就这个问题分享我们工程师日常的开发经验。我们知道LBS主要用于查找附近的人(或者某个事物),其常见的使用情景如图9-32所示。
查找附近的人在程序中的处理流程是:数据库的用户信息中有个地理坐标字段,己知某个用户的地理坐标,把这个坐标定范围内(例如500米内)的其他地理坐标找出来。APP开发公司下面介绍3种实现查找附近的人的方案:
1.MySQL的空间数据库解决方案
从MySQL 4.1开始就引入了系列空间扩展,使其具备了定的空间处理能力
简单点来说,就是MySQL已经可以把地理坐标的数据当成种独立的数据类型,而且提供了相关的空间函数(例如查找个矩形范围内
的坐标)给开发者直接调用。
2.geohash解决方案
geohash编码,就是通过算法把地理坐标转换成个值,简单点来说就是把二维坐标转换成一个字符串,但这个字符串并不是毫无意义。
geohash有以下的特点。
(1) geohash把地理坐标转换为字符串
如图9-33所示,展示了“国家数字家庭应用示范产业基地”的地图
在上图中,“国家数字家庭应用示范产业基地”从地图上得到的坐标是“113. 39175.23.061784”,这个坐标同时也可以用geohash值“wsOehq32ekOu”表示。用geohash值表示坐标有以下两个好处。
·避免泄露用户的真实坐标,保护隐私(虽然国内用户并不看重这个问题)。
·geohash值是个字符串,方便缓存。在下面会提到一个案例用缓存geohash值来快速搜索。如果使用坐标值就不方便缓存
(2)坐标的geohash值越相似,意味着距离越相近
(3) geohash值越长,表示的范围越精确。如表9-5所示,展示Tgeohash值的长度和相应的表示范围的关系
从上表可看出,当geohash值的长度为6时,对应坐标的距离大约是相距0.61千米,“查找附近的人”这个功能平常就查找l公里范围内,按照geohash值的长度为6查找就差不多。
但是使用geohash查找附近的人需要注意如图9-34所示的例子。
在图9-34中用geohash查找a点附近的点时,由于a和b是在同到a点的距离和b点到a点的距离差不多,为了取得更精确的结果,一个区域内,根据geohash算法认为a附近只有b。但在图9-34上可看到,c点除了取目标点的geohash值外,还需要使用a点周围8个区域的geohash值。
基于geohash值是字符串的特性,查找附近坐标的时候用SQL中模糊查询LIKE“wsOehh%”查找geohash值“wsOehh”附近的所有地点非常方便。
APP开发公司的程序员早期做过的产品中,有一个需求是查找用户附近的商铺(包含关键字)商铺的数据有130多万,全放存放在MySQL中,发现用MySQL
LIKE“wsOehh%”这种方式检索geohash值性能瓶颈很大,检索130万行的数据,平均花费了8秒,这种响应速度在生产环境中是无法忍受的。后来经过不断优化,确定了CoreSeek+Redis+MvSQL的解决方案,一下子就把响应速度减少到可接受的程度,这个方案的如下
·用每个商铺的坐标值转换为geohash,用geohash作为Key,商铺的id作为Value.存储在Redis的set结合中。
·根据用户的坐标计算geohash,在Redis中用“keys*“的方法匹配查找用户附近的商铺geohash (geohash的特点是geohash编码的前缀可
以表示个区域),获得商铺id。例如,用户坐标的geohash值是“wsOehh“,在Redis中使用“wsOehh*“搜索前缓为“wsOehh“的Key,
根据Key获取Rset集合中保存的商铺id。
·把商铺id作为附加筛选条件,再加上主条件(例如商品的名称关键字)在CoreSeek中继续查找相应的数据。
注意:这个方案的性能最终受限于Redis的读取速度,由于Redis的“*”号操作是遍历Redis中的所有Key,当Redis中的Key到迭一定的规模后响应速度会要慢,现在更推荐使用MongoDB来解决LBS问题。
3.MongoDB解决方案
MongoDB的一大亮点是封装了大量的地理位置操作,全球流行的LBS服务“Foursquare”、国内著名的打车App“快的”也曾经使用MongoDB的地理位置查询功能。
关于MougoDB处理LBS的原理和常用操作,请查阅本站前面“APP开发功能之LBS”。
使用MongoDB开发LBS服务有以下的优点
·MongoDB自身的性能高,更新、查询的速度快。
·通过副本集、分片等方法,很容易实DhlMongoDB的分布式部署,解决性能瓶颈。
. MongoDB己在App后台中广泛使用,很多开发者对开发部署MongoDB比较熟悉,减少运维成本。MongoDB可支持下面的地理位置查找。
·查询多边形范围的坐标。
·查询附近的坐标。
·查询圆形区域内的坐标。
好了,APP开发公司本文关于超找附近的人的项目开发经验就分享到这里,希望能给您的工作带来帮助,如果您有其他方面的疑问,可以联系我们在线客服,谢谢关注,博纳网络便自己整理。