GeoHash核心原理解析

https://www.cnblogs.com/LBSer/p/3310455.html

哈啰地图服务组件 - LBS SDK https://mp.weixin.qq.com/s/c-A_x-GVXJpHVUHCJ0W5nA

 

前端缓存优化

逆地理编码缓存如何实现

  • 选择一个合适的算法,用于生成缓存的CacheKey

  • 选择一个合适的缓存容器,用于存储逆地理编码响应数据

  • 选择合适的淘汰机制,用于数据的更新

  • 根据CacheKey命中缓存

 

图片

 

如何提升缓存命中效率

通过GeoHash算法,进行一定误差范围内的经纬度匹配。

  • GeoHash是一种地址编码方法,他能够把二维的空间经纬度数据编码成一个字符串

  • 算法思想:GeoHash表示的并不是一个点,而是一个矩形区域,编码越长,表示的范围越小,位置也越精确,GeoHash编码的前缀可以表示更大的区域。例如wx4g0ec1,它的前缀wx4g0e表示包含编码wx4g0ec1在内的更大范围

     

图片

 

GeoHash 算法原理

1. 经纬度划分

经度范围是东经180到西经180,纬度范围是南纬90到北纬90,我们设定西经为负,南纬为负,所以地球上的经度范围就是[-180, 180],纬度范围就是[-90,90]。

 

如果纬度范围用二进制代表:

  • [-90°, 0°) => 0

  • (0°, 90°] => 1

  • [-180°, 0°) => 0

  • (0°, 180°] => 1

     

图片

 

2. 编码长度

编码长度就是对方块的划分次数。

 

图片

 

  • 根据设定的编码长度对当前经纬度分别进行划分,得到两组二进制串(10101、01010)后以偶数位放经度,奇数位放纬度的方式合并成一个二进制串(1001100110)

  • 将二进制串划分每5位一组,不足5位补0(10011、00110)

  • 将各组的5位二进制串转成十进制,5bits对应着10进制的数值为0-31(19、6)

  • 用0-9、b-z(去掉a、i、l、o)这32个字母进行Base32编码,即对照下标将其转换为字符串(m、6)

 

3. 编码长度 - 精度范围

在逆地理缓存中编码长度为GeoHash9(5m左右误差)

 

图片

 

缓存淘汰机制

图片

我们采用LRUCache缓存策略,它可以根据访问频率和时间自动淘汰最不常用的数据,保证缓存的空间利用率和数据的新鲜度。

 

原理解析:新数据插入到链表头部;每当缓存命中(即缓存数据被访问),则将数据移到链表头部;当链表满的时候,将链表尾部的数据丢弃。

 

其他维度的数据更新机制:

  • 时间维度:我们限制只使用2天内的数据,如超过则淘汰数据,重新请求并缓存

  • 访问次数维度:我们限制数据使用10次后,会主动淘汰数据,重新请求并缓存

 

请求缓存

计算CacheKey,缓存请求Promise,下一次请求调用发起时,先尝试命中缓存,若命中则返回上一次调用缓存下来的Promise。

 

更新机制:缓存只在一次请求生命周期内有效,请求成功或失败后缓存都将删除。

 

解决问题:同一接口重复调用的场景下,解决并发调用的问题,只要上一次响应没有返回,下一次就不会重复发起相同请求。比如:进入“打车”首页时多次调用某个接口的场景下;重复点击按钮执行某个操作的场景。

 

图片

 

响应结果缓存

计算CacheKey,请求成功后,缓存响应结果,下一次请求调用发起时,先尝试命中缓存,若命中则返回缓存中的数据。

 

更新机制:使用LRUCache作为缓存容器,存储超过10条数据后陈旧数据将会被淘汰;缓存超过5分钟后失效;如果在小程序中,缓存随着小程序生命周期的结束而销毁。

 

图片

 

 

 

posted @ 2019-12-07 14:25  papering  阅读(228)  评论(0编辑  收藏  举报