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

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

经度的范围在 (-180, 180],纬度的范围 在(-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。...在进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) 和[0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。...GEO 类型的集合中,如下:一次记录多个用户(苍井空、波多野结衣)的经纬度信息。...” Redis GEO类型提供了 GEORADIUS指令:会根据输入的经纬度位置,查找以这个经纬度为中心的一定范围内的其他元素。...如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按区拆分。 这样就可以显著降低单个 zset 集合的大小。

1.7K10

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

经度的范围在 (-180, 180],纬度的范围 在(-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。...在进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) 和[0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。...GEO 类型的集合中,如下:一次记录多个用户(苍井空、波多野结衣)的经纬度信息。...” Redis GEO类型提供了 GEORADIUS指令:会根据输入的经纬度位置,查找以这个经纬度为中心的一定范围内的其他元素。...如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按区拆分。 这样就可以显著降低单个 zset 集合的大小。 ----

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

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

    经度的范围在 (-180, 180],纬度的范围 在(-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负。...在进行第一次二分区时,经度范围[-180,180]会被分成两个子区间:[-180,0) 和[0,180](我称之为左、右分区)。 此时,我们可以查看一下要编码的经度值落在了左分区还是右分区。...GEO 类型的集合中,如下:一次记录多个用户(苍井空、波多野结衣)的经纬度信息。...” Redis GEO类型提供了 GEORADIUS指令:会根据输入的经纬度位置,查找以这个经纬度为中心的一定范围内的其他元素。...如果数据量过亿甚至更大,就需要对 Geo 数据进行拆分,按国家拆分、按省拆分,按市拆分,在人口特大城市甚至可以按区拆分。 这样就可以显著降低单个 zset 集合的大小。

    1.2K50

    Redis 7的地理信息命令太太太牛了!一文教你如何使用

    GEOPOS:获取一个或多个位置的经度和纬度。GEORADIUS:根据指定的位置和距离,在指定的键中查找附近的位置。...GEORADIUSBYMEMBER:根据指定的位置成员和距离,在指定的键中查找附近的位置。GEOSEARCH:根据指定的查询参数,在指定的键中搜索符合条件的位置。...GEORADIUSGEORADIUS命令用于根据指定的位置和距离,在指定的键中查找附近的位置。...WITHCOORD:返回位置的经度和纬度。WITHDIST:返回位置与查询点的距离。ASC|DESC:按距离升序或降序排序。COUNT count:返回最多指定数量的结果。...通过GEOPOS命令,我们可以获取一个或多个位置的经度和纬度信息。对于位置搜索,Redis提供了多种命令。GEORADIUS命令可以根据指定的位置和距离,在指定的键中查找附近的位置。

    36610

    Redis GeoHash核心原理解析

    B树索引本质上是对索引字段进行排序,然后通过类似二分查找的方法进行快速查找,即它要求索引的字段是可排序的,一般而言,可排序的是一维字段,比如时间、年龄、薪水等等。...GeoHash算法的步骤 下面以北海公园附近随便一个位置为例介绍GeoHash算法的计算步骤,先用百度 GPS反定位系统查找看下经纬度。 ? 纬度=116.395371,经度=39.931957。...随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167; 如果给定的纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法的进行会产生一个序列1011100,...a过滤得到的m个POI中查找某经度范围的POI(图6b),个数为n(n<m),复杂度为m*过滤函数; 用球面距离公式计算位置与步骤b得到的n个POI的距离(图6c),并保留距离小于50米的POI ?...参考 Java实现GPS范围查找 浙大大佬通俗说GPS

    1.6K20

    Redis 7的地理信息命令太太太牛了!一文教你如何使用

    GEOPOS:获取一个或多个位置的经度和纬度。 GEORADIUS:根据指定的位置和距离,在指定的键中查找附近的位置。...GEORADIUSBYMEMBER:根据指定的位置成员和距离,在指定的键中查找附近的位置。 GEOSEARCH:根据指定的查询参数,在指定的键中搜索符合条件的位置。...GEORADIUS GEORADIUS命令用于根据指定的位置和距离,在指定的键中查找附近的位置。...WITHCOORD:返回位置的经度和纬度。 WITHDIST:返回位置与查询点的距离。 ASC|DESC:按距离升序或降序排序。 COUNT count:返回最多指定数量的结果。...通过GEOPOS命令,我们可以获取一个或多个位置的经度和纬度信息。 对于位置搜索,Redis提供了多种命令。GEORADIUS命令可以根据指定的位置和距离,在指定的键中查找附近的位置。

    48130

    美团如何查询附近商家

    想必大家在中学时代的地理课本里早就学过了。我们把地球分成纵横交错的一些格子,每个点都可以用横竖坐标来表示。...此时上海的经度编码就是11 如此这样重复N次,我们就可以将地球按经度切割成很多很多的小格子,如果切割的次数足够多,每一个格子相当于一个点,那也会得到对应这个小块儿的二进制编码。...上海的纬度编码就是:10110001 最终我们得到的上海经纬度编码为 (121.43333,34.50000)-->(11010110,10110001) 统一编码 为了方便记录,我们把经度和维度的二进制格子编码进行合并...,按经度、纬度、经度、维度……这样的顺序,一位一位的进行放置: (11010110,10110001)-->1110011100101001 奇数位的红色是经度编码,偶数位的黑色是纬度编码 我们可以用16...这个特性可以用于附近地点搜索 查找 通过上面的方法,我们就可以将所有商铺的经纬度给一个编码存进数据库,建立索引。

    5.3K20

    redis常用命令和数据类型

    语法: geoadd key 经度 纬度 地名 经度 纬度 地名 ... ... 2、geopos:获取地理位置的坐标(经度,纬度) geopos key 地名 3、geodist:计算两个位置之间的距离...] [WITHHASH] [COUNT count] [ASC|DESC] [STORE key] WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。...COUNT: 指定半径范围内显示的目标数量(半径内有100个,可以只显示50个) ASC: 查找结果根据距离从近到远排序。...DESC: 查找结果根据从远到近排序 5、georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。...二、Bitmaps 用来统计用户是否访问过网站,访问为1,没有为0 详解redis的bitmap在亿级项目中的应用 设置值setbit:设置Bitmaps中某个偏移量的值(0或1),offset从0

    90710

    (数据科学学习手札65)利用Python实现Shp格式向GeoJSON的转换

    ,纬度] } }   其中properties对应的值为这个要素对应的属性表中按顺序存放的值,geometry对应的值中type指明了要素类型,coordinates传入一个包含两个元素的列表...1,纬度1], [经度2,纬度2] ] } } 线要素(LineString):   线要素记录的是一条线上所有折点的经纬度信息...,只需要按顺序连接这些折点就可以还原一条线的形态,在GeoJSON中线要素与多点要素在coordinates属性上格式相同,区别在于geometry属性需要传入"LineString",如下: {"type...} } 多边形要素(Polygon):   多边形要素记录了构成一个多边形所有边缘折点的经纬度信息,其coordinates属性传入"Polygon",其geometry下type属性格式为三维列表...,其第三层列表中嵌套的所有列表记录的经纬度按顺序连接即构成了一个多边形,但需要注意的是,多边形头尾折点的经纬度需要相同,才能构成一个闭合的多边形,如下: {"type":"Feature", "

    2.7K10

    交友系统设计:哪种地理空间邻近算法更快?

    Liao 的功能用例图如下: 用户规模分析 Liao 的目标用户是全球范围内的中青年单身男女,预估目标用户超过 10 亿,系统按 10 亿用户进行设计。...1、SQL 邻近算法 我们可以将用户经、纬度直接记录到数据库中,纬度记录在 latitude 字段,经度记录在longitude 字段,用户当前的纬度和经度为 X,Y,如果我们想要查找和当前用户经、纬度距离...这样每个用户必然会落入到一个网格中,我们在用户表中记录用户所在的网格ID(gridID),然后借助这个字段进行辅助查找,将查找范围限制在用户所在的网格(gridIDx0)及其周围 8 个网格(gridIDx1...如果子树是叶子节点,那么在叶子节点中查找,如果不是叶子节点,继续上面的过程,直到叶子节点。 上面的过程只能找到当前用户所在网格的好友,如何查找邻近网格的其他用户呢?...如此不断重复,可以在经度和纬度方向上,得到两个二进制数。这个二进制数越长,其所在的区间越小,精度越高。

    24910

    使用.NET查询日出日落时间

    在WPF中,通过资源文件实现主题切换是个常见的功能,有不少文章介绍了如何实现手动切换主题。那如何实现自动切换主题呢?...首先,下载IP2LOCATION-LITE-DB11.BIN数据库文件,然后在项目中通过Nuget引用IP2Location.IPGeolocation包。...首先,下载GeoLite2-City.mmdb数据库文件,然后在项目中通过Nuget引用MaxMind.GeoIP2包。...最新(2024-5-7下载)的GeoLite2数据库中查询到20071个中国的IP网段,其中有11270条是未查询到具体城市信息的记录。...在程序中也可以通过特定API获取公网IP,比如下边这个API: Get https://ipecho.net/plain 小结 在计算日出日落和经度纬度信息的环节都介绍了在线API服务和离线获取两种方式

    23710

    Redis系统学习之三种特殊数据类型(geospatial(地理位置))

    添加地理位置 geoadd key 经度 纬度 城市名称[多个添加,经纬度城市名称循环] 两级(南极和北极)无法添加,一般通过程序导入 添加北京位置 ? 添加河北和上海位置 ?...以指定的经纬度为中心,找出某一半径内的元素 GEORADIUS key 维度 经度 半径长度 m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count...WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 WITHCOORD: 将位置元素的经度和维度也一并返回。...COUNT 限定返回的记录数。 ASC: 查找结果根据距离从近到远排序。 DESC: 查找结果根据从远到近排序。...搜索经度110 维度30 附近1000km内的位置,或者2000米的位置 可以用于做附近的人,比如附近100m内的玩家XXX,感觉王者是不是这么做的 ?

    1K20

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

    都知道地球上的地理位置是使用二维的经纬度表示,经度范围(-180,180],纬度范围(-90,90],只要我们确定一个点的经纬度就可以得他在地球的位置。...例如滴滴打车,最直观的操作就是实时记录更新各个车的位置,然后当我们要找车时,在数据库中查找距离我们(坐标x0,y0)附近r公里范围内部的车辆使用如下SQL即可:select taxi from position...经纬度是一种常用的地理坐标系统,它使用经度和纬度来表示地球上的位置。在GEO数据结构中,经度和纬度被编码为一个64位的整数,以便进行高效的计算和比较。...跳表是一种基于链表的数据结构,它可以实现快速的查找、插入和删除操作。在GEO数据结构中,跳表被用于存储地理位置的坐标信息,以便进行高效的搜索和排序。...Redis的GEO数据结构支持多种搜索方式,可以灵活地满足不同的查找需求。在实际应用中,我们可以将地铁口的数据存储在一个哈希表中,然后将坐标添加到GEO数据结构中。

    59732

    GeoHash核心原理解析

    http://www.cnblogs.com/LBSer/p/3310455.html 引子   机机是个好动又好学的孩子,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西。...B树索引本质上是对索引字段进行排序,然后通过类似二分查找的方法进行快速查找,即它要求索引的字段是可排序的,一般而言,可排序的是一维字段,比如时间、年龄、薪水等等。...随着每次迭代区间[a,b]总在缩小,并越来越逼近39.928167; 4)如果给定的纬度x(39.928167)属于左区间,则记录0,如果属于右区间则记录1,这样随着算法的进行会产生一个序列1011100...[-180,180],可以对经度116.389550进行编码。...为什么分别给经度和维度编码?为什么需要将经纬度两串编码交叉组合成一串编码?本节试图回答这一问题。

    1.4K30

    Redis源码阅读(一)总体概览

    而使用HLL时并不是真正添加项到HLL中(这一点和SETS结构差异很大),因为HLL的数据结构只包含一个不包含实际元素的状态。 操作: PFADD:用于添加一个新元素到统计中。...Geo 底层数据类型:zset Redis的GEO特性在 Redis3.2版本中推出,这个功能可以将用户给定的地理位置(经度和纬度)信息储存起来,并对这些信息进行操作。...GEODIST命令在计算距离时会假设地球为完美的球形。在极限情况下,这一假设最大会造成0.5%的误差。...简单来说,GeoHash将一个空间分割成一个个小方块,我们可以通过查询给定经纬度所在方格周围的4个或者8个方格,以此进行“周边查找”。...如果数据量过亿,就需要对 Geo 数据进行拆分,按国家/省/市拆分,甚至按区拆分,以降低单个 zset 集合的大小。

    77730

    Redis GEO地理位置

    Redis GEO实现主要包含了以下两项技术: 使用geohash保存地理位置的坐标。 使用有序集合(zset)保存地理位置的集合。...GEOADD 命令以标准的 x,y 格式接受参数, 所以用户必须先输入经度, 然后再输入纬度。 GEOADD 能够记录的坐标是有限的: 非常接近两极的区域是无法被索引的。...从键里面返回所有给定位置元素的位置(经度和纬度)。 GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成: 第一个元素为给定位置元素的经度, 而第二个元素则为给定位置元素的纬度。...GEODIST 命令在计算距离时会假设地球为完美的球形, 在极限情况下, 这一假设最大会造成 0.5% 的误差。...GEOHASH 命令返回一个数组, 数组的每个项都是一个 geohash 。 命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。

    1.8K40

    空间索引 - GeoHash算法及其实现优化

    假想一个与地轴方向一致的圆柱切或割于地球,按等角条件,将经纬网投影到圆柱面上,将圆柱面展为平面后,即得本投影。墨卡托投影在切圆柱投影与割圆柱投影中,最早也是最常用的是切圆柱投影。...如(116.276349, 40.040875)这个点的经度划分: 经度在 [-180,0) 范围内的标识为0,经度范围在 [0, 180) 度的标识为 1; 继续划分,经度范围在 [0,90) 的标识为...如果每个方格的精度为 2km,那么我们直接按照前缀查询红点附近 2km 的点是查找不到离它很近的黑点的。...Redis的GEO函数 问题 我们常见的需求是查找 n米 范围内的点,那么 n米 与 GeoHash 码位数之间的映射如何实现呢?...我们在划分地图时,每多划分一次,会添加经度和纬度两个二进制位,在精度最高时,那么每一个方格的最大值和最小值之间差1。由此,我们通过下面的方法获取到一个方格的最大和最小 score 值之差。

    2K90

    是什么能让 APP 快速精准定位到我们的位置?

    那么,这些APP是怎么做到,既能精准定位,又能快速查找呢?答案就是 geohash geohash通过算法将1个定位的经度和纬度2个数值,转换成1个hash字符串。...然后通过数据库中like操作符 “ like wtw366%” 快速查找到附近的车。...地球铺平面图 以赤道和本初子午线为界,将地球分为经度和纬度。赤道是在0度,本初子午线也在0度。以赤道作为经度X横坐标,以本初子午线作为纬度 Y 竖坐标。...比如上海腾讯大厦的定位就是:(31.1688749, 121.3975184)表示的是:纬度=31.1688749,经度=121.3975184 上海腾讯大厦经纬度图 geohash原理解析 在了解什么是经纬度之后...那我们还是用腾讯大厦的geohash值,分别截取经度为前7,6,5位看看,在地图上是怎么样的: 精度为7,153m范围内 精度为6,1.22km范围内 精度为5, 4.89km范围内 所以,根据上面的图

    1.6K30

    揭秘!是什么能让APP快速精准定位?

    在数据库里,把经纬度都标记为索引,通过查找对比经纬度的值,来找到附近1km的车子,但是这种做法第一是索引比较多,数值比较大,二是需要循环遍历经纬度,查询会很慢,效率很低。...那么,这些APP是怎么做到,既能精准定位,又能快速查找呢?答案就是geohash。 geohash通过算法将1个定位的经度和纬度2个数值,转换成1个hash字符串。...然后通过数据库中like操作符“like wtw366%”快速查找到附近的车。...我们将地球铺平开来,会得到下面这个平面图: 以赤道和本初子午线为界,将地球分为经度和纬度。赤道是在0度,本初子午线也在0度。...那我们还是用腾讯大厦的geohash值,分别截取经度为前7,6,5位看看,在地图上是怎么样的: 所以,根据上面的图,随着字符越来越少,精度越来越小,这个矩形也越来越大,这一整块区间都共用一个geohash

    1.5K20
    领券