资深安卓研发大佬详解MMKV:谷歌都推荐使用的轻量级存储方案

MMKV是微信团队为解决SharedPreferences的效率和安全性问题推出的轻量级存储组件。它基于内存映射MMAP和Protobuf,提供高效读写、低数据丢失风险、增量更新等功能,有效避免ANR。文章详细介绍了MMKV的工作原理和优势。
摘要由CSDN通过智能技术生成

作者:carson_ho


定义

  1. 微信团队开源、基于 mmap 内存映射的 key-value 存储组件
  2. 是一个类似于SharedPreferences的轻量级存储方案

优点

  1. 操作灵活、安全性高:通过 mmap 内存映射文件,提供了一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失;
  2. 空间占存少、数据量精简:底层序列化/反序列化使用 protobuf 实现,以最少的数据量能表示最多的信息
  3. 性能高:增量更新,避免每次进行相对增量来说大数据量的全量写入。

出现的意义

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;
  }

  /*
   * 回调的时机
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值