geohash

一口气说出4种 “附近的人” 实现方式,面试官笑了

て烟熏妆下的殇ゞ 提交于 2020-08-15 08:23:07
引言 昨天一位公众号粉丝和我讨论了一道面试题,个人觉得比较有意义,这里整理了一下分享给大家,愿小伙伴们面试路上少踩坑。面试题目比较简单:“让你实现一个附近的人功能,你有什么方案?”,这道题其实主要还是考察大家对于技术的广度,本文介绍几种方案,给大家一点思路,避免在面试过程中语塞而影响面试结果,如有不严谨之处,还望亲人们温柔指正! “附近的人” 功能生活中是比较常用的,像外卖app附近的餐厅,共享单车app里附近的车辆。既然常用面试被问的概率就很大,所以下边依次来分析基于mysql数据库、Redis、 MongoDB实现的 “附近的人” 功能。 科普:世界上标识一个位置,通用的做法就使用经、纬度。经度的范围在 (-180, 180],纬度的范围 在(-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。比如:望京摩托罗拉大厦的经、纬度(116.49141,40.01229)全是正数,就是因为我国位于东北半球。 一、“附近的人”原理 “附近的人” 也就是常说的 LBS (Location Based Services,基于位置服务),它围绕用户当前地理位置数据而展开的服务,为用户提供精准的增值服务。 “附近的人” 核心思想如下: 以 “我” 为中心,搜索附近的用户 以 “我” 当前的地理位置为准,计算出别人和 “我” 之间的距离

Redis系列---Redis数据结构和常用命令1/5

。_饼干妹妹 提交于 2020-08-11 02:55:28
目录 简介 1. 常用命令 2. 数据结构 (1) String (2)List (3) Set (4) Sorted set (5) Hash (6) GEO (7)Stream 3.新特性 简介 Redis是一个开源的使用C语言编写、支持网络、可基于内存也可持久化的日志类型、Key-Value数据库, 并 提供多种语言的API。 本质是客户端-服务端应用软件程序。存储在内存中,因此操作速度比数据库更快。 特点:使用简单、性能强悍、功能应用场景丰富。 1. 常用命令 命令 含义 DEL Key 在key存在时候删除key DUMP Key 序列化给定key,并返回被序列化的值 EXISTS Key 检查给定key是否存在 EXPIRE Key seconds 为给定key设置过期时间,以秒计 TTL Key 以秒为单位,返回给定key的剩余生存时间(TTL,time to live) TYPE Key 返回key所存储的值的类型 2. 数据结构 (1) String String数据结构是简单Key-value类型,value不仅是String,也可以是数字。 使用场景:微博数、粉丝数(常规计数)。 命令 含义 Get 获取指定key值 Set 设置指定key值 Incr 将key中存储的数字值增一 Decr 将key中存储的数字值减一 Mget 获取所有(一个或多个

美团架构师从应用、原理、集群、拓展、源码等方面深入解析Redis

南笙酒味 提交于 2020-08-11 01:29:38
全书由:基础篇、应用篇、原理篇、集群篇、拓展篇、源码篇六部分组成 总览 由于文档的内容太多,所以只截取了部分内容展示,有想获取完整PDF文档的朋友:点赞后,私信【文档资料】即可(一定要记得关注我,不然没办法回复陌生人私信) 基础篇 Redis基础数据结构 应用篇 分布式锁 延时队列 位图 HyperLogLog 布隆过滤器 简单限流 漏斗限流 GeoHash Scan 原理篇 线程IO模型 通信协议 持久化 管道 事务 PubSub 小对象压缩 主从同步 集群篇 Sentinel Codis Cluster 拓展篇 Stream Info指令 再谈分布式锁 过期策略 LRU 懒惰删除 优雅地使用Jedis 保护Redis Redis安全通信 源码篇 来源: oschina 链接: https://my.oschina.net/u/4338498/blog/4335893

redis限流的3种实现方式

送分小仙女□ 提交于 2020-08-09 18:59:46
Redis限流的实现方式有3种,分别是:1、基于Redis的setnx的操作,给指定的key设置了过期实践;2、基于Redis的数据结构zset,将请求打造成一个zset数组;3、基于Redis的令牌桶算法,输出速率大于输入速率,就要限流。 第一种:基于Redis的setnx的操作 我们在使用Redis的分布式锁的时候,大家都知道是依靠了setnx的指令,在CAS(Compare and swap)的操作的时候,同时给指定的key设置了过期实践(expire),我们在限流的主要目的就是为了在单位时间内,有且仅有N数量的请求能够访问我的代码程序。所以依靠setnx可以很轻松的做到这方面的功能。 比如我们需要在10秒内限定20个请求,那么我们在setnx的时候可以设置过期时间10,当请求的setnx数量达到20时候即达到了限流效果。代码比较简单就不做展示了。 当然这种做法的弊端是很多的,比如当统计1-10秒的时候,无法统计2-11秒之内,如果需要统计N秒内的M个请求,那么我们的Redis中需要保持N个key等等问题 第二种:基于Redis的数据结构zset 其实限流涉及的最主要的就是滑动窗口,上面也提到1-10怎么变成2-11。其实也就是起始值和末端值都各+1即可。 而我们如果用Redis的list数据结构可以轻而易举的实现该功能 我们可以将请求打造成一个zset数组

LBS-查找附近的人-redis命令实现

自古美人都是妖i 提交于 2020-08-09 05:49:08
https://www.jianshu.com/p/a7977f2d8e6f https://www.jianshu.com/p/81bf3baa64e5 在redis的3.2版本开始支持geo的功能,这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作。 本文环境 MACOS10.13.4+8G内存+2.6GHz+redis4.0.2 命令 redis的geo命令一共是6个,redis-geo在没有被集成到redis中只是一个附属模块的时候有更多的命令,在集成到redis中后被精简到了6个。我们先通过redis的命令熟悉这六条命令,然后再通过spring-data-redis集成到项目中,实现我们要做的查找附近的人。 注意:上一篇讲的mysql版本的Point(纬度,经度),纬度再前,经度在后。而在redis中是经度在前,维度在后。 中文显示乱码解决方案: ./redis-cli -a redis-pass --raw ,就是在命令后加 --raw , 加了 --raw 之后放回结果就没有格式化了,看起来比较不友好。项目中最好不要使用中文, 避免出现一些莫名其妙的问题。 GEOADD GEOADD key longitude latitude member [longitude latitude member ...] 添加一个或多个地理空间位置到sorted

Redis GEO地理位置学习

孤街醉人 提交于 2020-07-29 07:08:38
从Redis3.2开始,Redis基于geohash和有序集合(zset)提供了地理位置相关功能,用来实现类似微信中附近的人的功能,使用起来十分方便。 Redis Geo模块大概提供了6个命令,分别为: 1)geoadd:将给定的位置对象(纬度、经度、名字)添加到指定的key; 2)geopos:从key里面返回所有给定位置对象的位置(经度和纬度); 3)geodist:返回两个给定位置之间的距离; 4)geohash:返回一个或多个位置对象的geohash表示; 5)georadius:以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象; 6)georadiusbymember:以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。 1.添加地理位置 geoadd key long lat member [longitude latitude member] 命令:将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。 返回值:添加到sorted set元素的数目,但不包括已更新score的元素。 203.195 . 205.63 : 0 >geoadd geo:city 121.47 31.23 shanghai 116.40 39.90 beijing 118.78 32.07 nanjing " 3 " 返回值 3

