手机版

小程序LRU收纳设计

时间:2021-12-08 来源:互联网 编辑:宝哥软件园 浏览:

为了解决小程序生成图片与朋友分享的问题,我们启动了画师项目——小程序图像生成库。该计划是开源的,可以移动:github.com/Kujiale-Mob.众所周知,Canvas绘图有很多让人痛苦的漏洞,其中一个就是它的drawImage方法,可以在IDE中直接设置为网络图片的url进行绘图,但是在真机上是做不到的。有了这个坑,我们需要先通过download将图片下载到本地,然后再进行绘制。所以在你的小程序中,如果需要经常画一些图片,并且需要用到网络图片素材,这样会导致你每次画的时候都要重新下载素材图片,造成很大的绘图性能问题。

小程序本身不提供缓存机制,如文件LRU。为了让我们画师的平面图生成得更快,我们开发了一个小程序文件用于LRU存储相关代码。这样,我们就不需要反复下载可能经常使用的绘图材料,大大提高了绘图速度。

介绍下小程序的缓存系统

小程序缓存分为数据缓存和文件缓存。文件缓存分为临时文件缓存和本地文件存储。本地文件存储的大小限制为10M。

数据缓存

我们可以使用小程序提供的一组异步和同步方法来添加或删除结构化数据。同一微信用户、同一小程序的存储上限为10MB。如果空间不足,将在小程序级别执行LRU,也就是说,不经常使用的小程序的数据缓存区将被完全清空。

详见微信官方文档:

developers.weixin.qq.com/miniprogram…

注:数据缓存区在体验版、开发版、和线上版都共用一套,并不会隔离。

文件临时缓存

我们成功调用wx.downloadFile或wx.chooseImage获取文件或图片后,会得到这个文件或图片的临时存储路径。文档中写的是临时路径的生命周期在这个小程序的启动期内。

但是没有说明存储大小的限制,所以理论上不管文件有多大,都可以临时缓存。当然,如果太大,肯定会造成一些神奇的错误。

本地存储

获取临时文件后,我们可以调用接口wx.saveFile将临时文件存储在本地空间,本地空间的存储限制为10M。如果存储已满,以下文件将无法成功存储,并且将报告超出最大存储限制的错误。

我们现在需要做的是在这个本地存储空间上打开一个空间,作为下载文件的存储空间。由于空间有限,我们需要由LRU来管理这个空间。

与本地存储相关的接口可以在以下文档中找到:

developers.weixin.qq.com/miniprogram…

注:把临时文件通过调用 saveFile 成功后,这个临时文件路径就无效了。切记切记。

文件 LRU 存储实现

小程序的本地存储限制在10M,但是没有LRU。现在我们需要结合上面提到的applet的三种存储方式来实现一个下载applet文件的LRU机制。

数据结构设计

{ ' key ' : { ' path ' ://文件存储路径' time': //timestamp,用于记录文件的上次访问时间。当存储空间不足时,将选择未被访问最远的文件进行删除' size': //file size}.上面的数据结构会存在于数据缓冲区(我们后面会称这个区域为存储区),下载器搭建时会从存储区读取到内存中。未来的文件操作也将与存储中记录的文件信息实时同步。

可以理解为存储存储文件的基本信息,路径相当于指向实际文件的指针。

总体流程设计

小程序 LRU  存储设计(图1)

容错

因为存储的存储和文件操作是异步的,所以它们之间可能存在不一致。这里有两种不一致。

首先,存储的一些文件信息被删除了,但是文件本身并没有因为一个神奇的错误而被删除。此外,文件添加成功,但在存储中添加不成功,也是这种情况。

其次,删除存储中的文件信息失败,但文件被删除。

以上两种属性不同,也需要区别对待。对于第一种,文件的存储空间与存储中记录的文件信息不一致,即有空闲文件(不被存储跟踪)。

而第二种,相当于空指针的存在,是绝对需要避免的,因为它会导致你

在拿出一个不存在的文件使用。会直接导致严重bug。

针对以上两种特殊情况,做了以下容错的处理。首先我们要保证文件的删除操作一定要在 storage 成功之后进行。这样保证了第二种不会出错。

而针对第一种游离文件的情况。我们这边会在 saveFile 的时机进行兜底处理。如果存在了游离文件,最终会导致我们空间总大小计算不一致,这可能最终会导致,我们外部逻辑认为可以存储,但实际存储空间已经满了,这样就会导致 saveFile 报错,在 saveFile 出错后,不管啥原因,我们都把涉及到本策略存储相关的内容全部清空掉,重新来过。因为我们一直有 tempFilePath 兜底,所以即使这种情况出现,也不会影响用户正常使用。只是会影响一点用户体验(毕竟一下子没有以前的缓存了)。

注:之所以不像保证第二种情况的方式来保证第一种情况,是因为我觉得不需要为处理极少会出现的错误场景而去浪费性能,影响用户体验。只要我们做好兜底,即使这种错误情况万一真的出现,整个系统也不会因此出问题,还是会正常使用。

写在后面

小程序有很多的坑。目前市面上很多小程序性能体验并不是很好。所以为了做一款高性能的小程序,是需要我们花大量的时间去试错,琢磨的。踩坑不止,生命不惜。

版权声明:小程序LRU收纳设计是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。