一篇文章带你使用(MMKV--基于 mmap 的高性能通用 key-value 组件)

news2024/12/23 10:07:39

一、MMKV是什么?

MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。也是腾讯微信团队使用的技术。

支持的数据类型

  • 支持以下 Java 语言基础类型:
    • boolean、int、long、float、double、byte[]
  • 支持以下 Java 类和容器:
    • String、Set<String>
    • 任何实现了Parcelable的类型

二、MMKV的优点

1、 高性能:MMKV使用了一些技术手段,如mmap文件映射和跨进程通信的共享内存,以实现更高效的数据存取操作。MMKV的性能比SharedPreferences快数十倍,尤其在读写大量数据时效果更加明显。

profile_android_mini

2、小存储体积:这是因为MMKV使用了一种更高效的序列化算法,并且将数据存储在二进制文件中,避免了XML解析和序列化的开销。相同数据量情况下,MMKV的存储体积可以减少50%以上。

3、 跨进程共享:MMKV支持多进程间的数据共享,这对于需要在多个进程之间传递数据的应用程序非常有用。MMKV通过共享内存和文件锁定机制来确保跨进程读写数据的一致性和安全性。

4、API简单易用:MMKV提供了简洁、易用的API,使数据存取变得更加方便。

三、使用方法

官方文档:MMKV——基于 mmap 的高性能通用 key-value 组件

1、添加如下依赖:

implementation 'com.tencent:mmkv:1.3.1'

2、初始化MMKV

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

例如:在您的应用程序的入口点(通常是Application类)中添加以下代码:

        String rootDir = MMKV.initialize(this);
        Log.e(TAG, "MMKV: "+rootDir);

这就是MMKV的存储路径

image-20231108210047549

3、存储和读取数据

3 .1 获取全局MMKV实例

MMKV提供了一个全局的实例,也就是说只需要在Application中加载一次就可以全局使用他了。

        //获取全局MMKV
        MMKV mmkv = MMKV.defaultMMKV();

3.2存储数据

int value = 1;
//存储数据
mmkv.encode("Id",value);

在这里可以看见MMKV是使用键值对的方法进行存储

image-20231108210428584

3.3 读取数据

        //读取数据
        int idValue =  mmkv.decodeInt("Id");
        Log.e(TAG, "idValue: "+idValue);

上述代码将从名为"Id"的键中读取存储的值并将其分配给value。

注意事项:MMKV可以存储各种类型的数据,包括String、Int、Float、Double、 ByteArray等。您只需要根据需要使用相应的encode和decode方法

image-20231108210713171

image-20231108210850700

3.4 删除数据

//删除数据
mmkv.remove("Id");

//读取数据
int idValue =  mmkv.decodeInt("Id");
Log.e(TAG, "idValue: "+idValue);

image-20231108211050307

四、自定义MMKV

4.1 自定义mkkv的表名

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

String rootDir = MMKV.initialize(this);
Log.e(TAG, "MMKV: "+rootDir);

MMKV kv = MMKV.mmkvWithID("MyID");
Log.e(TAG, "MMKV: "+kv);

注意一定要先initialize MMKV才能建立新的表

image-20231108212050176

image-20231108212041857

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

MMKV kv = MMKV.mmkvWithID("InterProcessKV", MMKV.MULTI_PROCESS_MODE);

4.2 自定义MMKV路径

初始化时指定自定义的MMKV存储路径

        String rootDir = MMKV.initialize(this, "/sdcard/mymmkv");
        Log.e(TAG, "MMKV: "+rootDir);

image-20231108212341232

五、SharedPreferences 迁移

  • MMKV 提供了 importFromSharedPreferences() 函数,可以比较方便地迁移数据过来。
  • MMKV 还额外实现了一遍 SharedPreferencesSharedPreferences.Editor 这两个 interface,在迁移的时候只需两三行代码即可,其他 CRUD 操作代码都不用改。
        //获取SharedPreferences实例:
        SharedPreferences sharedPreferencesOld = getSharedPreferences("your_sharedPreferences_name", Context.MODE_PRIVATE);

        //调用importFromSharedPreferences()进行数据迁移:
        MMKV mmkv = MMKV.mmkvWithID("NewsharedPreferences");
        mmkv.importFromSharedPreferences(sharedPreferencesOld);

        //可选:删除旧的SharedPreferences
        sharedPreferencesOld.edit().clear().apply();

六、MKKV的缺点

1、导致ANT

因为是同步存储数据,因此小的数据读写非常快,但是大的数据读写就不如SP了,同步存储大的数据会使得主线程卡顿导致ANT。

2、无备份

由于直接在磁盘存储,所以如果系统出现问题会导致数据直接丢失,在这方面SP是有备份的。

3、不支持复杂的数据类型

但是也没必要存储复杂数据类型,SP也不支持复杂数据类型,后面用Room存储复杂的数据类型就行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux安装jdk和weblogic易错点

1.版本问题&#xff0c;如果版本不兼容&#xff0c;安装的时候会报错&#xff0c;所有安装之前要确认好版本 jdk1.6&#xff0c;weblogic10 2.jdk安装后配置文件 JAVA_HOME ,CLASSPATH,PATH&#xff0c;配置问你的追加&#xff0c;用冒号链接 修改后需要用source 刷新下 3安装…

SpringCloudAlibaba系列之Nacos配置管理

目录 说明 认识配置中心 Nacos架构图 Nacos配置管理实现原理 核心源码分析-客户端 核心源码分析-服务端 配置修改的实时通知 主流配置中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos配置中心的一些实现&#xff0c;很多细节没有涉及&#…

接口---默认方法

