MMKV:轻巧高效的跨平台键值存储解决方案

MMKV:轻巧高效的跨平台键值存储解决方案

引言

在移动应用的开发中,数据存储是一个至关重要的环节。随着移动应用的普及和功能的增多,应用需要存储和管理各种类型的数据,包括用户配置信息、缓存数据、临时状态等。传统的数据存储方式如SharedPreferences在一些场景下存在性能瓶颈和局限性,因此我们需要寻找一种更轻量、高效的解决方案。

传统的数据存储方式,如SharedPreferences,虽然简单易用,但在某些情况下存在一些不足之处。首先,SharedPreferences存储的数据会被序列化成XML格式,导致存储和读取的速度相对较慢。其次,SharedPreferences是单线程操作的,如果在多个线程同时写入或读取数据,就容易出现数据安全和一致性问题。此外,SharedPreferences的内存占用也相对较高,特别是在存储大量数据时。

为了解决这些问题,我们需要寻找一种更轻量、高效的数据存储解决方案。而MMKV(Meituan Mapped Key-Value)就是一款非常优秀的跨平台键值存储库,由微信团队开发并开源。MMKV具有轻巧高效、跨平台支持的特点,是替代SharedPreferences的理想选择。

接下来,我们将介绍MMKV的优势,以及在移动应用开发中的实际应用场景。我们还会提供MMKV的使用指南,并进行性能测试,验证其高性能特点。最后,我们会总结MMKV的优势和适用场景,鼓励开发者尝试并采用MMKV,以提升应用的数据存储效率和性能表现。

MMKV简介

MMKV 是一个基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。自 2015 年中至今,在微信上得到广泛应用,其性能和稳定性经过了时间的验证。最近,MMKV 已成功移植到 Android / macOS / Win32 / POSIX 平台并且已经开源。

MMKV源起

在微信客户端的日常运营中,时不时就会因特殊文字引起系统 crash。为了解决这个问题,我们需要在关键代码前后进行计数器的加减,通过检查计数器的异常来发现引起闪退的异常文字。但是在一些包含大量 cell 的页面,如会话列表和会话界面,新增的计数器会影响滑动性能,并且这些计数器需要被永久保存以防止意外崩溃。为了满足这些需求,我们需要一个高性能的通用 key-value 存储组件。考虑到防崩溃方案的主要需求是实时写入,而 mmap 内存映射文件正好符合这一要求,我们决定尝试利用它来开发一个 key-value 组件,即 MMKV。

MMKV原理

  • 内存准备:通过 mmap 内存映射文件,为 App 提供一个可随时写入的内存块,App 只需将数据写入其中,而操作系统负责将内存内容写回文件,避免了因崩溃导致数据丢失的风险。
  • 数据组织:为了实现数据序列化,我们采用了 protobuf 协议,该协议在性能和空间利用方面表现优异。
  • 写入优化:考虑到写入更新频繁是主要使用场景,我们需要支持增量更新。因此,我们选择将增量 kv 对象序列化后,追加到内存末尾。
  • 空间管理:使用追加方式实现增量更新可能会导致文件大小无法控制地增长。为了在性能和空间利用之间取得平衡,我们需要做进一步的优化。

MMKV特点

  1. 轻巧高效:MMKV采用内存映射技术,将数据直接映射到内存中,避免了数据的序列化和反序列化过程,从而提高了读写速度。
  2. 跨平台支持:MMKV不仅支持在Android平台上使用,还提供了iOS、Windows等多个平台的支持,使开发者可以在不同平台上统一使用MMKV进行数据存储。
  3. 性能优越:相较于传统的SharedPreferences,MMKV具有更好的性能表现,尤其在大量数据读写和多线程操作时表现更为出色。

与SharedPreferences相比,MMKV在性能和功能上有明显优势。SharedPreferences的数据存储采用XML格式,而MMKV直接将数据映射到内存中,避免了XML解析过程,因此读写速度更快。此外,MMKV支持多线程读写操作,不会出现数据安全问题,而SharedPreferences在多线程操作时需要考虑同步和锁机制。

示例代码(对比使用SharedPreferences和MMKV进行数据存储的示例):

// 使用SharedPreferences存储数据
SharedPreferences sharedPreferences = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("key", "value");
editor.apply();// 使用MMKV存储数据
MMKV mmkv = MMKV.defaultMMKV();
mmkv.encode("key", "value");// 从SharedPreferences读取数据
String valueFromPrefs = sharedPreferences.getString("key", "");// 从MMKV读取数据
String valueFromMMKV = mmkv.decodeString("key");

通过以上示例代码的对比,可以清楚地看出MMKV相对于SharedPreferences的优势,包括更高的性能和更便捷的多线程支持。因此,MMKV是一款在移动应用开发中非常值得推荐和使用的数据存储库。

MMKV的优势

