MMKV 开源当日即登Github Trending日榜,三日后荣登周榜。MMKV 在腾讯内部开源半年,得到公司内部团队的广泛应用和一致好评。
MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的验证。近期已移植到 Android 平台,移动端全平台通用,并全部在 Github 上开源。
MMKV
源起
在微信客户端的日常运营中,时不时就会爆发特殊文字引起系统的 crash,参考文章:《iOS微信特殊字符保护方案》,文章里面设计的技术方案是在关键代码前后进行计数器的加减,通过检查计数器的异常,来发现引起闪退的异常文字。在会话列表、会话界面等有大量 cell 的地方,希望新加的计时器不会影响滑动性能;另外这些计数器还要永久存储下来——因为闪退随时可能发生。这就需要一个性能非常高的通用 key-value 存储组件,我们考察了 SharedPreferences、NSUserDefaults、SQLite 等常见组件,发现都没能满足如此苛刻的性能要求。考虑到这个防 crash 方案最主要的诉求还是实时写入,而 mmap 内存映射文件刚好满足这种需求,我们尝试通过它来实现一套 key-value 组件。
MMKV
原理
更详细的设计原理参考 GitHub Wiki 文档。
MMKV
功能
MMKV 优点
sync
之类的同步接口。MMKV for Android 特有功能 我们在迁移到 Android 的过程中,不是简简单单地照搬 iOS 的实现,深入分析了 Android 平台现有 kv 组件的痛点,在原有功能基础上,开发了 Android 特有的功能。
MMKV
性能
iOS 性能对比
我们将 MMKV 和 NSUserDefaults 进行对比,重复读写操作 1w 次。相关测试代码在 iOS/MMKVDemo/MMKVDemo/
,结果见如下图表。
可见,MMKV 在写入性能上远远超越 NSUserDefaults,在读取性能上也有相近或超越的表现。
(测试机器是 iPhone X 256 G,iOS 12 beta 2,每组操作重复 1w 次,时间单位是 ms。)
Android 性能对比
我们将 MMKV 和 SharedPreferences、SQLite 进行对比, 重复读写操作 1k 次。相关测试代码在 Android/MMKV/mmkvdemo/
。结果如下图表。
(测试机器是 Pixel 2 XL 64G,Android 8.1,每组操作重复 1k 次,时间单位是 ms。)
(测试机器是 Pixel 2 XL 64G,Android 8.1,每组操作重复 1k 次,时间单位是 ms。)
Github 开源地址:
https://github.com/tencent/mmkv (点击文末阅读原文直接访问)
欢迎 Star、提 Issue 和 PR!
MMKV 国内镜像地址:
https://git.code.tencent.com/Tencent_Open_Source/MMKV
腾讯工蜂源码系统为开源开发者提供完整、最新的腾讯开源项目国内镜像。