首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Redis高级篇之GEO搜索最近地铁口

前言交友软件附近小姐姐、外卖软件附近美食店铺、地图附近地铁等等,那附近各种形形色色XXX地址位置选择是如何实现?...它支持对地理位置进行半径搜索、矩形搜索附近点搜索等多种操作,可以用于实现诸如查找最近地铁口等功能。本文将介绍如何使用RedisGEO数据结构来实现最近地铁口搜索。...例如滴滴打车,最直观操作就是实时记录更新各个车位置,然后当我们要找车时,在数据库查找距离我们(坐标x0,y0)附近r公里范围内部车辆使用如下SQL即可:select taxi from position...哈希表用于存储地理位置元数据,例如地点名称、地址等;有序集合用于存储地理位置坐标信息,例如经度纬度坐标编码GEO数据结构使用经纬度表示地理位置坐标信息。...经纬度是一种常用地理坐标系统,它使用经度纬度来表示地球上位置。在GEO数据结构经度纬度被编码为一个64位整数,以便进行高效计算比较。

39032

使用Redis实现附近的人及打车服务

面向LBS应用GEO数据类型 各种社交软件里面都有附件的人需求,在该应用,我们查询附近 1 公里食客,同时只需查询出 20 个即可。...对于一个LBS应用,除记录纬度,还需根据用户经纬度信息在车辆Hash集合中进行范围查询。 而涉及到范围查询,就要求集合元素有序,Hash显然不满足需求。...类型),而一组经纬度包含经度纬度两个值,没法直接保存为一个浮点数,到底怎么保存?...这就要用到GEO类型GeoHash编码。 工作原理 sorted set 使用一种称为 Geohash 技术进行填充。经度纬度位是交错,以形成一个独特 52 位整数....字符串越长,表示范围越精确。 GEOPOS 从key里返回所有给定位置元素位置(经度纬度)。

1.1K20
您找到你想要的搜索结果了吗?
是的
没有找到

redis | 九、redis之Geospatial

中国诚实坐标纬度查询,进行查询中国城市具体坐标! 1. geoadd 添加经纬元素 将指定地理空间位置(纬度经度、名称)添加到指定key。...从key里返回所有给定位置元素位置(经度纬度)。...返回值 GEOPOS 命令返回一个数组, 数组每个项都由两个元素组成:第一个元素为给定位置元素经度, 而第二个元素则为给定位置元素纬度。 当给定位置元素不存在时, 对应数组项为空值。...由两个元素组成坐标,分别为经度纬度。...以给定纬度为中心, 找出某一半径内元素 Redis GEOADD 命令 将指定地理空间位置(纬度经度、名称)添加到指定key Redis GEORADIUSBYMEMBER 命令 找出位于指定范围内元素

62320

Redis GeoHash核心原理解析