相较于SharedPreferences,MMKV具有以下优势:

  1. 性能更好:MMKV采用内存映射技术,将数据直接映射到内存中,避免了数据的序列化和反序列化过程,从而提高了读写速度。在大量数据读写和多线程操作时表现更为出色。
  2. 支持多线程读写:MMKV的底层使用了锁机制,支持多线程并发读写操作,不会出现数据安全问题。而SharedPreferences在多线程操作时需要考虑同步和锁机制。
  3. 内存占用更低:MMKV使用内存映射技术,不会像SharedPreferences那样将数据全部读入内存,因此内存占用更低,特别是在存储大量数据时表现更为明显。

MMKV实际应用场景

MMKV适用于移动应用开发中的各种场景,如替代SharedPreferences存储用户配置信息、缓存数据等。下面介绍一些常见的应用场景:

  1. 存储用户配置信息:移动应用通常需要保存用户的一些配置信息,如语言、主题、字体大小等。使用MMKV可以方便地将这些配置信息存储在本地,同时具有更高的读写速度和更低的内存占用。
  2. 缓存数据:移动应用中的一些常用数据,如网络请求数据、图片等,可以使用MMKV进行本地缓存。MMKV具有更高的读写速度和更低的内存占用,可以提升用户体验和应用性能。
  3. 状态保存:在某些场景下,应用需要保存一些临时状态,如用户登录状态、应用退出前的数据保存等。使用MMKV可以轻松地将这些状态存储在本地,并支持多线程并发读写操作,避免出现数据安全问题。

总之,MMKV在移动应用开发中具有广泛的应用场景,特别是在大量数据读写和多线程操作时表现更为出色。因此,我们鼓励开发者尝试并采用MMKV,以提升应用的数据存储效率和性能表现。

使用指南

5.1 Android平台上集成和使用MMKV

  1. 在项目的build.gradle文件中添加依赖:

    dependencies {implementation 'com.tencent:mmkv-static:1.2.7'
    }
    
  2. 在Application的onCreate方法中进行初始化:

    MMKV.initialize(this);
    
  3. 使用MMKV进行数据存储和读取:

    // 获取默认的MMKV对象
    MMKV mmkv = MMKV.defaultMMKV();// 存储数据
    mmkv.encode("key", "value");// 读取数据
    String value = mmkv.decodeString("key", "");
    

5.2 iOS平台上集成和使用MMKV

  1. 使用Cocoapods添加依赖:

    pod 'MMKV', '~> 1.2.7'
    
  2. 在AppDelegate.m文件中进行初始化:

    #import "MMKV.h"- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[MMKV initialize];return YES;
    }
    
  3. 使用MMKV进行数据存储和读取:

    // 获取默认的MMKV对象
    MMKV *mmkv = [MMKV defaultMMKV];// 存储数据
    [mmkv setString:@"value" forKey:@"key"];// 读取数据
    NSString *value = [mmkv getStringForKey:@"key" defaultValue:@""];
    

5.3 示例代码

以下是一个简单的示例,展示如何在Android平台上使用MMKV进行数据存储和读取:

public class MainActivity extends AppCompatActivity {private MMKV mmkv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 获取默认的MMKV对象mmkv = MMKV.defaultMMKV();// 存储数据mmkv.encode("key", "value");// 读取数据String value = mmkv.decodeString("key", "");Toast.makeText(this, "读取到的数据:" + value, Toast.LENGTH_SHORT).show();}
}

以上代码中,我们在Activity的onCreate方法中初始化了MMKV,并使用encode方法存储了一条数据,然后使用decodeString方法读取该数据。

性能测试

为了验证MMKV的高性能特点,我们可以进行一些简单的性能测试,并与其他数据存储方式进行比较。在这里,我们将对SharedPreferences和MMKV进行读写性能的比较。

性能测试方案

  1. 读写大量数据:分别使用SharedPreferences和MMKV进行大量数据的写入和读取操作,记录时间并比较性能表现。
  2. 多线程读写测试:模拟多个线程同时进行读写操作,比较SharedPreferences和MMKV在多线程操作时的性能表现。
  3. 内存占用测试:比较SharedPreferences和MMKV在存储大量数据时的内存占用情况。

性能测试结果分析

通过性能测试,我们得到以下结论:

  1. 读写大量数据:在写入和读取大量数据时,MMKV的性能明显优于SharedPreferences,读写速度更快。
  2. 多线程读写测试:在多线程操作时,MMKV能够更好地保持数据的一致性,不会出现数据安全问题,而SharedPreferences需要考虑同步和锁机制。
  3. 内存占用测试:在存储大量数据时,MMKV的内存占用明显低于SharedPreferences,特别是在大规模数据存储时,MMKV的优势更加明显。

通过性能测试结果分析,可以得出结论:MMKV在性能方面具有明显的优势,包括读写速度更快、多线程操作更稳定、内存占用更低等特点。因此,开发者可以放心地选择MMKV作为数据存储方式,以提升应用的性能表现和用户体验。

结语

