MMKV 原理以及使用,面试复盘总结报告

通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。

数据组织:

数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。考虑到我们要提供的是通用 kv 组件,key 可以限定是 string 字符串类型,value 则多种多样(int/bool/double 等)。要做到通用的话,考虑将 value 通过 protobuf 协议序列化成统一的内存块(buffer),然后就可以将这些 KV 对象序列化到内存中。

写入优化: (重点关注这里!!!)

标准 protobuf 不提供增量更新的能力,每次写入都必须全量写入。考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力:将增量 kv 对象序列化后,直接 append 到内存末尾;这样同一个 key 会有新旧若干份数据,最新的数据在最后;那么只需在程序启动第一次打开 mmkv 时,不断用后读入的 value 替换之前的值,就可以保证数据是最新有效的。

空间增长: (还有这里!!!)

使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。例如同一个 key 不断更新的话,是可能耗尽几百 M 甚至上 G 空间,而事实上整个 kv 文件就这一个 key,不到 1k 空间就存得下。这明显是不可取的。我们需要在性能和空间上做个折中:以内存 pagesize 为单位申请空间,在空间用尽之前都是 append 模式;当 append 到文件末尾时,进行文件重整、key 排重,尝试序列化保存排重结果;排重后空间还是不够用的话,将文件扩大一倍,直到空间足够。

数据有效性:

考虑到文件系统、操作系统都有一定的不稳定性,我们另外增加了 crc 校验,对无效数据进行甄别。在 iOS 微信现网环境上,我们观察到有平均约 70万日次的数据校验不通过。

MMKV 使用


依赖:

implementation ‘com.tencent:mmkv:1.0.19’

在Application里面初始化:

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

String rootDir = MMKV.initialize(this);//就这么一句话就行

System.out.println("mmkv root: " + rootDir);

}

支持的数据类型:

支持以下 Java 语言基础类型:

boolean、int、long、float、double、byte[],String、Set,任何实现了Parcelable的类型,对象存储方式是,转化成json串,通过字符串存储,使用的时候在取出来反序列化.

增:

MMKV kv = MMKV.defaultMMKV();

kv.encode(“bool”, true);

System.out.println("bool: " + kv.decodeBool(“bool”));

kv.encode(“int”, Integer.MIN_VALUE);

System.out.println("int: " + kv.decodeInt(“int”));

kv.encode(“long”, Long.MAX_VALUE);

System.out.println("long: " + kv.decodeLong(“long”));

kv.encode(“float”, -3.14f);

System.out.println("float: " + kv.decodeFloat(“float”));

kv.encode(“double”, Double.MIN_VALUE);

System.out.println("double: " + kv.decodeDouble(“double”));

kv.encode(“string”, “Hello from mmkv”);

System.out.println("string: " + kv.decodeString(“string”));

byte[] bytes = {‘m’, ‘m’, ‘k’, ‘v’};

kv.encode(“bytes”, bytes);

System.out.println("bytes: " + new String(kv.decodeBytes(“bytes”)));

注意:mmkv的写入逻辑是:当我们覆盖某个值的时候,它并不会立即删除前面的值,会保留,然后每个key,value有存储限制,当触发存储限制的时候,才会执行删除,这样即使我们频繁的覆盖,也不会引起太多的性能损耗

删:

MMKV kv = MMKV.defaultMMKV();

kv.removeValueForKey(“bool”);

System.out.println("bool: " + kv.decodeBool(“bool”));

kv.removeValuesForKeys(new String[]{“int”, “long”});

System.out.println("allKeys: " + Arrays.toString(kv.allKeys()));

改:

直接在存一遍就是.(执行增步骤)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

推荐学习资料

  • Android进阶学习全套手册

  • Android对标阿里P7学习视频

  • BAT TMD大厂Android高频面试题

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
T TMD大厂Android高频面试题

[外链图片转存中…(img-tbQhiqKU-1712800484574)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Fl35gVhe-1712800484575)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值