作者:carson_ho
目录
定义
- 微信团队开源、基于 mmap 内存映射的 key-value 存储组件
- 是一个类似于SharedPreferences的轻量级存储方案
优点
- 操作灵活、安全性高:通过 mmap 内存映射文件,提供了一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失;
- 空间占存少、数据量精简:底层序列化/反序列化使用 protobuf 实现,以最少的数据量能表示最多的信息
- 性能高:增量更新,避免每次进行相对增量来说大数据量的全量写入。
出现的意义
MMKV的出现是微信团队为了替代SharedPreferences的轻量级存储解决方案。SharedPreferences需要被替换的原因主要是存在下述问题:
1. 读写效率低
主要原因是其本身的读写方式导致的:
- 读写方式:I/O
- 数据格式:xml
- 写入方式:全量更新
即每当需要更新一项数据,SharedPreferences的整个读写过程都是:将**「所有数据」**转化成xml格式 -> 通过I/O方式写入
2. 容易导致ANR
主要是由于同步提交(commit)、异步提交(Apply) 和 获取数据getXX()导致的。
/*
* 1. 同步提交commit
* commit提交是同步的,直到磁盘操作成功后才会完成
* 所以当数据量比较大时,使用commit很可能引起ANR
*/
public boolean commit() {
MemoryCommitResult mcr = commitToMemory();
SharedPreferencesImpl.this.enqueueDiskWrite(mcr, null);
try {
mcr.writtenToDiskLatch.await();
} catch (InterruptedException e) {
return false;
}
/*
* 回调的时机