但是对于空间上一个点(二维,包括经度纬度),如何排序呢?又如何索引呢?解决方法很多,下文介绍一种方法来解决这一问题。...随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167; 如果给定纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法进行会产生一个序列1011100,...计算出GeoHash值,然后和数据库精度更高GeoHash值做前缀比较 8.空间索引 常见问题:如何根据自己所在位置查询查询附近50米POI(point of interest,比如商家、景点等...每个POI都有经纬度信息,用图1bSQL语句在mySQL建立了POI_spatial表,其中latlng两个字段来代表纬度经度。为后续分析方便起见,我人造了40万个POI数据。...根据这个思路我们执行SQl查询(图5)(注:经度纬度每隔0.001度,距离相差约100米,由此推算出矩形左下角右上角坐标),发现过滤后正好剩下两个POI。

1.3K20

Geohash原理

也就是说,这个矩形区域内所有的点(经纬度坐标)都共享相同GeoHash字符串,这样既可以保护隐私(只表示大概区域位置而不是具体点),又比较容易做缓存。...Geohash编码字符串相似的表示距离相近(特殊情况后文阐述),这样可以利用字符串前缀匹配来查询附近POI信息。...如果给定纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,序列长度跟给定区间划分次数有关,如下图 e....Geohash0、1串序列是经度0、1序列纬度0、1序列数字交替进行排列,偶数位对应序列为经度序列,奇数位对应序列为纬度序列,在进行第一次划分时,Geohash0、1序列前5个bits...该场景封装为函数可以表示如下:输入组成围栏点经纬度坐标集合指定geohash长度,输出一组geohash编码。

78540

Redis 实战篇:Geo 算法教你邂逅附近女神

MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近其他数据,按照距离排序,如何下手呢?...为了满足高性能矩形区域算法,数据表需要在经纬度坐标加上复合索引 (longitude, latitude),这样可以最大优化查询性能。...” Hash看起来好像可以实现,但是 LBS 应用除了记录纬度以外,还需要对 Hash 集合数据进行范围查询,根据经纬度换算成距离排序。 而 Hash 集合数据是无序,显然不可取。...这样就实现了将经纬度转换成一个值,而 Redis GEO 类型底层数据结构用就是 Sorted Set来实现。 我们来看下 GeoHash 如何将经纬度编码。...,将一组经纬度信息对应「女神 ID」记录到 GEO 类型集合,如下:一次记录多个用户(苍井空、波多野结衣)纬度信息。

1.5K10

Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近其他数据,按照距离排序,如何下手呢?...为了满足高性能矩形区域算法,数据表需要在经纬度坐标加上复合索引 (longitude, latitude),这样可以最大优化查询性能。...Hash看起来好像可以实现,但是 LBS 应用除了记录纬度以外,还需要对 Hash 集合数据进行范围查询,根据经纬度换算成距离排序。 而 Hash 集合数据是无序,显然不可取。...这样就实现了将经纬度转换成一个值,而 Redis GEO 类型底层数据结构用就是 Sorted Set来实现。 我们来看下 GeoHash 如何将经纬度编码。...,将一组经纬度信息对应「女神 ID」记录到 GEO 类型集合,如下:一次记录多个用户(苍井空、波多野结衣)纬度信息。

1.3K20

Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

MySQL 实现 “计算「附近的人」,通过一个坐标计算这个坐标附近其他数据,按照距离排序,如何下手呢?...为了满足高性能矩形区域算法,数据表需要在经纬度坐标加上复合索引 (longitude, latitude),这样可以最大优化查询性能。...Hash看起来好像可以实现,但是 LBS 应用除了记录纬度以外,还需要对 Hash 集合数据进行范围查询,根据经纬度换算成距离排序。 而 Hash 集合数据是无序,显然不可取。...这样就实现了将经纬度转换成一个值,而 Redis GEO 类型底层数据结构用就是 Sorted Set来实现。 我们来看下 GeoHash 如何将经纬度编码。...,将一组经纬度信息对应「女神 ID」记录到 GEO 类型集合,如下:一次记录多个用户(苍井空、波多野结衣)纬度信息。

1.1K50

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

,在指定精度后计算用户坐标的geoHash码,再获取到用户周边8个方位geoHash码在数据库搜索用户,最后过滤掉超出给定距离(500米内)用户。...GEOADD:将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS:从key里面返回所有给定位置对象位置(经度纬度); GEODIST:返回两个给定位置之间距离; GEOHASH...:返回一个或多个位置对象Geohash表示; GEORADIUS:以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象; GEORADIUSBYMEMBER:以给定位置对象为中心...WITHDIST:在返回位置对象同时,将位置对象与中心之间距离也一并返回。距离单位用户给定范围单位保持一致。 WITHCOORD:将位置对象经度维度也一并返回。...2d 索引支持平面几何形状一些球形查询。虽然2d 索引支持某些球形查询,但 2d 索引对这些球形查询时,可能会出错。所以球形查询尽量选择 2dsphere索引。

1.3K30

Redis 新数据类型

存储,则要记录 365 条记录,如果用户量很大,需要空间也会很大,所以 Redis 提供了 Bitmap 位图这数据结构。...GEO 即 Geographic,地理信息缩写。该类型,就是元素二维坐标,在地图上就是经纬度。redis 基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度 Hash 等常见操作。...GEO 数据类型为 zset。 添加地理位置(经度纬度,名称)(可添加多个) geoadd ......ft 表示单位为英尺 以给定纬度为中心,找出某一半径内元素 georadius 距离 m|km|ft|mi 例子: georadius china:city 110...获得指定地区坐标值 geodist [m|km|ft|mi] 获取两个位置之间直线距离 georadius 距离 m|km|ft|mi 以给定纬度为中心

55910

Redis三种特殊类型

, 方圆几里的人 首先需要一个城市经度纬度查询工具 自行百度搜索 只有六个命令 相关命令 GEOADD GEODIST GEOHASH GEOPOS GEORADIUS GEORADIUSBYMEMBER...有效纬度从-85.05112878度到85.05112878度。 当坐标位置超出上述指定范围时,该命令将会返回一个错误。...)通过半径来查询给定纬度为中心, 返回键包含位置元素当中, 与中心距离不超过给定最大距离所有位置元素。范围可以使用以下其中一个单位: m 表示单位为米。 km 表示单位为千米。..."beijing" 2) "xian" 127.0.0.1:6379> GEOHASH 命令返回一个或多个位置geohash表示 该命令将返回11个字符Geohash字符串 # 将二维经纬度转换为一维字符串...1 两个状态 测试 使用bitmap来记录周一到周日打卡 周一 1 周二 0 周三 1 周四 0 周五 1 周六 1 周日 0 127.0.0.1:6379> setbit sign

