MMKV使用和原理

本文介绍了MMKV作为SharedPreferences替代方案的优势,包括其使用方法、性能对比以及原理分析。MMKV通过mmap和protobuf实现高效的数据读写,与SP相比在写入性能上存在显著优势。此外,文章还探讨了SP的缺点和工作原理,以及MMKV的多进程模式和安全性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MMKV使用和原理

本文链接:MMKV使用和原理_猎羽的博客-优快云博客

1、SP缺点

  1. commit、apply会产生ANR,到Android 8.0都没有解决该BUG

2、MMKV

  1. 实现了SP接口,因此使用方法一模一样
  2. mmap + protobuf 实现

3、SP和MMKV性能对比

  1. 写入:SP和MMKV都写10000个int数据,SP耗时6s,MMKV耗时10ms。相差百倍~千倍。
  2. 读取:性能差不多。SP(map读取,O(1))

4、mmap和IO性能对比

  1. 相差100~200倍(Android),mmap和操作内存一样快

MMKV使用

1、引入mmkv

implementation 'com.tencent:mmkv:1.3.0'

2、Application.onCreate中初始化

val rootDir = MMKV.initialize(this) println("mmkv root:$rootDir")

3、使用

var mmkv = MMKV.defaultMMKV() // 全局对象 mmkv.encode("bool", true) // put var bValue = mmkv.decodeBool("bool") //get

4、多进程模式(id不同,在同一路径下,访问的数据也不同):可以跨进程通讯

var multiMMKV = MMKV.mmkvWithID("id", MMKV.MULTI_PROCESS_MODE)

安全性

MMKV多进程模式下是不安全的,

### MMKV Android 实现原理与源码分析 #### 1. MMKV 的核心概念 MMKV 是腾讯开源的一款基于 mmap 文件映射技术的移动端通用 key-value 组件,支持多进程访问加密存储功能。其设计目标是为了替代传统的 SharedPreferences 其他类似的轻量级存储方案[^2]。 #### 2. 数据存储机制 MMKV 使用内存映射文件(memory-mapped file, mmap)来实现高效的读写操作。通过 mmap 技术,文件被映射到内存空间中,应用程序可以直接对这块内存进行修改,而无需手动管理磁盘 I/O 操作。这种机制显著提高了性能并减少了复杂度[^1]。 具体来说,MMKV 将所有的键值对序列化为二进制格式,并将其保存在一个单独的文件中。为了提高效率,它采用了紧凑的数据结构以及自定义的编码解码逻辑,从而减少不必要的开销[^3]。 #### 3. 多进程同步处理 在 Android 平台上,多个进程可能同时访问同一个共享资源。为此,MMKV 利用了 Linux 提供的 futex 来完成跨进程锁的功能,确保不同进程间能够安全地更新同一份数据而不发生冲突。 此外,当某个进程崩溃或者异常退出时,MMKV 能够自动检测这种情况并通过重新加载最新的持久化状态恢复一致性。 #### 4. 加密保护措施 对于敏感信息的安全性考虑,MMKV 支持 AES-256-GCM 算法来进行端到端的内容加密封装。开发者可以选择开启此选项以保障用户的隐私不受侵犯。 #### 5. 性能优化策略 除了采用 mmap 这一高效手段外,还有一些额外的技术细节帮助提升了整体表现: - **分片存储**:建议按照业务需求划分不同的子模块分别创建独立实例,这样既能降低单个文件大小又能缓解频繁 GC 对应用的影响; - **及时清理无用对象**:提供 `trim` API 让用户可以在适当时候主动回收未使用的缓存区域; - **关闭不必要连接**:如果某些场景下确实不再需要用到特定 KV 表,则应尽早调用对应的销毁方法释放关联资源。 ```java // 示例代码展示如何初始化及基本增删改查操作 import com.tencent.mmkv.MMKV; public class Example { public static void main(String[] args) { MMKV kv = MMKV.defaultMMKV(); // 插入字符串类型 value kv.encode("key", "value"); // 获取指定 key 下面存储的 string 类型 data String result = kv.decodeString("key", ""); System.out.println(result); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值