Redis的GEO
除了Redis的几种基础类型,为了更多丰富的功能,Redis还提供了一些额外的类型,例如BitMap HyperLogLog 等。而用户LBS的场景,可以使用GEO来解决,例如目前已知有10个店铺的经纬度,和用户个人的经纬度,快速选出离用户最近的点,就可以使用GEO来解决。
GeoHash编码格式
假设现在A店铺的地址为(116.37,39.86) ,每一组的地址都由2个值组成,这样进行比较是非常不方便的,因此需要通过一种编码的格式,来转化为一个值,这样比较起来就很方便
GeoHash,分别处理经度和维度
经度:把经度分为 -180-0 和 0-180,2个区间,分别为0 和 1 ,第二次,116 落在0-180之间,所以第二次再次分为2个区间 0-90 和90-180 ,分别为0和1 ,依次类推,最后经过5次分区,得到 11010 这个编码
维度 : 把整个维度分为-90-0 和 0-90 2个区间,分别为0和1 ,第二次,39 落在0-90 所以第二次再次分为2个区间 0-45 45-0,一次类推,最后经过5次分区得到10111这个编码
最后把2个编码一次穿插起来,维度的编码第一个插入
用了 GeoHash 编码后,原来无法用一个权重分数表示的一组经纬度(116.37,39.86)就可以用 1110011101 这一个值来表示,就可以保存为 Sorted Set 的权重分数了
GeoHash 误差
通过多次的区间分割,在一个平面上得到多个小格子,通过小格子的编码就可以知道彼此之间的大小关系。在不考虑地球的曲面率的情况下,这样去规划一个平面是误差很小的,而且对于一些不要求非常精准的业务来说,非常的省时省力。
可是,这样的算法还是存在一定的误差
在这个图里面,0111 和 1000 是相邻的2个格子,但是从图中可以看出来,其实2者的位置相差甚远,所以,为了避免查询不准确问题,我们可以同时查询给定经纬度所在的方格周围的 4 个或 8 个方格
GEO相关API
更多的API和方法,可以通过网上查找