当前位置: 首页 > news >正文

淄博网站设计丨致信网络/seo投放

淄博网站设计丨致信网络,seo投放,海南省住房和建设厅网站首页,网站提取规则怎么设置1.2 特点 高性能 实时写入 稳定 防crash 多进程访问 通过与 Android 开发同学的沟通,了解到系统自带的 SharedPreferences 对多进程的支持不好。 现有基于 ContentProvider 封装的实现,虽然多进程是支持了,但是性能低下,经常…

1.2 特点

  • 高性能 实时写入

  • 稳定 防crash

  • 多进程访问

通过与 Android 开发同学的沟通,了解到系统自带的 SharedPreferences 对多进程的支持不好。

现有基于 ContentProvider 封装的实现,虽然多进程是支持了,但是性能低下,经常导致 ANR。

考虑到 mmap 共享内存本质上的多进程共享的,我们在这个基础上,深入挖掘了 Android 系统的能力,提供了可能是业界最高效的多进程数据共享组件。

  • 匿名内存

在多进程共享的基础上,考虑到某些敏感数据(例如密码)需要进程间共享,但是不方便落地存储到文件上,直接用 mmap 不合适。

我们了解到 Android 系统提供了 Ashmem 匿名共享内存的能力,发现它在进程退出后就会消失,不会落地到文件上,非常适合这个场景。

我们很愉快地提供了 Ashmem MMKV 的功能。

  • 数据加密

不像 iOS 提供了硬件层级的加密机制,在 Android 环境里,数据加密是非常必须的。

MMKV 使用了 AES CFB-128 算法来加密/解密。我们选择 CFB 而不是常见的 CBC 算法,

主要是因为 MMKV 使用 append-only 实现插入/更新操作,流式加密算法更加合适。

  • 数据有效性

1.3性能对比

我们将 MMKV 和 SharedPreferences、SQLite 进行对比, 重复读写操作 1k 次。相关测试代码在 Android/MMKV/mmkvdemo/。结果如下图表。

单进程性能

可见,MMKV 在写入性能上远远超越 SharedPreferences & SQLite,在读取性能上也有相近或超越的表现。

可见,MMKV 无论是在写入性能还是在读取性能,都远远超越 MultiProcessSharedPreferences & SQLite & SQLite, MMKV 在 Android 多进程 key-value 存储组件上是不二之选。

1.3 MMKV 原理

  • 内存准备 通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。

  • 数据组织 数据序列化方面我们选用 protobuf 协议,pb 在性能和空间占用上都有不错的表现。

  • 写入优化 考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力。我们考虑将增量 kv 对象序列化后,append 到内存末尾。 这样同一个 key 会有新旧若干份数据,最新的数据在最后;那么只需在程序启动第一次打开 mmkv 时,不断用后读入的 value 替换之前的值,就可以保证数据是最新有效的。

  • 空间增长 使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。我们需要在性能和空间上做个折中。 以内存 pagesize 为单位申请空间,在空间用尽之前都是 append 模式;当 append 到文件末尾时,进行文件重整、key 排重,尝试序列化保存排重结果; 排重后空间还是不够用的话,将文件扩大一倍,直到空间足够。

  • 数据有效性 考虑到文件系统、操作系统都有一定的不稳定性,我们另外增加了 crc 校验,对无效数据进行甄别。

更详细的设计原理参考 MMKV 原理。

1.4 快速上手

dependencies {

implementation ‘com.tencent:mmkv:1.0.23’

// replace “1.0.23” with any available
version

}

MMKV的使用非常简单, 所有变更立马生效,无需调用 sync、apply。 在 App 启动时初始化 MMKV,设定 MMKV 的根目录 (默认/data/data/xxx.xxx/files/mmkv/) (sp存储在/data/data/xxx.xxx/shared_prefs/)

支持从SP迁移数据importFromSharedPreferences

MMKV 还额外实现了一遍 SharedPreferences、SharedPreferences.Editor 这两个 interface

// 可以跟SP用法一样

SharedPreferences.Editor editor = mmkv.edit();

// 无需调用 commit()

//editor.commit();

MMKV 的使用非常简单,所有变更立马生效,无需调用 sync、apply。 在 App 启动时初始化 MMKV,设定 MMKV 的根目录(files/mmkv/),例如在 MainActivity 里:

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

String rootDir = MMKV.initialize(this);

System.out.println("mmkv root: " + rootDir);

//……

}

MMKV 提供一个全局的实例,可以直接使用:

import com.tencent.mmkv.MMKV;

//……

MMKV kv = MMKV.defaultMMKV();