59820

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

,在指定精度后计算用户坐标的geoHash码,再获取到用户周边8个方位geoHash码在数据库搜索用户,最后过滤掉超出给定距离(500米内)用户。...GEOADD:将给定位置对象(纬度经度、名字)添加到指定key; GEOPOS:从key里面返回所有给定位置对象位置(经度纬度); GEODIST:返回两个给定位置之间距离; GEOHASH...:返回一个或多个位置对象Geohash表示; GEORADIUS:以给定纬度为中心,返回目标集合与中心距离不超过给定最大距离所有位置对象; GEORADIUSBYMEMBER:以给定位置对象为中心...WITHDIST:在返回位置对象同时,将位置对象与中心之间距离也一并返回。距离单位用户给定范围单位保持一致。 WITHCOORD:将位置对象经度维度也一并返回。...2d 索引支持平面几何形状一些球形查询。虽然2d 索引支持某些球形查询,但 2d 索引对这些球形查询时,可能会出错。所以球形查询尽量选择 2dsphere索引。

1.9K20

GeoHash核心原理解析

但是对于空间上一个点(二维,包括经度纬度),如何排序呢?又如何索引呢?解决方法很多,下文介绍一种方法来解决这一问题。   ...也就是说,这个矩形区域内所有的点(经纬度坐标)都共享相同GeoHash字符串,这样既可以保护隐私(只表示大概区域位置而不是具体点),又比较容易做缓存,比如左上角这个区域内用户不断发送位置信息请求餐馆数据...城区 郊区 通过上面的介绍我们知道了GeoHash就是一种将经纬度转换成字符串方法,并且使得在大部分情况下,字符串前缀匹配越多距离越近,回到我们案例,根据所在位置查询查询附近餐馆时,只需要将所在位置经纬度转换成...随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167; 4)如果给定纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法进行会产生一个序列1011100...三、GeoHash算法   上文讲了GeoHash计算步骤,仅仅说明是什么而没有说明为什么?为什么分别给经度维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。

1.1K30

geohash之2d 地理空间索引

