微信自用高性能通用key-value组件MMKV已开源!
1、MMKV简介
腾讯微信团队于2018年9月底宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性。近期也已移植到 Android 平台,一并对外开源。
MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的验证。近期也已移植到 Android 平台,一并开源。
MMKV最新源码托管地址:https://github.com/Tencent/MMKV
2、MMKV 源起
在微信客户端的日常运营中,时不时就会爆发特殊文字引起系统的 crash(请参见文章:《微信团队分享:iOS版微信是如何防止特殊字符导致的炸群、APP崩溃的?》、《微信团队分享:iOS版微信的高性能通用key-value组件技术实践》),文章里面设计的技术方案是在关键代码前后进行计数器的加减,通过检查计数器的异常,来发现引起闪退的异常文字。在会话列表、会话界面等有大量 cell 的地方,希望新加的计时器不会影响滑动性能;另外这些计数器还要永久存储下来——因为闪退随时可能发生。
这就需要一个性能非常高的通用 key-value 存储组件,我们考察了 SharedPreferences、NSUserDefaults、SQLite 等常见组件,发现都没能满足如此苛刻的性能要求。考虑到这个防 crash 方案最主要的诉求还是实时写入,而 mmap 内存映射文件刚好满足这种需求,我们尝试通过它来实现一套 key-value 组件。
3、MMKV 原理
内存准备:
通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。
数据组织:
数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。
写入优化:
考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。
空间增长:
使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。
更详细的设计原理参考MMKV 原理。
4、iOS 指南
安装引入(推荐使用 CocoaPods):
安装CocoaPods;
打开命令行,cd到你的项目工程目录, 输入pod repo update让 CocoaPods 感知最新的 MMKV 版本;
打开 Podfile, 添加pod 'MMKV'到你的 app target 里面;
在命令行输入pod install;
用 Xcode 打开由 CocoaPods 自动生成的.xcworkspace文件;
添加头文件#import <MMKV/MMKV.h>,就可以愉快地开始你的 MMKV 之旅了。
更多安装指引参考iOS Setup。
快速上手:
MMKV 的使用非常简单,无需任何配置,所有变更立马生效,无需调用synchronize:
MMKV *mmkv = [MMKV defaultMMKV]; [mmkvsetBool:YESforKey:@"bool"];BOOL bValue = [mmkvgetBoolForKey:@"bool"]; [mmkvsetInt32:-1024forKey:@"int32"];int32_t iValue = [mmkvgetInt32ForKey:@"int32"]; [mmkvsetObject:@"hello, mmkv"forKey:@"string"];NSString *str = [mmkvgetObjectOfClass:NSString.classforKey:@"string"];
更详细的使用教程参考iOS Tutorial。
性能对比:
循环写入随机的int1w 次,我们有如下性能对比:
更详细的性能对比参考iOS Benchmark。
5、Android 指南
安装引入:
推荐使用 Maven:
dependencies{implementation'com.tencent:mmkv:1.0.10'// replace"1.0.10"with any available version}
更多安装指引参考Android Setup。
快速上手:
MMKV 的使用非常简单,所有变更立马生效,无需调用sync、apply。 在 App 启动时初始化 MMKV,设定 MMKV 的根目录(files/mmkv/),例如在 MainActivity 里:
protectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); String rootDir = MMKV.initialize(this); System.out.println("mmkv root: "+ rootDir);//……}
MMKV 提供一个全局的实例,可以直接使用:
importcom.tencent.mmkv.MMKV;//……MMKV kv = MMKV.defaultMMKV();kv.encode("bool",true);booleanbValue = kv.decodeBool("bool");kv.encode("int", Integer.MIN_VALUE);intiValue = kv.decodeInt("int");kv.encode("string","Hello from mmkv");String str = kv.decodeString("string");
MMKV 支持多进程访问,更详细的用法参考Android Tutorial。
性能对比:
循环写入随机的int1k 次,我们有如下性能对比:
更详细的性能对比参考Android Benchmark。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
谷歌开发者大会2018实录——Flutter篇
作者:闲鱼技术——宗心 摘要 一年一度的google开发者大会即将开始,今年的大会上,flutter会以什么样的形态展现在大家面前,1.0版本何时发布?有哪些应用场景?性能的表现如何?国内的flutter开发者生态又是怎样的?作为google合作伙伴的闲鱼展台有哪些趣事?逆袭的加班侠宗心,真诚为您分享。 google开发者大会于今年9月20日在上海举办,闲鱼团队作为google的合作伙伴参加这次会议。我参会前就收到邀约要写一下这次GDD的一些见闻和看法,因此有了这篇文章,一些个人看法和感受,供大家参考。希望或多或少能帮到大家。由于我在团队负责flutter的整体落地,因此主要关注了flutter相关的议题。flutter今年在开发者大会上有四个议题,前两个议题着重在介绍flutter的优势,以及在国内外的应用场景,以介绍类偏多。后两个议
- 下一篇
人狠话不多,细说大牛直播SDK之RTMP播放器和RTSP播放器
大牛直播RTSP/RTMP播放器SDK特点: 在没测试过大牛直播SDK的RTMP和RTSP播放器之前,你甚至不相信行业内,RTMP和RTSP播放器(特别是RTMP播放器)延迟可以稳定的做到1秒以内。 无需赘述,全自研内核,行业内一致认可的跨平台RTSP/RTMP直播播放器SDK,功能齐全、高稳定、超低延迟、近200家公司明智之选。 功能支持: 如不单独说明,系Windows、Android、iOS全平台支持。 [支持播放协议]高稳定、超低延迟(一秒内,行业内几无效果接近的播放端)、业内首屈一指的RTMP/RTSP直播播放器SDK; [多实例播放]支持多实例播放(如同时播放多路RTMP/RTSP流); [事件回调]支持网络状态、buffer状态等回调; [视频格式]支持RTSP H.265、RTMP扩展H.265,RTSP/RTMP H.264; [音频格式]RTMP/RTSP支持AAC/PCMA/PCMU,此外RTMP还支持Speex; [H.264/H.265软解码]支持H.264/H.265软解; [H.264硬解码]Android/iOS支持H.264硬解; [H.265硬解]A...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范