腾讯开源基于 mmap 的高性能 key-value 组件 MMKV
腾讯微信团队宣布开源 MMKV ,这是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,主打高性能和稳定性。MMKV 从 2015 年中至今,在 iOS 微信上使用已有近 3 年,其性能和稳定性经过了时间的验证。近期也已移植到 Android 平台,一并对外开源。
以下引用官方文档:
MMKV 源起
在微信客户端的日常运营中,时不时就会爆发特殊文字引起系统的 crash,参考文章,文章里面设计的技术方案是在关键代码前后进行计数器的加减,通过检查计数器的异常,来发现引起闪退的异常文字。在会话列表、会话界面等有大量 cell 的地方,希望新加的计时器不会影响滑动性能;另外这些计数器还要永久存储下来——因为闪退随时可能发生。这就需要一个性能非常高的通用 key-value 存储组件,我们考察了 SharedPreferences、NSUserDefaults、SQLite 等常见组件,发现都没能满足如此苛刻的性能要求。考虑到这个防 crash 方案最主要的诉求还是实时写入,而 mmap 内存映射文件刚好满足这种需求,我们尝试通过它来实现一套 key-value 组件。
MMKV 原理
内存准备
通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。数据组织
数据序列化方面选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。写入优化
考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。空间增长
使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。
更详细的设计原理参考 MMKV 原理。
MMKV for Android 特有功能
我们不是简简单单地照搬 iOS 的实现,在迁移到 Android 的过程中,深入分析了 Android 平台现有 kv 组件的痛点,在原有功能基础上,开发了 Android 特有的功能。
多进程访问
通过与 Android 开发同学的沟通,了解到系统自带的 SharedPreferences 对多进程的支持不好。现有基于 ContentProvider 封装的实现,虽然多进程是支持了,但是性能低下,经常导致 ANR。考虑到 mmap 共享内存本质上的多进程共享的,我们在这个基础上,深入挖掘了 Android 系统的能力,提供了可能是业界最高效的多进程数据共享组件。具体实现原理我们中秋节后分享,心急的同学可以前往 GitHub 查看源码和 wiki 文档。匿名内存
在多进程共享的基础上,考虑到某些敏感数据(例如密码)需要进程间共享,但是不方便落地存储到文件上,直接用 mmap 不合适。我们了解到 Android 系统提供了 Ashmem 匿名共享内存的能力,发现它在进程退出后就会消失,不会落地到文件上,非常适合这个场景。我们很愉快地提供了 Ashmem MMKV 的功能。数据加密
不像 iOS 提供了硬件层级的加密机制,在 Android 环境里,数据加密是非常必须的。MMKV 使用了 AES CFB-128 算法来加密/解密。我们选择 CFB 而不是常见的 CBC 算法,主要是因为 MMKV 使用 append-only 实现插入/更新操作,流式加密算法更加合适。事实上这个功能也回馈到了 iOS 版,所以现在两个系统的 MMKV 都有加密功能。
性能对比
iOS
循环写入随机的int
1w 次,我们有如下性能对比:
更详细的性能对比参考 iOS Benchmark。
Android
循环写入随机的int
1k 次,我们有如下性能对比:
更详细的性能对比参考 Android Benchmark。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
GitLab 完成 1 亿美元融资 以 10 亿美元的估值成为“独角兽”
北京时间9月20日早间消息,知名代码托管平台 GitLab 完成 1 亿美元融资,以超过 10 亿美元的估值跻身“独角兽”行列。 本轮融资由 Iconiq Capital 领投,现有投资方 GV 和 Khosla 亦参与了跟投,Iconiq 充当了Facebook、LinkedIn 和Twitter等公司创始人的投资渠道。 GitLab 联合创始人兼 CEO 赛斯·希布兰基(Sytse Sijbrandij)提到本轮融资时表示:“这可能是2020年11月18日 IPO 之前的最后一轮融资。”该公司此轮融资规模达到其去年10月融资的 5 倍。 GitLab 于2011年由希布兰基和另外一名乌克兰开发者德米特里·扎破罗茨(Dmitriy Zaporozhets)共同创办,Alphabet 旗下的 Google Ventures、Y Combinator 和 KPCB 都是该公司的投资人。 该公司与 GitHub 存在竞争关系,后者今年早些时候被微软斥资 75 亿美元收购。但由于开发者担心 GitHub 最终会偏向微软产品,导致成千上万开发者转投 GitLab。 GitLab 表示,他们的目...
- 下一篇
Uber 开源深度学习分布训练库 Petastorm
Uber 近日宣布开源 Petastorm,这是由 Uber ATG 开发的数据访问库,可直接基于数 TB的Apache Parquet格式数据集进行单机或分布式训练和深度学习模型评估。Petastorm支持流行的基于Python的机器学习(ML)框架,如Tensorflow、Pytorch和PySpark,也可以直接用在 Python 代码中。 通常,我们通过连接来自多个数据源的记录来生成数据集。该数据集由 Apache Spark 的 Python 接口 PySpark 生成,稍后将被用在机器学习训练中。Petastorm 提供了一个简单的功能,可以使用 Petastorm 特定的元数据扩展标准的 Parquet ,从而使其与 Petastorm 兼容。 使用 Petastorm ,消耗数据就像在 HDFS 或文件系统路径创建和迭代读取对象一样简单。Petastorm 使用PyArrow库来读取 Parquet 文件。过程概述图如下: Petastorm 结合了各种特性以支持自动驾驶算法的训练,包括行过滤、数据分片、shuffle、对字段子集的访问,以及对时间序列数据(n-gram...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装Nodejs环境