MongoDB将位置字段二维坐标解释为点,并且可以将这些点编入特殊索引类型以支持基于位置查询。地理空间索引提供特殊地理空间查询操作。...例如,您可以基于与其他位置邻近度或基于指定区域中包含查询文档。 地理空间索引支持对坐标字段 其他字段(例如商业或景点类型查询。...有关查询存储在地理空间索引数据信息,请参阅使用2d索引查询地空间。 存储位置数据 要使用2d地理空间索引,您必须在预定二维坐标系(例如经度纬度)上对位置数据建模。...考虑以下两个例子: loc : [ x, y ] loc : { x: 1, y: 2 } 所有文件必须以相同顺序存储位置数据。如果您将纬度经度用作坐标系,请始终先存储经度。...Haystack Haystack索引为来自同一地理区域文档创建“桶”,以提高限于该区域查询性能。 干草堆索引每个桶都包含指定接近给定经度纬度所有文档。

2.2K40

Redis除了五大数据类型,还有特殊数据类型

指令含义:将指定地理空间位置(纬度经度、名称)添加到指定key。...这些数据将会存储到Zset,这样目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。 该命令采用标准格式参数x,y,所以经度必须在纬度之前。...由于编码和解码过程中所使用初始最小最大坐标不同,编码编码也不同于标准。 该命令将返回11个字符Geohash字符串,所以没有精度Geohash。...指令含义:从key里返回所有给定位置元素位置(经度纬度) 因为GEOPOS命令接受可变数量位置元素作为输入,所以即使用户只给定了一个位置元素,命令也会返回数组回复。...命令一样,都可以找出位于指定范围内元素,但是GEORADIUSBYMEMBER中心点是由给定位置元素决定,而不是像GEORADIUS那样,使用输入经度纬度来决定中心点指定成员位置被用作查询中心

19530

【Redis基础】Redis新数据类型(Bitmaps,HyperLoglog,Geospatial)命令简介与案例演示

一般情况下,给定整个字符串都会被进行计数,通过指定额外 start 或 end 参数,可以让计数只在特定位上进行。...但像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重计数问题如何解决?这种求集合不重复元素个数问题称为基数问题。...GEO,Geographic,地理信息缩写。该类型,就是元素2维坐标,在地图上就是经纬度。...redis基于该类型,提供了经纬度设置,查询,范围查询,距离查询,经纬度Hash等常见操作 命令 1.geoadd 格式 geoadd<member...,找出某一半径内元素 经度 纬度 距离 单位 案例演示 1.存储各个城市经度纬度 127.0.0.1:6379> pfcount count:twodays count:day01 count:day02

22440

一文了解geohash原理,实践实战设计思路

desc 根据指定编码长度获取经纬度 二分层数 --- @param int $length 编码精确度 --- @param int $type 类型 0-纬度;1-经度 --- @return mixed...偶数位放经度,奇数位放纬度,把2串编码组合生成新串:11100 11000 00000 01101。是不是又有点懵了,它是如何组合呢?...(不推荐使用了) 基于mysql + GeoHash实现附近人查询 ① 设计思路 在原本存储用户经纬度:入库时计算经纬度对应geohash字符串存储到表;那么存储时需要我们明确字符串长度。...获取指定key里返回所有指定名称位置(经度纬度);时间复杂度O(log(n)),n是排序集中元素数 注意事项: ① geopos命令返回是一个数组,每个数组都由两个元素组成:第一个是位置经度...,中心点是由给定位置元素决定,不是使用经度纬度来决定中心点。

2.4K20

GeoHash索引

这种编码方法起初被用于以唯一URL标识地图上点实体,而点实体一般是以经纬度标识,所以问题就转变为如何使用URL标识经纬度坐标。下面举例说明GeoHash编码具体实现步骤。...设定武汉大学纬度坐标是(114.360734E, 30.541093N),首先,可以通过如下算法对纬度30.54进行逼近编码: (1)对维度区间[-90,90]进行二分为[-90,0)[0,90...),给标记为0; (3)递归上述过程30.541093,如果给定纬度属于左区间,则记录0,如果属于右区间则记录1,这样随着算法进行会产生一个序列101010110110111,序列长度跟给定区间划分次数有关...(5)合并经纬度编码,偶数位放经度编码(第一位从0开始),奇数位放纬度编码,把两串编码组合生成新串11100 11001 00011 10011 01100 10111。...首先根据用户当前坐标计算GeoHash值,然后取其前缀进行查询

1.3K30

redis常用命令和数据类型

语法: geoadd key 经度 纬度 地名 经度 纬度 地名 ... ... 2、geopos:获取地理位置坐标经度纬度) geopos key 地名 3、geodist:计算两个位置之间距离...单位可以是:m、km、mi(英里)、ft(英尺) geodist key 地名1 地名2 单位 4、georadius:根据用户给定纬度坐标来获取指定范围内地理位置集合。...georadius 以给定纬度为中心, 返回键包含位置元素当中, 与中心距离不超过给定最大距离所有位置元素 georadius key 经度 纬度 半径值 单位 [WITHCOORD] [WITHDIST...georadiusbymember GEORADIUS 命令一样, 都可以找出位于指定范围内元素, 但是 georadiusbymember 中心点是由给定位置元素决定, 而不是使用经度纬度来决定中心点...destkey Redis 突然变慢了如何排查并解决?

80410
领券