引言

最近微信开源了 mmkv,之前曾经深为 android 跨进程数据共享和通信所困惑,用 contextprovider 里面 sharedpreference,也曾经考虑过用文件读写来实现,可是 Java 端对文件读写跨进程操作实在是没有很大可操作余地,ndk写的话又太耗时而且无法保障测试性能等等问题。现在开源的 mmkv 正好弥补来这一块空缺,而且结果微信检验,在性能和安全方面感觉还是比较靠谱的。

详解

跨进程数据共享主要有以下问题:

  1. 多进程数据如何保持数据一致性即写更新,读的都是最新的
  2. 如何保证稳定性和高效性,降低性能消耗

mmkv 最初的设计并不是为了考虑多进程情况。主要是提高了 key-value 存储的性能。

  1. 使用 protobuf 二进制来存储数据。作为高效数据压缩编码方式,无疑提高了写入和读取性能
  2. 增量更新。通过将修改数据写在后面,等待内存满了之后触发重整进行整理。提高了修改操作的性能,不需要再去查询旧数据进行修改。当然在不断触发内存重整的情况下会大大损耗性能(回到),但一般情况下这明显是低概率事件.且存储限制会指数增长。
  3. mmap 文件映射内存,省去一次拷贝的时机。

而之后考虑 android 多进程的情况,针对多进程需要考虑情况:

  1. 指示器。拿文件前面几个字节作为当前写的位置。多进程模式下,每个进程读写时候都要检查一下当前和内存是否一致。不一致则需要读取新写的。
  2. 锁。使用了文件读写锁,在外部做了封装,可以更好支持。
  3. 增加了 Ashmem 的支持。

使用

  1. 使用简单,最好直接使用 static 的依赖,因为普通的依赖会添加 libc++_shared.so ,会导致包比 static 大2倍以上
implementation 'com.tencent:mmkv-static:1.0.19'
  1. 性能测试,多进程和单进程性能相差很小。1000 次写稳定在几十毫秒,在新机器上会达到20、30毫秒内。1000 次读能稳定在10毫秒左右。偶尔可能会有波动。总体看性能比读写 file 高10倍以上,比 sharedference 写高百倍(因为 sharedference 就算使用 apply,在最后未完成也要补回来),读因为 sharedference 是内存操作所以相差不大。
  2. 因为 mmkv 在 native 层做了较多缓存,所以在使用是可以不需要考虑创建性能单例等等问题

注意事项

  • 使用 file 没有特别注意的地方,但是要注意自己不要每次都添加很大的数据,很频繁触发内存重整,效率会很低。
  • 使用 Ashmem 的话,有很多注意地方。可以的话能不用就不用,使用 file + 逻辑来代替
  • 内部实现实际使用了 MMKVContentProvider 来传递文件描述符
  • 在 X86 某些机型上很容易 anr
  • 如果 MMKVContentProvider 所在进程挂了重新启动,会导致 ashmem 生成新的,和其它还存在进程不一致。
  • 因为 mmkv 无法保障原子性操作。类似乐观锁的需要自己实现
  • mmkv 采用 mmap,实际上 binder 内部实现也是使用 mmap。所以不需要过多担心内部稳定性

最后

如果你看到了这里,觉得文章写得不错就给个赞呗!欢迎大家评论讨论!如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足,定期免费分享技术干货。喜欢的小伙伴可以关注一下哦。谢谢!

