想要升级MMKV,先考虑这几种场景

起因

最近一直在搞公司项目的性能优化工作,MMKV的大名已经几乎是无人不知了,毕竟网上很多的MMKV对比SP的存放时间差别太大,很具有诱惑力,所以就想着什么时候先试着做迁移。

修改前的思考

公司的项目比较旧,经手的人很多,粗略计算了一下SP的数量不下5、6个,有的还是存放json数据,所以对启动还是有一些影响,因为Application中最先使用的就是SP。

  1. 部分迁移,因为有很多的SP文件,不敢一次性修改太多,这样测试范围也不可控;
  2. 替换的效果未知,是否可以通过SP和MMKV并行的方案去实施,这样比较稳一点;
  3. 不支持Serializable类型的数据格式,调研一下影响范围,是否有必须要存入这种类型的数据;
  4. 虽然支持Parcelable类型的数据,但是之后更新字段似乎比较的麻烦,或许有其他我不知道的好方案。
  5. 迁移完成的旧数据怎么办?似乎没有什么作用,删掉吧!不然下次importFromSharedPreferences方法会覆盖旧数据或者用一个值去判断?

似乎已经考虑的比较全了,但是有个问题:我现在是做优化,如果SP和MMKV并行的话,那不是会增加耗时吗?

PS:我这里的并行方案是新放的数据存入MMKV,查询数据先从MMKV中查,如果没有从SP中找。

还…是…不要SP了吧,直接用MMKV替换掉。

暴雨前的宁静

自测的时候没有问题,测试过程中也是标记了一些测试范围,也没有反馈出问题来。于是顺利的走过测试流程、封板上线。 时间来到了周五,我按照日常去检查下日志统计,发现了一些奇奇怪怪的崩溃日志。 例如:

    JSON解析出现了Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ 有一些存放的值是,号分割的数组越界问题,同事说这数据最开始的时候就是4,但是线上的问题说的是数组最大是2/3。 熟悉业务的同事告诉我还有一些可能是数据读取的关系。

问题的猜想

我们线下模拟用户场景没有复现出,于是优先找了MMKV的issue看看之前是否有人遇到过。,因为有个报错的地方确实是从子线程去获取数据,翻看了importFromSharedPreferences中的实现,里面也是同步的。但是native那一层数据是通过mmap写入,目前还没有来得及翻看,有了解的大佬可以提供下思路或者见解。

回顾修改前的思考

  1. 如果是旧数据做迁移最好不要删除原来的数据,除非你确定这里的数据没有什么重要的,不过你可能需要和很多人沟通。
  2. 如果可能的话选择共存方案,你可以是AB方案、动态替换方案、热修复方案,总之线上出现问题可以动态配置,不需要升级版本的最好了。
  3. 这种数据的迁移可能是旧数据的问题,所以要测试很多的版本,以防出现脏数据。

以上是我升级过程中的回顾,还是有一些场景没有考虑到,出现了线上的事故。 希望能帮助到看到这篇文章的你,从而避免这些问题。

经验分享 程序员 微信小程序 职场和发展