Redis 到底是怎么实现“附近的人”这个功能的?

折月煮酒 提交于 2020-05-03 23:19:31
前言 : 针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。 而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率。 本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度。 要提供完整的“附近的人”服务,最基本的是要实现“增”、“删”、“查”的功能。以下将分别进行介绍,其中会重点对查询功能进行解析。 操作命令 自Redis 3.2开始,Redis基于geohash和有序集合提供了地理位置相关功能。Redis Geo模块包含了以下6个命令: GEOADD : 将给定的位置对象(纬度、经度、名字)添加到指定的key; GEOPOS: 从key里面返回所有给定位置对象的位置(经度和纬度); GEODIST: 返回两个给定位置之间的距离; GEOHASH: 返回一个或多个位置对象的Geohash表示; GEORADIUS : 以给定的经纬度为中心,返回目标集合中与中心的距离不超过给定最大距离的所有位置对象; GEORADIUSBYMEMBER: 以给定的位置对象为中心,返回与其距离不超过给定最大距离的所有位置对象。 其中,组合使用GEOADD和GEORADIUS可实现“附近的人”中“增”和“查”的基本功能。 要实现微信中“附近的人”功能

GeoHash原理和可视化显示

南笙酒味 提交于 2020-04-24 06:13:00
最近在做附近定位功能的产品,geohash是一个非常不错的实现方式。查询资料,发现阿里的 这篇 文章讲解的很好。但文中并没有给出geohash显示的工具。无奈,也没有查到类似的。只好自己简单显示一下,方便自己理解。 项目地址: https://github.com/Ryan-Miao/geohash-visualization geohash可视化显示 经纬度获取9宫格覆盖: https://ryan-miao.github.io/geohash-visualization/index.html geohash坐标定位: https://ryan-miao.github.io/geohash-visualization/show_all.html 演示了中心点以及周围其他下一级的点的关系 收藏原文如下: 基于快速GeoHash,如何实现海量商品与商圈的高效匹配 阿里妹导读:闲鱼是一款闲置物品的交易平台APP。通过这个平台,全国各地“无处安放”的物品能够轻松实现流动。这种分享经济业务形态被越来越多的人所接受,也进一步实现了低碳生活的目标。 今天,闲鱼团队就商品与商圈的匹配算法为我们展开详细解读。 摘要 闲鱼app根据交通条件、商场分布情况、住宅区分布情况综合考虑,将城市划分为一个个商圈。杭州部分区域商圈划分如下图所示。 闲鱼的商品是由用户发布的GPS随机分布在地图上的点数据

