redis的geo底层实现学习

本文介绍了Geo底层技术如何利用Zset数据结构存储地理位置信息,重点讲解了GeoHash编码方法,包括Peano空间填充曲线的应用和经度纬度错开融合的编码策略,以及Base32编码在查询中的作用,以提高地理范围查询的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

geo底层实现学习

参考的博客:

下面是个人理解

● geo底层用的其实就是zset,根据经纬度编码后的值作为set元素的score
● 总的来说:将三维转为二维,再转为一维
● Redis 采用了业界广泛使用的 GeoHash 编码方法,这 个方法的基本原理就是“二分区间,区间编码”。
● 通过将经度和纬度分别放在奇数位和偶数位,可以使得 zset 中相邻的 geohash 编码在地理空间上也是相邻的:我的人的理解是:首先GeoHash算法使用的是Peano空间填充曲线,如下
在这里插入图片描述

● 这就很明显了,0000->0001->0010…这里编码相似的距离也相似,除开突变性Peano空间填充曲线最大的缺点就是突变性,有些编码相邻但距离却相差很远,比如0111与1000,编码是相邻的,但距离相差很大。
● 那么我们将地图上的经纬度的表示为编码时,应该也要遵循编码相似,距离相似的原则。
● 这就可以引出为何要经度纬度相邻放,经度放偶数,纬度放奇数。
● 我们先看个简化的例子,位置A和B的编码分别是(简化了的)11101,11110,这样说明什么?前面三位都是111遵循奇数放纬度,偶数放经度原则,1(纬度)1(经度)1(纬度)的第一个1(纬度)表示A的纬度在【-90,0,90】的右区间【0,90】,第二个1(经度)表示A的经度在【-180,0,180】的【0,180】区间,同理下面的一个1表示A的经度在【0,45,90】的右半区间【45,90】。至于为什么这样编码的话上面的两个链接有提到,这是geohash经度纬度编码的方式。
● 这样子就好理解了,A和B的编码越相似,说明A和B的经纬度所在的区间约相似,那么A和B的距离也就约相似,这也可以解释为何我们要经度纬度错开融合成新的编码。
● 当然经纬度融合的编码最后要经过Base32编码格式,具体如下,就是将5位二进制转换为十进制(0-31),也即对应下表:
在这里插入图片描述

● 我们将base32编码当作zset的score即可,然后就可以根据进行范围的查询
● 个人认为,使用geo查询a点周围5km的数据时,是将a点的经纬度加上5km对应的经纬度,然后进行编码就可以得到一个base32编码格式的值,使用zset的范围查询就可以查到对应的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值