再提LBS经纬度搜索和距离排序,求更优方案
看到最近有好多人陆续收藏、关注这个问题,特来更新一下
建议使用ElasticSearch(https://elastic.co)进行LBS业务功能开发
PostGIS也是不错的
Redis新版有提供Geocoding,可以尝试一下
一直在琢磨LBS,期待可以发现更好的方案。现在纠结了。
简单列举一下已经了解到的方案:
1.sphinx geo索引
2.mongodb geo索引
3.mysql sql查询
4.mysql+geohash
5.redis+geohash
然后列举一下需求:
1.实时性要高,有频繁的更新和读取
2.可按距离排序支持分页
3.支持多条件筛选(一个经纬度数据还包含其他属性,比如社交系统的性别、年龄)
方案简单介绍:
1.sphinx geo索引
支持按照距离排序,并支持分页。但是尝试mva+geo失败,还在找原因。
无法满足高实时性需求。(可能是不了解实时增量索引配置有误)
资源占用小,速度快
2.mongodb geo索引
支持按照距离排序,并支持分页。支持多条件筛选。
可满足实时性需求。
资源占用大,数据量达到百万级请流量在10w左右查询速度明显下降。
3.mysql+geohash/ mysql sql查询
不支持按照距离排序(代价太大)。支持分页。支持多条件筛选。
可满足实时性需求。
资源占用中等,查询速度不及mongodb。
且geohash按照区块将球面转化平面并切割。暂时没有找到跨区块查询方法(不太了解)。
4.redis+geohash
geohash缺点不再赘述
不支持距离排序。支持分页查询。不支持多条件筛选。
可满足实时性需求。
资源占用最小。查询速度很快。
------update
补充一下测试机配置:
1TB SATA硬盘。8GB RAM。I3 2350 双核四线程
相关阅读:
parameter name omitted?
就是找不到 WEB-INF的classes_jsp_大佬帮忙指点迷津吧
Okhttp get 请求
通过 passenger-install-nginx-module 安装的 nginx 和直接安装的 nginx 有什么区别?
iOS设备怎么知道当前网络是IPV4的还是IPV6的
js 模拟网页显示的网址点击
为什么undefined、NaN和Infinity可以被赋值,而null不可以?
linux怎样强制复制文件并覆盖?
ubuntu下的sublime使用不了中文输入
android能调用x86的jni库吗?
linux的man怎么快速取消搜索?
nodejs中http的使用问题
php如何读取远程图片为二进制
div中放入button,怎么让button垂直居中
.htaccess nginx报unexpecting end of file,expecting ";" or "}"
通过nodejs和javascript是否可以实现模拟接受ajax请求并作出回应?
更新android studio出现问题了,求帮忙
二进制图片如何显示出来
PHP,Nginx获取访问网站来源的方法
run python时出现ImportError: No module named win32gui 错误