随着日常生活中的 位置信息服务(LBS)越来越多。比如笔者就职的物流平台行业,福州本地飞速发展的朴朴生活超市,以及外卖、打车都离不开GEO这个技术。

首先我们分析一下LBS的需求:

  • 支持某一个事物的经纬度位置保存
  • 支持点附近点的匹配
  • 支持根据事物的ID查询事物具体信息

在Redis中Hash类型就可以很好的支持key对应位置的存取,比如车辆位置

Redis 高级数据结构GEO_GEO

但Hash类型元素无序,不满足范围查询。

想到有序,自然的我们想到可不可以用Sorted Set保存。如下:Redis 高级数据结构GEO_GEO_02

存取一样可以满足,但需要解决的是Sorted Set元素权重分数需要是一个数字(可以是浮点数),经纬度是两个值,是没法直接保存为一个浮点数的。

于是乎,我们需要借助GeoHash编码来进行转化。 GeoHash编码原理简单来说就是八个字:二分区间,区间编码

首先我们把地图想像为一个正方形 分为4份,如图Redis 高级数据结构GEO_Redis_03这样就可以把而为空间映射为一个一维的空间。每个方格又能进一步划分,划分越细,对应的地理空间越小,精度越大。Redis 高级数据结构GEO_GEO_04