在LBS的应用中,一个基本的需求是查找附近的用户,现在有两种做法:

1. 使用mysql的空间数据库,具体做法参考:http://blog.sina.com.cn/s/blog_a48af8c001018q1p.html 。

2.  使用geohash编码,这个是本文需要讨论的。

geohash编码,可以把球面上的经纬度转换成一个值,简单点来说就是把二维坐标转换成一维坐标。查找附近的时候,非常方便,用SQL中,LIKE ‘w23yr3%’可查询附近的所有地点。

geohash的详细介绍,可参考 http://www.wubiao.info/372

在以前的产品中,一个需求是查找用户附近的商铺,发现用mysql LIKE ‘w23yr3%’这种方式检索geohash性能上的瓶颈很大,检索130万行的数据,平均花费了8秒,这是响应速度是无法忍受的。

后来经过不断优化,确定了如下使用coreseek+redis+mysql解决方案,一下子就把响应速度减少到平均1 秒,这个方案的如下:

1. 用每个商铺的坐标值计算geohash,把geohash作为key,商铺的作为value,放到redis的set集中。

$this->cache->redis->select(1);//不能使用0,因为这里有大量的数据,需要独立
$this->cache->redis->set('place:geohash:'.$geohash,$place_id);

2. 根据用户的坐标,在redis中查找附近的商铺id

<?php/*** 获取附近的地标公共处理方法* @param $lat* @param $lng* @param $n geohash值的长度,一般来说,当n=6,是获取当前附近1千米范围内的用户*/function getLocalPlace($lat, $lng, $n){$lat = (float) $lat;$lng = (float) $lng;$nowGeohash = $this->geohash->encode($lng, $lat);$likeGeohash = substr($nowGeohash, 0, $n);$placeIds = array();$this->_loadDriver('cache', array('adapter' => 'redis'));//不能使用0,因为这里有大量的数据,需要独立$this->cache->redis->select(1);//*表示模糊匹配,例如有key werewfs,werewfw,那么使用“werewf*”,则能同时匹配werewfs,werewfw$geohashKeys = $this->cache->redis->keys('place:geohash:' . $likeGeohash . '*');$hashlen = strlen($nowGeohash);if ($geohashKeys){$searchKeys = array();//对坐标进行排序foreach ($geohashKeys as $k => $v) {$v = ltrim($v, 'place:geohash:');for ($i = $n; $i < $hashlen; $i++) {$compare_hash = substr($nowGeohash, 0, $i);$cur_hash = substr($v, 0, $i);if ($compare_hash != $cur_hash){$nofst = str_pad(($i - 1) . $k, 6, '0');$searchKeys[$nofst] = 'place:geohash:' . $v;break 1;}}}if ($searchKeys){krsort($searchKeys);//mget表示返回所有特殊keys的values$placeIds = $this->cache->redis->mget($searchKeys);}}return $placeIds;}

3. 如果需要查找关键字或商铺的类型,则用把2中$placeIds 作为filter调戏 ,在coreseek中继续查找。

app后端系列文章总目录

如果您觉得这系列的文章对你有所帮助,欢迎打赏。
支付宝账号:190678908@qq.com 收款人:曾健生

[文章作者]曾健生

[作者邮箱]h6k65@126.com

[作者QQ]190678908

[新浪微博] @newjueqi

[博客]http://blog.csdn.net/newjueqi

http://blog.sina.com.cn/h6k65

app后端设计(6)-- LBS相关推荐

  1. app后端设计(php)

    来源:http://blog.csdn.net/column/details/mobilebackend.html?page=1 做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经 ...

  2. app后端设计(12)--图片的处理

    app上线后,不断接受用户的反馈,于是,反馈非常差的情况下,都会有app的改版. 一旦app的改版,都会有比较大的UI改动,一改动UI,那么图片的尺寸也就必须要改变. 在app后端设计(1)-api( ...

  3. app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)

    在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面. (1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间. (2)短信方面 以前我 ...

  4. **16.app后端如何保证通讯安全--url签名

    app和后端的通讯过程中,api请求有可能被别人截取或不小心泄露.那么,怎么保证api请求的安全呢?在这篇文章中,介绍一种常见的保证api请求安全的做法--url签名. 1. url签名详解 在前一篇 ...

  5. APP后端数据接口注意事项

    2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代,  不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端 ...

  6. 校园安全教育APP的设计与实现

    校园安全教育APP的设计与实现 摘要 现今社会数字化飞速发展,用户对教育行业数字化的需求也随之扩大,线上的校园安全教育不仅可以协助高校学生进行日常校园安全知识的学习,还可以参与到初中.高中等阶段的安全 ...

  7. IC Compiler II(ICC II)后端设计流程——超详细

    Preface 本文中英文结合(学习一些专有名词),主要介绍ICC II软件进行后端设计的主要流程,在阅读之前需要对数字IC设计流程有一定的了解. 逻辑综合相关知识请查看:Synopsys逻辑综合及D ...

  8. [附源码]计算机毕业设计Python+uniapp智慧校园APP的设计与实现55q4l(程序+lw+APP+远程部署)

    [附源码]计算机毕业设计Python+uniapp智慧校园APP的设计与实现55q4l(程序+lw+APP+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目运行环境配置 ...

  9. 35.app后端搜索入门

    现在人们的网络生活已经离不开搜索了,遇到不懂的问题,想知道的事情,搜索一下,就知道答案. 在app中,最常见的搜索情景就是搜索用户.只有几百,几千的用户量时,可以直接用用like这样的模糊查询,但是, ...

最新文章

  1. oracle数据库数据导入导出步骤(入门)
  2. 如何加快按生产订单查找物料凭证的报表的速度
  3. 配置FCKeditor_2.6.3+fckeditor-java-2.4
  4. 化学版2048,你玩过吗?内含游戏链接
  5. php中常用的全局变量有,在PHP中如何使用全局变量的方法详解
  6. 网站排障的一些小命令
  7. 创业被泼冷水怎么办?
  8. Flotherm 2021热仿真分析基础到高级视频教程
  9. 软件测试--面试时怎么介绍前公司的项目经验
  10. html打开网页过场动画_一款谷歌(Google)打造的广告网页设计制作软件
  11. 1.3中国计算机网络发展情况
  12. 6. 工业大数据的实施策略
  13. Gazebo模型下载
  14. SyntaxError: Non-UTF-8 code starting with ‘\xb5‘ in file问题如何解决???求助求助!!!
  15. 如何使用WinRAR将一个大文件压缩成多个小的压缩包
  16. 基于python的微信公众号开发教程_基于python的微信公众号开发教程
  17. Mac如何查找m3u8视频链接,并下载
  18. php敏感词过滤的一个方法
  19. 网站搭建-django-学习成绩管理-13-ECharts
  20. html 水平分割,HTML设置水平分割线

热门文章

  1. 计算机发展史资料简介,计算机发展史简介
  2. 一叶知秋,一个 LED 就能入门 Linux 内核
  3. spring-boot-maven-plugin爆红
  4. Log4j2 重大漏洞与解决方案
  5. HBuilder/HBuilderX真机运行、手机运行、真机联调常见问题
  6. 人工智能——归结推理
  7. tensorflow与pytorch 一起安装
  8. HTTP协议漫谈 - HTTP协议历史和报文结构
  9. Android 开发中命名规则
  10. 如何实现WiFi与5G无缝切换?如何进行无线通信切换测试?(二)