LBS优化方案探究
方案1:
假设数据结构是这个样子的结构

那么找某个范围之内的用户,相当于:
select * from tb_lbs_user where lat > lat_min and lat < lat_max and lng >lng_min and lng < lng_max;
优点:几乎没有,唯一能说优点的就是比较直观是个人都能够想到;
缺点:慢,数据量大和并发量大的情况下可以把数据库拖死;

方案2:
使用geohash
那么找某个范围之内的用户,相当于:
select * from tb_lbs_user where GeoHash like “abcd%”;
优点:利用geohash优化关系型数据库,查询效率,而且还比较直观;
缺点:慢,数据量大和并发量大的情况下可以把数据库拖死;
方案3:
思路:
将地球划分为n个方格,geohash值为6个位,每个方格为(宽一平方千米,以人口均值取值)
数据结构:
1)用户群圈定:
以geohash值为key,在用户更新地理位置的时候更新或插入;
userGeoList:List< M{userid :{lat,lan,gender, free }}>
示例:
key value
5cfr5x {{12322:{11,11,1}},{1234:{0.5,0.2,1}},{ 4567:{0.2,0.3,1}},….}
5cfr5f {{12322:{11,11,1}},{1234:{0.5,0.2,1}},{4567:{0.2,0.3,1}},….}
. .
. .
. .
2)用户信息:
一个用户信息;纬度、经度、GeoHash值
userInfo ={lan,lat ,geo}
例如:
key value
12322 {5661,1234, 5cfr5x }
344 {344,333, 5cfr5x }
. .
. .
. .
算法实现:
1)更新:
定义:
user_new_geohash:新的geohash值
userid:用户ID
getUserInfo:根据userid获取用户信息
updateGeohash:更新用户的geohash
removeUserid:根据userid,移除集合中的某个用户
getuserGeoList:根据geohash获取用户群
addUserid:往用户群中添加userid
UserGeoListNew:创建用户群对象
实现:
user_new_geohash = “5cfr5f”
userid = 12322;
userInfo = getUserInfo(userid);
user_old_geohash = userInfo. geo
if user_new_geohash != user_old_geohash
userInfo.updateGeohash (userid, user_old_geohash, userInfo. geo)
userGeoListOld = getuserGeoList(user_old_geohash);
userGeoListOld .removeUserid(userid)
userGeoListNew = getuserGeoList(user_new_geohash);
if userGeoListNew !=null:
userGeoListNew.addUserid(userid, gender,free)
else:
userGeoListNew = new UserGeoListNew();
2)查询
定义:
getuserGeoHash:根据userid获取geohash
getuserGeoList:根据geohash和偏移值获取用户集合
sort:根据地理位置由近到远排序
NearbyUserListCache:用户缓存
k:查询条件
geohash = getuserGeoHash(userid);
lan = 0
userGeoList2 = new userGeoList ()
for (int i = 3; i >= 2; i--) {
userGeoList = getuserGeoList(geohash,lan)
for(user: userGeoList ){
if user.gender == 1 and user.free == 1://查询条件
userGeoList2.add(user);
}
lan += 1000;
if (userGeoList2.size() >= 1000) {
break;
}
}
userGeoList.sort();
NearbyUserListCache.add(k, userGeoList);
以NearbyUserListCache逐步分页
算法复杂度:
n*n
可能查询多次
方案4:
2)用户群数值记录:
以geohash值为key,在用户更新地理位置的时候更新或插入;
userNum : DECR/INCR
userFemaleNum : DECR/INCR
userMaleNum : DECR/INCR
2)查询
定义:
getuserGeoHash:根据userid获取geohash
getuserGeoList:根据geohash和偏移值获取用户集合
sort:根据地理位置由近到远排序
NearbyUserListCache:用户缓存
k:查询条件
geohash = getuserGeoHash(userid);
lan = 0
userGeoList = new userGeoList ()
while true:
if len >=10000
userGeoList = getuserGeoList(geohash)
else:
len +=xxx;
break;
userGeoList2.sort();
NearbyUserListCache.add(k, userGeoList2);
以NearbyUserListCache逐步分页
只需要查询一次
LBS优化方案探究的更多相关文章
- Tomcat 配置详解/优化方案
转自:http://blog.csdn.net/cicada688/article/details/14451541 Service.xml Server.xml配置文件用于对整个容器进行相关的配置 ...
- 一个网站完整详细的SEO优化方案
根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...
- mysql 性能优化方案
网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...
- iOS界面跳转的一些优化方案
原文地址: http://blog.startry.com/2016/02/14/Think-Of-UIViewController-Switch/ iOS界面跳转的一些优化方案 App应用程序开发, ...
- tomcat配置详解/优化方案
Service.xml Server.xml配置文件用于对整个容器进行相关的配置. <Server>元素:是整个配置文件的根元素.表示整个Catalina容器. 属性:className: ...
- mysql 性能优化方案1
网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...
- [转]MYSQL高可用方案探究(总结)
前言 http://blog.chinaunix.net/uid-20639775-id-3337432.htmlLvs+Keepalived+Mysql单点写入主主同步高可用方案 http://bl ...
- (转)Web性能优化方案
第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...
- mysql 性能优化方案 (转)
网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...
随机推荐
- 一步一步教你如何在linux下配置apache+tomcat(转)
一步一步教你如何在linux下配置apache+tomcat 一.安装前准备. 1. 所有组件都安装到/usr/local/e789目录下 2. 解压缩命令:tar —vxzf 文件名(. ...
- vs2012 智能提示消失解决办法
一般你可以重启vs就可以解决问题,最蛋疼的是你重启也没用.只能重置,再不行就重装vs,再不行你就重装系统......扯淡了... 重置Visual Studio可以解决此问题, 方法:开始->M ...
- [转]Linux进程间通信——使用信号
转载于:http://blog.csdn.net/ljianhui/article/details/10128731 经典!!! Linux进程间通信——使用信号 一.什么是信号 用过 ...
- Centos上传下载小工具lrzsz
http://www.centoscn.com/image-text/install/2013/0819/1374.html
- c# 改变图片的大小(w,h)
本文介绍获取网络上的图片将其大小尺寸改成自己想要的 /// <summary> /// 图片大小裁剪 /// </summary> /// <param name=&qu ...
- 导出Excel之Epplus使用教程4(其他设置)
导出Excel之Epplus使用教程1(基本介绍) 导出Excel之Epplus使用教程2(样式设置) 导出Excel之Epplus使用教程3(图表设置) 导出Excel之Epplus使用教程4(其他 ...
- [Android教程]EditText怎样限制用户的输入?数字/字母/邮箱
有输入必有验证.为了防止用户随便输入确保提交数据的合法性,程序不得不在文本输入框(EditText)中增加限制或验证. 关于输入类型有数字.字母.邮箱.电话等形式,这些具体得根据业务来.那么Andro ...
- 入侵检测课设之Libnids开发包
Libnids开发包介绍 Libnids是一个用于网络入侵检测开发的专业编程接口,它使用了Libpcap所以它具有捕获数据包的功能.同时,Libnids提供了TCP数据流重组功能,所以对于分析 ...
- 一张图说明该选用神马程式来serve你的django应用
- Linux的watch命令 — 实时监测命令的运行结果
Linux的watch命令 — 实时监测命令的运行结果 watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一样,watch 可以帮你监测一个命令的运行结果,省得 ...