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分钟后失效;如果在小程序中,缓存随着小程序生命周期的结束而销毁。