MMKV(3)

2023-10-20 05:36
文章标签 mmkv

本文主要是介绍MMKV(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用时遇到的问题

在项目的构建配置文件(如 Gradle 或 Maven)中添加相应的依赖项。

MMKV 是一个键值存储库,它存储的是原始的字节数组数据。需要存储和检索复杂的对象或数据结构,需要自行进行序列化和反序列化操作。可以使用任何合适的序列化库(如 JSON、Protocol Buffers 等)将对象转换为字节数组,并在读取时进行相反的操作。

读取数据时,需要将字节数组转换回相应的数据类型。确保在读取时进行正确的数据类型转换,以避免类型错误或数据损坏。

支持多线程并发访问。但是,如果应用程序有多个线程同时读写 MMKV 数据,需要确保正确处理同步和互斥的问题,以避免数据竞争和不一致性。

  1. MULTI_PROCESS_MODE(多进程模式):

在多进程模式下,不同进程可以同时访问和修改同一个 MMKV 实例。这意味着多个进程可以共享相同的 MMKV 数据,可以读取和写入相同的键值对。多进程模式对于需要在多个进程之间共享数据的场景很有用,例如应用程序的主进程和后台服务进程之间的通信。在多进程模式下,MMKV 使用了底层的共享内存和文件锁定机制来保证数据的一致性和并发访问的正确性。MMKV 会自动管理共享内存和锁定,无需手动处理。

  1. SINGLE_PROCESS_MODE(单进程模式):

在单进程模式下,MMKV 只能在创建它的进程中访问和修改。其他进程无法访问同一个 MMKV 实例。这意味着每个进程都有自己独立的 MMKV 数据,它们彼此之间是隔离的。单进程模式适用于不需要在多个进程之间共享数据的场景,它可以提供更高的性能和简化的操作。

MMKV 的数据存储是持久化的,意味着数据会在应用程序关闭后保留。然而,如果出现非正常关闭或其他异常情况,可能会导致数据的一致性问题。你可以根据应用的要求,定期进行数据备份或使用其他机制来确保数据的持久性和一致性。

批量操作

一次性处理多个键值对。相比逐个读写操作,批量操作可以减少函数调用和线程同步开销,提升读写性能。尽可能地将相关的读写操作组合成批量操作,可以有效减少系统开销。

定期压缩数据

数据存在一定的冗余或重复,可以考虑定期对MMKV中的数据进行压缩。压缩可以通过使用更高效的压缩算法或去除冗余数据来实现。

数据结构的选用

使用紧凑的二进制格式存储数据,或者使用更高效的数据结构,如哈希表或有序集合,可以优化数据存储和访问的效率。

调整配置参数

可以调整内存映射文件的大小、缓存大小、预分配的存储空间等。通过合理的参数配置,可以进一步优化读写性能和存储空间利用率。

定期清理过期数据

通过设计合理的数据过期策略,并定期清理过期数据,可以保持MMKV的存储空间整洁和高效。

备份数据

  1. 获取MMKV实例:首先,获取要备份的MMKV实例的引用。

  2. 将数据导出为字节数组:使用MMKV的getBytes方法,将MMKV中的数据导出为字节数组。该方法接受一个键名作为参数,并返回相应键的值的字节数组。

  3. 将字节数组保存到文件或其他存储介质:将导出的字节数组保存到文件或其他存储介质中,以进行数据备份。您可以选择将数据保存为二进制文件、JSON文件或其他适合您的格式。

恢复数据

  1. 读取备份数据:从文件或其他存储介质中读取备份数据,并将其加载到内存中。

  2. 获取MMKV实例:获取要恢复数据的MMKV实例的引用。如果MMKV实例不存在,可以使用MMKV的create方法创建一个新的实例。

  3. 将字节数组导入MMKV:使用MMKV的importFromBytes方法,将备份的字节数组导入到MMKV中。该方法接受一个字节数组作为参数,并将其解析为键值对数据,并存储到MMKV中。

细粒度的锁机制

在写入和读取数据时,MMKV会对相应的数据段或数据块进行加锁,以确保同一时间只有一个线程可以修改或读取该数据。

内存映射文件的原子性操作

MMKV使用内存映射文件来实现数据的持久化存储。在写入数据时,MMKV采用了原子性的操作,确保数据的完整性和一致性。这样可以避免多个线程同时写入数据导致的竞态条件和数据损坏问题。

这篇关于MMKV(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245016

相关文章

Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 在 Android 开发中,键值对存储(Key-Value Storage)是一种经常用到的轻量级数据存储方案。它主要用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。 常见的键值对存储方案 1、 SharedPreferences: 一个轻量级的持久

Android 常用开源库 MMKV 源码分析与理解

文章目录 前言一、MMKV简介1.mmap2.protobuf 二、MMKV 源码详解1.MMKV初始化2.MMKV对象获取3.文件摘要的映射4.loadFromFile 从文件加载数据5.数据写入6.内存重整7.数据读取8.数据删除9.文件回写10.Protobuf 实现1.序列化2.反序列化 12.文件锁1.加锁2.解锁 13.状态同步 总结参考文献 前言 谈到轻量级的数

android ——MMKV保存bean实体对象、保存数组bean

MMKV简介 MMKV是一款基于 mmap 内存映射的 key-value 存储库,专门为移动端开发设计。相比于传统的SharedPreferences和SQLite等存储方式,MMKV具有更快的读写速度和更小的存储空间占用。同时,MMKV还提供了多线程安全的支持和可配置的加密选项。因此,在移动端开发中,MMKV被广泛应用于数据持久化和缓存优化等方面。 添加依赖 implementat

SharedPreferences垃圾吗?对比MMKV和DataStore经验之谈

SharedPreferences 很垃圾吗? 嗯,他会阻塞主线程。他可能会崩溃,他可能无法提供大内容的存储,性能比较差,ANR等等。 但是是它的错吗?他的设计本意是提供极少的一些变量存储。结果臃肿的代码和封装写法,过度使用导致了很多问题。 如果不想看全篇,看粗体内容看看你是否有共鸣和不了解的地方,查漏补缺。 目前流行的存储有如下几个我这边自行给出个人使用感受: MMKV 通过内存映

Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移

背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。公司的性能监控平台抓到不少原生 SP 导致的 ANR 问题: java.io.FileDescriptor.sync (FileDescriptor.java)android.os.FileUtils.sync (FileUtils.java:256)android.app.SharedPreferencesI

MMKV 基于 mmap 的高性能通用 key-value 组件

学前介绍 MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的验证。 官方MMKV地址 为什么要替代SharedPreferences? 1,数据加密。 在 Android 环境里,数据加密是非常必须的,SP实际上是

SharedPreference进阶MMKV框架

SharedPreference 简介 顾名思义,Android 开发肯定会使用到SharedPreference。以下简称SP sp是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置。 是以xml文件保到:/data/data/包名/shared_prefs目录下。类似键值对的方式来存储数据。 sp提供了常规的数据类型保存接口比如:int、long、boolean、St

ZUI易入门Android之 MMKV

MMKV是什么?      在Android开发过程中,我们经常会使用到一些存储。经常使用sharepreferences存储,当你的数据量在不需要使用数据库,但sharepreferences感觉又无法承载的时候,但性能卓越的存储框架,由腾讯旗下的微信开发—MMKV 今天我们主要从这几个方面来解释一下MMKV MMKV存储优势MMKV存储支持的数据类型MMKV引入依赖MMKV存储与

web前端开发培训心得,MMKV集成与原理

form表单细节 一、表单 1.表单 标签用于为用户输入创建 HTML 表单 2.表单能够包含 input 元素,比如文本字段、复选框、单选框、提交按钮等等。 3.表单还可以包含 menus、textarea、fieldset、legend 和 label 元素。 4.表单用于向服务器传输数据。 二、表单form 的属性 (一)action属性 action

MMKV(3)

使用时遇到的问题 在项目的构建配置文件(如 Gradle 或 Maven)中添加相应的依赖项。 MMKV 是一个键值存储库,它存储的是原始的字节数组数据。需要存储和检索复杂的对象或数据结构,需要自行进行序列化和反序列化操作。可以使用任何合适的序列化库(如 JSON、Protocol Buffers 等)将对象转换为字节数组,并在读取时进行相反的操作。 读取数据时,需要将字节数组转换回相应的数