方案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优化方案探究的更多相关文章

  1. Tomcat 配置详解/优化方案

     转自:http://blog.csdn.net/cicada688/article/details/14451541 Service.xml Server.xml配置文件用于对整个容器进行相关的配置 ...

  2. 一个网站完整详细的SEO优化方案

    根据自己的个人经验完成了这篇文章,希望对SEOer有点帮助,高手直接跳过,请勿喷水... 一个完整的SEO优化方案主要由四个小组组成: 一.前端/页编人员 二.内容编辑人员 三.推广人员 四.数据分析 ...

  3. mysql 性能优化方案

    网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  4. iOS界面跳转的一些优化方案

    原文地址: http://blog.startry.com/2016/02/14/Think-Of-UIViewController-Switch/ iOS界面跳转的一些优化方案 App应用程序开发, ...

  5. tomcat配置详解/优化方案

    Service.xml Server.xml配置文件用于对整个容器进行相关的配置. <Server>元素:是整个配置文件的根元素.表示整个Catalina容器. 属性:className: ...

  6. mysql 性能优化方案1

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

  7. [转]MYSQL高可用方案探究(总结)

    前言 http://blog.chinaunix.net/uid-20639775-id-3337432.htmlLvs+Keepalived+Mysql单点写入主主同步高可用方案 http://bl ...

  8. (转)Web性能优化方案

    第一章 打开网站慢现状分析 在公司访问部署在IDC机房的VIP网站时会感觉很慢.是什么原因造成的?为了缩短页面的响应时间,改进我们的用户体验,我们需要知道用户的时间花在等待什么东西上. 可以跟踪一下我 ...

  9. mysql 性能优化方案 (转)

    网 上有不少mysql 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果 ...

随机推荐

  1. Jsonp简单认识(后端使用的是asp.net mvc)

    一.Jsonp简介:由于浏览器基于安全有同源策略(同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性)机制,所以前端无法使用Ajax来获取来获取其他域名下返回的数据,而Jsonp可 ...

  2. 分子量 (Molar Mass,ACM/ICPC Seoul 2007,UVa 1586)

    解题思路: 1.将分子量用double 数组记录下来 2.将字符串存储在字符数组中,从头向后扫描,一直记住“字母”,对下一个字符进行判断,是否是数字,如果是数字:用一个整数记录,本代码中用的sum,同 ...

  3. MSF溢出实战教程

    1.  进入终端,开启MSF相关服务 2.  连接数据库 3.  主机扫描 发现如果有MS08_067漏洞,就可以继续渗透 4.  开始溢出 溢出成功的话 sessions -l         查看 ...

  4. iOS-(kCFStreamErrorDomainSSL, -9802)

    kCFStreamErrorDomainSSL, -9802 我是微博授权时get页面时候碰到的 其实就是http安全问题 在info.plist里添加并设置Allow Arbitrary Loads ...

  5. Sublime Text2 快捷键 (MAC版)

    工具是人的延伸,可以把人变得更聪明更强大,人类正是学会了使用工具,才创造出现在的文明.作为程序员,工具开发.使用是其能力的重要体现,业内的大牛都是造工具的好手.目前身边很多人都在用sublime te ...

  6. 微信时代,"邮"你选择 腾讯企业邮箱推新玩法

    近日,腾讯企业邮箱在广州.北京.南京三地举办<微信时代,“邮”你选择>企业邮箱新方向客户见面会,同时也正式宣布将打通微信.“拥抱”移动办公,领航国内办公工具移动之“变”. 据了解,腾讯企业 ...

  7. 【转】使用genstring和NSLocalizedString实现App文本的本地化

    原地址:http://www.cnblogs.com/U-tansuo/p/IOS_NSLocalizedString.html iOS提供了简便的方法来实现本地化,其中用的最多的就是NSLocali ...

  8. windows 程序的本体与操作系统之间的关系

    WinMain(hInst,hPrev,……) { MSG msg; RegisterClass(……); CreateWindow(……); ShowWindow(……); UpdateWindow ...

  9. [Educational Codeforces Round 16]C. Magic Odd Square

    [Educational Codeforces Round 16]C. Magic Odd Square 试题描述 Find an n × n matrix with different number ...

  10. hdu4255筛素数+广搜

    Mr. B has recently discovered the grid named "spiral grid".Construct the grid like the fol ...