Geohash介绍及针对具体需求的改良

笑着哭i 提交于 2020-04-24 06:04:34
1. Geohash介绍 1.1. 应用场景 POI(Point of Interest):某个地图点周围的美食娱乐等的搜索; 热点分析:统计某个地图区域的热度; 其他,暂时没想到。 1.2. Geohash算法 地图上一般是使用经度和纬度两个维度来唯一的确定一个点,而geohash采用经纬度二维值转为一维的值。 优点: 只需要对一个字段进行索引,提高性能、降低复杂度 可转成可排序,可比较的字符串,满足灵活的需求 具体详细的介绍参考 维基百科: https://en.wikipedia.org/wiki/Geohash 2. 针对具体需求改进 2.1. 定制经纬度范围 标准的geohash算法的经度范围是(-180,180),纬度范围为(-90,90),这个范围是适用于全球的地理位置的。但是我们目前的应用数据点仅局限于国内,所以可以将范围缩小。 减少计算的次数提高性能 降低geohash有效值的位数 自定义经纬度范围可选定一个趋于正方形的范围,当计算结果为一个圆形区域,这样能更好的和圆契合。 可选定经纬度范围, 经度(70, 140),纬度(15, 60)。 2.2. 使用long型值,更细粒度的精度控制 首先说明下,标准的geohash值,是采用base32编码的字符串作为值,每一字符代表5个bit位。也就是精度多一位字符就多出了5个bit位。先看下维基百科提供的一组数据:

geohash 算法

余生长醉 提交于 2020-04-23 14:29:37
http://www.cnblogs.com/LBSer/p/3310455.html 引子   机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西。某一天机机到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐馆,并选了其中一家用餐。   饭饱之后机机开始反思了,地图后台如何根据自己所在位置查询来查询附近餐馆的呢?苦思冥想了半天,机机想出了个方法:计算所在位置P与北京所有餐馆的距离,然后返回距离<=1000米的餐馆。小得意了一会儿,机机发现北京的餐馆何其多啊,这样计算不得了,于是想了,既然知道经纬度了,那它应该知道自己在西城区,那应该计算所在位置P与西城区所有餐馆的距离啊,机机运用了递归的思想,想到了西城区也很多餐馆啊,应该计算所在位置P与所在街道所有餐馆的距离,这样计算量又小了,效率也提升了。   机机的计算思想很朴素,就是通过过滤的方法来减小参与计算的餐馆数目,从某种角度上讲,机机在使用索引技术。   一提到索引,大家脑子里马上浮现出B树索引,因为大量的数据库(如MySQL、oracle、PostgreSQL等)都在使用B树。B树索引本质上是对索引字段进行排序,然后通过类似二分查找的方法进行快速查找,即它要求索引的字段是可排序的,一般而言,可排序的是一维字段,比如时间、年龄、薪水等等。但是对于空间上的一个点(二维,包括经度和纬度)