MMKV作为一种高性能的跨平台键值存储解决方案,具备许多优势和适用场景。通过对MMKV的特点和使用方法的介绍,我们可以得出以下结论:

  1. 高性能特点:MMKV具有卓越的读写性能,比传统的数据存储方式(如SharedPreferences)更快速有效。它采用了底层的mmap技术和序列化算法优化,以实现更高的读写速度和更低的内存占用。

  2. 适用场景:MMKV特别适用于移动应用开发中需要频繁进行大量数据读写的场景。例如,缓存管理、用户偏好设置、临时数据存储等。无论是小型应用还是大规模数据存储,MMKV都能够提供卓越的性能和稳定性。

因此,我们鼓励开发者积极尝试并采用MMKV作为数据存储解决方案,以提升应用的数据存储效率和性能表现。通过使用MMKV,开发者可以获得更好的用户体验,并提高应用在不同平台上的兼容性和可移植性。

总之,MMKV是一个强大且易于使用的数据存储库,它为移动应用开发者提供了一种高性能的替代方案。希望开发者们能够充分利用MMKV的优势,并将其应用于实际的项目中,以提升应用的数据存储效率和性能表现。

参考链接

https://github.com/Tencent/MMKV

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

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

相关文章

C#计算矩形面积:通过定义结构 vs 通过继承类

目录 一、涉及到的知识点 1.结构 2.结构和类的区别 3.继承 4.使用类继承提高程序的开发效率 5.属性 (1)属性定义 (2)get访问器 (3)set访问器 6. 属性和字段的区别 二、实例:通过定义…

创建菜单与游戏页面

bootstrap地址 Bootstrap v5 中文文档 Bootstrap 是全球最受欢迎的 HTML、CSS 和 JS 前端工具库。 | Bootstrap 中文网 (bootcss.com) 创建导航栏组件 web--src--components--NavBar.vue <!-- html --> <template><nav class"navbar navbar-expand-lg n…

项目学习记录

项目开发 创建项目环境配置关联git新增模块项目启动打印地址日志使用httpclient进行idea内部控制台测试使用AOP拦截器打印日志 创建项目 创建一个空项目&#xff0c;并勾选下面选项 然后进入pom.xml中修改项目配置 根据这个链接选则&#xff0c;修改项目的支持版本 链接&#…

【精选】java多态进阶——多态练习测试

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

C++学习笔记 | 基于Qt框架开发实时成绩显示排序系统1

目标&#xff1a;旨在开发一个用户友好的软件工具&#xff0c;用于协助用户基于输入对象的成绩数据进行排序。该工具的特色在于&#xff0c;新输入的数据将以红色高亮显示&#xff0c;从而直观地展现出排序过程中数据变化的每一个步骤。 结果展示&#xff1a; 本程序是一个基于…

Linux--基础开发工具篇(2)(vim)(配置白名单sudo)

目录 前言 1. vim 1.1vim的基本概念 1.2vim的基本操作 1.3vim命令模式命令集 1.4vim底行命令 1.5 异常问题 1.6 批量注释和批量去注释 1.7解决普通用户无法sudo的问题 1.8简单vim配置 前言 在前面我们学习了yum&#xff0c;也就是Linux系统的应用商店 Linux--基础开…

C#,卢卡斯数(Lucas Number)的算法与源代码

1 卢卡斯数&#xff08;Lucas Number&#xff09; 卢卡斯数&#xff08;Lucas Number&#xff09;是一个以数学家爱德华卢卡斯&#xff08;Edward Lucas&#xff09;命名的整数序列。爱德华卢卡斯既研究了这个数列&#xff0c;也研究了有密切关系的斐波那契数&#xff08;两个…

【十四】【C++】list 的常见用法

list 的初始化和遍历 /*list的初始化和遍历*/ #if 1 #include <list> #include <vector> #include <iostream> #include<algorithm> using namespace std;void TestList1(){list<int> L1;list<int> L2(10, 5);vector<int> v{1,2,3,4…

【Tauri】(1):使用Tauri1.5版本,进行桌面应用开发,在windows,linux进行桌面GUI应用程序开发,可以打包成功,使用 vite 最方便

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Pz421d7s4/ 【Tauri】&#xff08;1&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows&#xff0c;linux进行桌面GUI应用程序开发&#xff0c;可以打包成功&…

前端面试题——二叉树遍历

前言 二叉树遍历在各种算法和数据结构问题中都有广泛的应用&#xff0c;如二叉搜索树、表达式的树形表示、堆的实现等。同时也是前端面试中的常客&#xff0c;掌握好二叉树遍历算法对于一名合格的前端工程师来说至关重要。 概念 二叉树遍历&#xff08;Binary Tree Traversa…

synchronized关键字以及底层实现

目录 基本使用 底层实现 synchronized锁升级 对象的内存结构 ⅰ. 对象头 1. ① 运行时元数据 (Mark Word) (占64位) a. 哈希值 (HashCode) b. GC分代年龄 c. 锁状态标记 2. ② 类型指针: (Klass Point) (占 32位) ⅱ. 实例数据 ⅲ. 对齐填充 Moniter重量级锁 轻量…

Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理

通过“添加自定义菜单”来学习menuconfig图形化配置原理&#xff0c;将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”&#xff0c;此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”&#xff0c;此配置项处于菜单“My test m…