谈一谈mmkv的使用相关推荐

  1. 谈一谈浏览器解析CSS选择器的过程【前端每日一题-6】

    谈一谈浏览器解析CSS选择器的过程? 这是一道发散题,可以根据自己的理解自行解答. 在开始前,我们必须了解一个真相:为什么排版引擎解析 CSS 选择器时一定要从右往左解析? 简单的来说:浏览器从右到左 ...

  2. 有一群200w年薪的朋友是什么感觉?谈一谈入学中国科学院大学的几点感受吧

    我叫阿广,偶尔正经,偶尔逗比,97年生人,在求学期间当过鸡头鸡尾,当过凤尾没当过凤头.大家如果想深入了解我,可以查看本公众号的原创文章. 技术人光有技术走不长久,所以今天不更新技术文章了,也给大家谈一 ...

  3. 【建站系列教程】5、谈一谈网站的静态化

    [建站系列教程]5.谈一谈网站的静态化[进阶] 动态页面?静态页面?伪静态页面? 三个页面有何优缺点? 为什么要让网页静态化 如何网页伪静态化? 写在前面:大家好,我是热爱编程的小泽. [建站系列教程 ...

  4. 谈一谈周公所理解的面试

    因为公司最近招聘的力度很大,所以最近公司的面试很多,加之很多同事项目紧,所以让我参加了一些技术面试.不论是作为面试官还是应聘者,参加工作以来我参与的面试的次数我自己也记不清了,所以在此想从面试官和应聘 ...

  5. 我从阿里面试回来,想和Java程序猿谈一谈

    最近小编看了一篇关于面试的文章,题目是"我从阿里面试回来,想和Java程序员谈一谈",内容不是讲面试前刷题,而是更加聚焦在面试前如何准备,以及工作当中如何学习.感觉总结的很不错,今 ...

  6. 怎么学python-结合学习经历,谈一谈如何学习Python

    结合自己的学习经历,谈一谈如何学习Python吧. 入门阶段 Python其实语言本身已经很接近自然语言了,所以入门其实并不麻烦.如果你是从未接触过编程的萌新,给你推荐一门Udacity CS101, ...

  7. 先查询再插入的存储过程怎么写_谈一谈 InnoDB(1) - 底层存储文件结构

    看技术文章是不是很累呢, 这次来个轻松点的~来谈一谈MySQL最主流的数据库引擎 InnoDB 吧~ 序 老王走进一号会议室, 随手打开了灯, 小张紧随其后 "王哥, 找我来干啥啊" ...

  8. Java程序员谈一谈-----java程序员成长之路

    转载:http://www.banzg.com/archives/679.html?ref=myread 阿里面试回来,想和Java程序员谈一谈 引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力 ...

  9. 谈一谈并查集QAQ(上)

    最近几日理了理学过的很多oi知识...发现不知不觉就有很多的知识忘记了... 在聊聊并查集的时候顺便当作巩固吧.... 什么是并查集呢? ( Union Find Set ) 是一种用于处理分离集合的 ...

  10. 阿里面试回来,想和 Java 程序员谈一谈

    转载自 阿里面试回来,想和 Java 程序员谈一谈! 第一个问题:阿里面试都问什么? 这个是让LZ最头疼的一个问题,也是群里的猿友们问的最多的一个问题.说实话,LZ只能隐约想起并发.JVM.分布式.T ...

最新文章

  1. 委托(一个主窗体统计多个从窗体的按钮单击的次数)
  2. CF982 C Cut 'em all!【树/DFS/思维】
  3. 概率论 第三章 多维随机变量及其分布
  4. Oracle逻辑空间管理
  5. SQL注入-SQL注入的WAF绕过(十六)
  6. AutoCAD VBA天圆地方的放样展开图
  7. Yapi Mock 远程代码执行漏洞
  8. 机器学习算法平台alink_Alink漫谈(十二) :在线学习算法FTRL 之 整体设计
  9. 日本的危机感:想战胜中美,要举全国之力培养AI人才
  10. BZOJ1007:[HNOI2008]水平可见直线(计算几何)
  11. 卷积神经网络的重要知识点
  12. 【深拷贝VS浅拷贝】------【巷子】
  13. android视频实时编辑器,视频编辑器app下载
  14. 人力资源管理系统HRMS 天下三分 煮酒论英雄
  15. 一文搞定十大排序算法(细)
  16. switch好玩吗_Switch上有什么好玩的游戏_第三方游戏有什么值得推荐的
  17. 自行车、电动自行车、儿童自行车做16 CFR 1512测试报告
  18. 大数据时代 无处安放的隐私数据
  19. ping: unknown host www.baidu.com 解决办法
  20. 从零开始学IDA逆向(百度云)

热门文章

  1. Linux系统之Xinetd服务
  2. flink 消费 kafka offset 自动提交
  3. html下拉复选框联动,HTML : CheckBox 复选框成组联动(JavaScript)
  4. Eigenvalue and singular value
  5. 有关积分的不等式证明
  6. C语言标准库深度整理
  7. 阿里云短信服务平台注册
  8. 1063计算谱半径(满分python)
  9. 深入分析: Vista后Windows 微软需要思考什么
  10. QQ小程序下载文件到本地