背景
前些时间为了解决不方便查看小县城当地公交发车时刻表(十八线小县城,主流公交APP未收录当地公交)的问题,开发了一个微信小程序「小事快查」
面临的问题
公益免费无收益
但是这个小程序本身就是公益性质的,没有收入来源,也就没有打算买服务器,如果买了服务器每年都是一笔开销,而且还要长期维护。
因此就只把从媒体上收集来的公交数据内置到小程序里了,但是后面发现还有一些新的零散的线路数据没有收录。
内置数据更新审核周期长
要增加公交线路数据还得修改代码,重新提交审核,流程有点长。
探索方案
因此,就想着不用服务器也能动态更新数据的方案,国内能实现的方案很有限,国际上有很多免费的资源可以用,有免费的 redis 和数据库,但是因为众所周知的原因,在国内要不访问缓慢,或者根本就不通。
解决办法
经过一番思索,目前能想到的唯一还算稳定一点的方案,就是利用 git 的代码仓库,把数据放到代码仓库中,然后动态获取代码仓库中指定的源文件。当然这种方案只适合数据更新不那么频繁,且访问量不是特别大的情况。
利用 Git Gitee 仓库的raw链接
说干就干,于是在 gitee 上单独创建了一个 Git 仓库,用于存放更新数据,为了最小化更新请求,把数据分成了两个部分,一个是主文件存放数据版本信息,另一个就是线路数据文件。
拆分数据
主文件很小,就一个config.json,里面放数据版本号、公告信息。小程序每次启动就先请求这个文件,拿到数据版本号跟本地的对比,发现有更新才去请求第二个文件——也就是完整的线路数据 routes.json ,获取完整的线路后,会把最新线路数据和数据版本号缓存到本地。
这样大多数时候只需要请求一个几十字节的小文件,不浪费流量。
具体的请求地址就是 gitee 仓库里文件的 raw 链接。
这个链接不需要登录,公开仓库的文件直接就能拿到内容。就是把 gitee 当成了一个免费的静态文件服务器。
要更新数据的时候也简单,本地数据仓库文件,线路数据和数据版本信息, git push 上去,然后用户那边下次打开小程序就能拿到最新的了。
实际运行下来数据更新的流程大概是这样的:
这个方案局限性也很明显,只能用在数据量小、更新不频繁的场景。
但就目前这个阶段来说,够用了,不用操心服务器续费、不用担心数据库挂了。
我的小程序「小事快查」如下: