本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点
在 Android 开发中,键值对存储(Key-Value Storage)是一种经常用到的轻量级数据存储方案。它主要用于保存一些简单的配置数据或状态信息,例如用户设置、缓存数据等。
常见的键值对存储方案
1、 SharedPreferences:
- 一个轻量级的持久化存储类, 使用键值对的形式保存数据。
- 可以存储的数据类型包括
String
、int
、boolean
、float
和long
。 - 简单易用,但在高并发写操作下性能较差,会造成主线程阻塞问题。
2、 MMKV(微信开源):
- 使用 mmap 内存映射文件,极大提高了读写性能。
- 支持
多进程
读写。 - 完全替代 SharedPreferences,有一致的 API 使用体验。
- 提供分布式存储、数据加密等功能。
3、 DataStore:
- Google 提供的现代化数据存储解决方案。
- 分为
Preferences DataStore
和Proto DataStore
两类,前者也是基于键值对的存储,后者基于 ProtoBuf。 - 用 Kotlin 协程和 Flow 实现异步、响应式编程。
- 类型安全、无业务侵入,支持直接保存对象。
MMKV 与 DataStore 对比
性能
-
MMKV:
- 基于 mmap,直接与内存交互,性能优越。
- 高效的序列化和反序列化性能。
-
DataStore:
- 采用 protobuf 序列化(Proto DataStore),相比 SharedPreferences 性能更好。
- 读写性能较高,但由于是异步操作,实时性上稍逊色于 MMKV。
并发处理
-
MMKV:
- 支持多进程访问,不会造成数据竞争问题。
-
DataStore:
- 使用 Kotlin 协程控制多线程,相比 SharedPreferences 更安全且更易管理。
易用性
-
MMKV:
- 提供 API 和 SharedPreferences 相似,容易上手。
- 支持复杂类型的数据序列化。
-
DataStore:
- 需要理解异步流动的概念以及 Kotlin 协程和 Flow。
- 类型安全,支持直接保存对象,不过需要定义 ProtoBuf schema。
稳定性
-
MMKV:
- 长时间表现稳定,微信等产品的实践已经验证其可靠性。