概述

MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。    GitHub地址:https://github.com/Tencent/MMKV

MMKV原理

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

2)数据组织:数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。

3)写入优化:考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。

4)空间增长:使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。

1. Android中使用

1.1 添加依赖

    ​dependencies {implementation 'com.tencent:mmkv-static:1.2.2''}

1.2 初始化

MMKV 的使用非常简单,所有变更立马生效,无需调用 syncapply。 在 App 启动时初始化 MMKV,设定 MMKV 的根目录(files/mmkv/),例如在 Application 里:

   public class MyApp extends Application {private static final String TAG = MyApp.class.getSimpleName();@Overridepublic void onCreate() {super.onCreate();String rootDir = MMKV.initialize(this);Log.i(TAG,"mmkv root: " + rootDir);}
}

1.3 CRUD 操作

1)MMKV 提供一个全局的实例,可以直接使用:

import com.tencent.mmkv.MMKV;
...
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")));

2)删除与查询

MMKV kv = MMKV.defaultMMKV();// 移除指定的key
kv.removeValueForKey("bool");
System.out.println("bool: " + kv.decodeBool("bool"));// 移除一组key
kv.removeValuesForKeys(new String[]{"int", "long"});
System.out.println("allKeys: " + Arrays.toString(kv.allKeys()));boolean hasBool = kv.containsKey("bool");

3)如果不同业务需要区别存储,也可以单独创建自己的实例:

MMKV mmkv = MMKV.mmkvWithID("MyID");
mmkv.encode("bool", true);

4)如果业务需要多进程访问,那么在初始化的时候加上标志位 MMKV.MULTI_PROCESS_MODE

MMKV mmkv = MMKV.mmkvWithID("InterProcessKV", MMKV.MULTI_PROCESS_MODE);
mmkv.encode("bool", true);

1.4 支持的数据类型

1)支持一下Java语言基础类型:

boolean、int、long、float、double、byte[]。

2)支持一下Java类和容器:

String、Set<String>、任何实现了Parcelable的类型。

1.5 SharedPreferences 迁移

1) MMKV 提供了 importFromSharedPreferences() 函数,可以比较方便地迁移数据过来。

2)MMKV 还额外实现了一遍 SharedPreferences、SharedPreferences.Editor 这两个 interface,在迁移的时候只需两三行代码即可,其他 CRUD 操作代码都不用改

    private void testImportSharedPreferences() {//SharedPreferences preferences = getSharedPreferences("myData", MODE_PRIVATE);MMKV preferences = MMKV.mmkvWithID("myData");// 迁移旧数据{SharedPreferences old_man = getSharedPreferences("myData", MODE_PRIVATE);preferences.importFromSharedPreferences(old_man);old_man.edit().clear().commit();}// 跟以前用法一样SharedPreferences.Editor editor = preferences.edit();editor.putBoolean("bool", true);editor.putInt("int", Integer.MIN_VALUE);editor.putLong("long", Long.MAX_VALUE);editor.putFloat("float", -3.14f);editor.putString("string", "hello, imported");HashSet<String> set = new HashSet<String>();set.add("W"); set.add("e"); set.add("C"); set.add("h"); set.add("a"); set.add("t");editor.putStringSet("string-set", set);// 无需调用 commit()//editor.commit();}

2.MMKV的基本使用相关推荐

  1. 腾讯开源基于 mmap 的高性能 key-value 组件 MMKV

    腾讯微信团队宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性.MMKV 从 2015 年中至今,在 ...

  2. android mmkv使用_MMKV解读

    一.首先看一下介绍(mmkv官方介绍) MMKV--基于 mmap 的高性能通用 key-value 组件 MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 ...

  3. Android 三方库lottie、mmkv的使用

    lottie lottie是Airbnb开源的一个面向 iOS.Android.React Native 的动画库,能实现精美.复杂的动画效果. Android端使用方法 首先,需要在当前项目的bui ...

  4. SharedPreferences保存对象以及集合,腾讯MMKV使用,保存搜索历史

    腾讯MMKV使用 implementation 'com.tencent:mmkv-static:1.2.9' MMKV.initialize(this);//会返回MMVK存储的目录(String) ...

  5. MMKV_微信MMKV源码分析(一) | 整体流程

    在使用MMKV框架前,需调用以下方法进行初始化 MMKV.initialize(context); 复制代码 这里的 Java 层主要是获取到保存文件的路径,传入Native层,这里默认的路径是APP ...

  6. MMKV:微信团队开源的轻量级存储方案

    目录 定义 优点 出现的意义 原理 定义 基于 mmap 内存映射的 key-value 存储组件 是一个类似于SharedPreferences的轻量级存储方案 微信团队开源 优点 操作灵活.安全性 ...

  7. 神器Android键值数据库MMKV——基于 mmap 的高性能通用 key-value 组件

    MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强.从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证 ...

  8. Android MMKV

    本文转自微信开发团队凌国的分享.原文 MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强.从 2015 年中 ...

  9. 【Android源码面试宝典】MMKV从使用到原理分析(一)

    去年,我们写过一篇文章,对于android原生提供的key-value存储API SharePreference,进行了从使用到原理的深入分析,同时对其中存在的ANR问题.存取慢等问题,进行了深入的探 ...

  10. 【Android源码面试宝典】MMKV从使用到原理分析(二)

    上一章节,我们从使用入手,进行了MMKV的简单讲解,我们通过分析简单的运行时日志,从中大概猜到了一些MMKV的代码内部流程,同时,我们也提出了若干的疑问?还是那句话,带着目标(问题)去阅读一篇源码,那 ...

最新文章

  1. 2022-2028年中国高纯铜市场研究及前瞻分析报告
  2. 斯坦福Google | 面向机器人的机器学习(附63页PPT下载)
  3. Task和async/await详解
  4. mvc:default-servlet-handler /说明
  5. PAT (Basic Level) Practise:1037. 在霍格沃茨找零钱
  6. 第三次学JAVA再学不好就吃翔(part109)--LineNumberReader类
  7. react-native run-android的输出
  8. 《深入理解Java虚拟机》读书笔记一
  9. 函数计算助力语雀构建稳定且安全的业务架构
  10. 重磅!2020中国高校毕业生月薪排名:清华第1,24高校过万,你呢?
  11. debian9.8无法切换中文输入法
  12. faster-rcnn tensorflow windows python 训练自己数据
  13. mysql数据库远程安装,Linux_15:解决远程安装数据库
  14. python浮点数多少位_Python中的最大浮点数是多少?
  15. 自学Python:批量转换WORD文档为PDF
  16. amf webgame
  17. ROS ros::NodeHandle nh(“~“)
  18. pycharm “collecting data“
  19. 根据时间段自动调节pulseaudio音量
  20. archlinux 安装chrome浏览器

热门文章

  1. 如何将一个向量投影到一个平面上_到标准单纯型集合的投影算法
  2. 寒冬之际,VIPKID为何能逆势获得腾讯“再”投资?
  3. 3大顶级设计大师谈关卡设计
  4. 数据库表和列的别名的用法
  5. 健康评测 php,知名眼科医生评测6款网课健康度:VIPKID表现最优
  6. Spring面试之循环依赖详解
  7. ISO8583报文组装解析工具和定义器示例
  8. css定位(子绝父相)
  9. 计算机一级理论课及答案,2012年(秋)江苏省计算机一级B理论部分(IT01)附答案
  10. 关于确界的一些知识点