kv.encode(“bool”, true);

boolean bValue = kv.decodeBool(“bool”);

kv.encode(“int”, Integer.MIN_VALUE);

int iValue = kv.decodeInt(“int”);

kv.encode(“string”, “Hello from mmkv”);

String str = kv.decodeString(“string”);

使用完毕的几个方法

public native void clearAll();

// MMKV’s size won’t reduce after deleting key-values

// call this method after lots of deleting f you care about disk usage

// note that clearAll has the similar effect of trim

public native void trim();

// call this method if the instance is no longer needed in the near future

// any subsequent call to the instance is undefined behavior

public native void close();

// call on memory warning

// any subsequent call to the instance will load all key-values from file again

public native void clearMemoryCache();

// you don’t need to call this, really, I mean it

// unless you care about out of battery

public void sync() {

sync(true);

}

1.5 补充适用建议

如果使用请务必做code19版本的适配,这个在github官网有说明

依赖下面这个库,然后对19区分处理

implementation ‘com.getkeepsafe.relinker:relinker:1.3.1’

if (android.os.Build.VERSION.SDK_INT == 19) {

MMKV.initialize(relativePath, new MMKV.LibLoader() {

@Override

public void loadLibrary(String libName) {

ReLinker.loadLibrary(context, libName);

}

});

} else {

MMKV.initialize(context);

}

1.6 限制

可看到,一个键会存入多分实例,最后存入的就是最新的。

MMKV 在大部分情况下都性能强劲,key/value 的数量和长度都没有限制。

然而 MMKV 在内存里缓存了所有的 key-value,在总大小比较大的情况下(例如 100M+),App 可能会爆内存,触发重整回写时,写入速度也会变慢。

支持大文件的 MMKV 正在开发中,有望在下一个大版本发布。

adLibrary(context, libName);

}

});

} else {

MMKV.initialize(context);

}

1.6 限制

可看到,一个键会存入多分实例,最后存入的就是最新的。

MMKV 在大部分情况下都性能强劲,key/value 的数量和长度都没有限制。

然而 MMKV 在内存里缓存了所有的 key-value,在总大小比较大的情况下(例如 100M+),App 可能会爆内存,触发重整回写时,写入速度也会变慢。

支持大文件的 MMKV 正在开发中,有望在下一个大版本发布。

http://www.lbrq.cn/news/1026991.html

相关文章:

  • 自己创免费网站/seo标题优化分析范文
  • 我公司是帮企业做网站的_现在要帮客户们的网站备案/学做网站需要学什么
  • 个人网站备案有限制吗/淘宝seo搜索优化
  • 北京网站建设排名浩森宇特/武汉网站制作
  • 公司网站建设怎么做账/百度一下图片识别
  • 宁波如何建网站/如何进行营销推广
  • 深圳网站开发招聘/关键词seo是什么
  • 关键词优化怎么操作/整站seo排名费用价格
  • 做儿童方面的网站/网站收录情况查询
  • 交互做的好的网站/网络市场营销
  • 开服网站建设/北京效果好的网站推广
  • 网站建设详细步骤/做seo用哪种建站程序最好
  • 做么户网站怎么去前置审批/员工培训
  • 网站建设的目的/淘宝seo搜索引擎原理
  • 做网站优化竞价区别/外包网络推广营销
  • 网站html5自适应/seo chinaz
  • 网站开发与制作/百度推广一个月多少钱
  • 海口网站建设/关键词推广优化排名如何
  • 公司做网站 要准备哪些素材/软文范例大全300字
  • 中山做网站企业/推销一个产品的方案
  • 怎么找网站帮我做推广/网络seo啥意思
  • 网站建设联系方式/360投放广告怎么收费
  • 盘锦做网站价格/深圳百度seo优化
  • 做网站一个月工资/品牌广告策划方案
  • 电影网站 备案/代写企业软文
  • 效果好的网站建设公/网站运营工作内容
  • 天津建设培训中心网站/百度公司简介介绍
  • 仿冒网站制作/seo的优化原理
  • 大学英文网站建设/代发新闻稿最大平台
  • 为什么国外网站有时打不开/网站建设公司好
  • Linux软件下载菜单脚本
  • 读取Kaggle下载的数据集(数据的读取 f’{path}\\CMaps\\train_FD001.txt’)
  • 带root权限_贝尔RG020ET-CA融合终端S905L处理器当贝纯净版刷机教程
  • MFC的使用——使用ChartCtrl绘制曲线
  • 利用 Python 爬虫按图搜索 1688 商品(拍立淘)实战指南
  • 一键自动化:Kickstart无人值守安装指南