用户操作界面 package Default;public class Dome02interface {public static void main(String[] args) {// 创建实现类对象 // MyInterfaceDefaultA A new MyInterfaceDefaultA(); // A.method01(); // System.out.println("--------------"); // 调用默认方…

Linux下找出吃内存的方法

几个 个 Linux 内存查看方法 1、free命令 2、 vmstat命令 3、 /proc/meminfo 命令 4、 top命令 5、 htop 命令 6、查看进程内存信息 内存性能指标 系统内存使用情况&#xff0c;比如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等。 共享内存是通过 tmp…

RISC-V处理器设计(五)—— 在 RISC-V 处理器上运行 C 程序

目录 一、前言 二、从 C 程序到机器指令 三、实验 3.1 实验环境 3.11 Windows 平台下环境搭建 3.12 Ubuntu 平台下环境搭建 3.13 实验涉及到的代码或目录 3.2 各文件作用介绍 3.2.1 link.lds 3.2.2 start.S 3.2.3 lib 和 include 目录 3.2.4 common.mk 3.2.5 demo …

【python海洋专题四十三】海洋指数画法--单色渐变柱状图

【python海洋专题四十三】海洋指数画法–单色渐变柱状图 【python海洋专题四十三】海洋指数画法–单色渐变柱状图 数据:AMO_index 数据:AMO_index 结果展示: 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二…

C++学习---动态内存

文章目录 堆和栈new和delete操作符数组的动态内存分配对象的动态内存分配 堆和栈 在C中 栈&#xff1a;是一种静态内存分配区域&#xff0c;用于存储局部变量和函数调用的上下文信息。在栈上的内存分配和释放都是自动管理的&#xff0c;遵循后进先出&#xff08;LIFO&#xf…

从vue源码中看diff算法

一、v-for必须要指定key&#xff0c;其作用是什么&#xff1f; 在源码中有一个函数为&#xff0c;其中就是通过判断两个vnode的type和key进行判断&#xff0c;如果这两个属性相同&#xff0c;那么这两个vnode就是相同&#xff0c;所以在设置key的时候也不可以设置为object等无…

基于SSM的二手车交易网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

网工内推 | 上市公司,云平台运维,IP认证优先,13薪

01 上海新炬网络信息技术股份有限公司 招聘岗位&#xff1a;云平台运维工程师 职责描述&#xff1a; 1、负责云平台运维&#xff0c;包括例行巡检、版本发布、问题及故障处理、平台重保等&#xff0c;保障平台全年稳定运行&#xff1b; 2、参与制定运维标准规范与流程&#x…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割5(训练篇)

在本系列的开篇&#xff0c;就对整个项目训练所需要的所有模块都进行了一个简要的介绍&#xff0c;尤其是针对训练中需要引入的各个结构&#xff0c;进行一个串联操作。 而在之前的数据构建篇和网络模型篇中&#xff0c;都对其中的每一个组块进行了分别的验证&#xff0c;预先…

python3+requests接口自动化测试框架

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…

MCU常见通信总线串讲(四)—— SPI总线协议

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

什么是API接口测试?这可能是全网最全的教程了!

什么是 API &#xff1f; API 是“应用程序编程接口”的缩写&#xff0c;是一种允许不同应用程序之间相互通信和交换数据的接口。就好像在餐厅点餐一样&#xff0c;你只需要告诉服务员你想要的食物&#xff0c;而不需要了解厨房中的具体操作&#xff0c;服务员会把你的订单传递…

深入asyncio:构建异步应用

文章目录 异步I/O操作示例:异步网络请求异步任务管理示例:并发执行多个任务使用异步队列示例:生产者-消费者模式在现代软件开发中,异步编程已经成为提高应用性能和响应性的关键技术之一。Python的asyncio库为编写单线程并发代码提供了强大的支持。本文将深入探讨asyncio的三…

CCF CSP认证 历年题目自练Day44

题目一 试题编号&#xff1a; 201612-3 试题名称&#xff1a; 权限查询 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   授权 (authorization) 是各类业务系统不可缺少的组成部分&#xff0c;系统用户通过授权机制获得系统中各个…

python教程:把多张图片,合并成一张图

D:\Wdpython\environment\Scripts\python.exe D:/Wdpython/爬虫/测试8.py 图片列表 10 [‘刘亦菲/刘亦菲_1.jpg’, ‘刘亦菲/刘亦菲_11.jpg’, ‘刘亦菲/刘亦菲_12.jpg’, ‘刘亦菲/刘亦菲_13.jpg’, ‘刘亦菲/刘亦菲_15.jpg’, ‘刘亦菲/刘亦菲_2.jpg’, ‘刘亦菲/刘亦菲_3.jp…

MacOS升级后命令行出现xcrun: error: invalid active developer path报错信息

在Mac上用g编译cpp文件时&#xff0c;出现以下&#xff08;类似于工具环境问题的&#xff09;报错&#xff1a; 解决方案&#xff1a;重新安装最新版的MacOS Command Line Tools xcode-select --install重新尝试编译&#xff1a; 编译成功&#xff08;忽略这个warning&…

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

一、EMQX介绍 这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。 Windows版本的看这里: https://blog.csdn.net/xiaolong1126626497/article/details/1…

蓝桥杯每日一题2023.11.8

题目描述 题目分析 对于输入的abc我们可以以a为年也可以以c为年&#xff0c;将abc,cab,cba这三种情况进行判断合法性即可&#xff0c;注意需要排序去重&#xff0c;所以考虑使用set 此处为纯模拟的写法&#xff0c;但使用循环代码会更加简洁。 方法一&#xff1a; #include&…