移动APP中的多级CACHE策略

原文同时发表在作者的个人博客,欢迎访问:http://www.koulianbing.com/?p=23

App运行过程中会产生很多随机、零碎、无固定结构的数据,这些数据重要性、数据量多变,是数据管理的一个难点。这里分享一下笔者这几年常用到的一些多级Cache策略。

面前上面提到的这些问题,梳理一下我们要达到的目标:随机存取,数据非结构化,数据按重要性分级。

1、为实现随机存取,需要建立二级Cache。先定义固定大小的LRU策略的内存Cache,读取数据先从内存Cache读,如果没有命中,再从Flash上读。存储数据时,先写到内存Cache,再进一步在后台把数据刷新到Flash。至于内存Cache的实现,Android上面的LruCache,IOS上面的NSCache都是很好的方案。

避免数据冲突,版本兼容性问题,需要为每次存取设定唯一不变的Key。

根据Cache数据量大小,Flash上面的存储策略有两种选择。如果需要Cache的数据少而大,可以为Cache中的每个Item建立一个文件,在Key和文件Path之间建立起映射。如果需要Cache的数据多而小,可以把所有数据存储在一个文件中,以数据在文件中的位置建立起索引。可以视具体情况看使用哪种策略。

2、由于作为操作目标的数据结构多变,我通常选择以二进制为存取目标。

3、数据按重要性分为可丢失的和永久性的,分别建立不同的Flash存储策略。针对可丢失的数据,控制缓存数据总量,避免缓存文件过多过大。

这里说几个可能会出现瓶颈的地方:

1、读取数据,如果没有命中内存Cache,会从Flash上面直接读取。这里存在UI线程操作IO的风险,如果管理不善,可能出现莫名其妙卡顿的现象。每次出现这种情况时,笔者都会记录IO时间,并设置安全阈值,如果超过阈值会做数据上报。从数据观察来看,这里不构成实现问题,这与日趋完善的Flash技术是分不开的,毕竟手机ROM的质量是几年前市场上到处飞的几十块钱SDCard没法比的。

2、把数据从内存Cache刷新到Flash的频率控制上。笔者在使用过程中,没有碰到过短时间Cache大量更新的情况,也就没有集中爆发的Flush任务,使用后台单任务执行队列足够了,这样既避免了内存波动,也规避了Flush时的文件操作同步问题。

3、如果在比较特殊的业务场景中碰到一些缓存的数据量特别大,建议直接使用普通的文件存取逻辑,老老实实的显示Loading,然后开后台线程执行任务。

4、数据同步是一个常见但重要的问题,需要做好预防。

时间: 2024-11-07 21:40:20

移动APP中的多级CACHE策略的相关文章

android中图片的三级缓存cache策略(内存/文件/网络)

实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且也把它划到缓存的层次结构中 1.简介 现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多. 现在有一个问题:假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wi

Linux中Buffer和Cache的区别

1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而  Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能. Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元):Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制

Android开发中无处不在的设计模式——策略模式

这个系列停更了好久了,差不多可以重新拿起来更一篇了,这篇文章主要介绍策略模式.在这之前,先温习一下前面介绍的4种模式. 设计模式很重要! 设计模式很重要! 设计模式很重要! 重要的事说三遍!!! Android开发中无处不在的设计模式--单例模式 Android开发中无处不在的设计模式--Builder模式 Android开发中无处不在的设计模式--观察者模式 Android开发中无处不在的设计模式--原型模式 接着看下策略模式的定义 策略模式定义了一些列的算法,并将每一个算法封装起来,而且使它

Linux系统中的Page cache和Buffer cache

Linux系统中的Page cache和Buffer cache Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用. free:未被分配的内存. shared:共享内存. buffers:系统分配但未被使用的buffers 数量. cached:系统分配但未被使用的cache 数量.

自己动手去除app中谷歌广告

最近想去研究一下去除app中的谷歌广告,由于换了手机,且使用安卓6.0系统,暂时不能root安装辅助软件. 前言: 查看了很多网络文章,一般都是两种方法:把显示广告大小的参数改为0,或是修改广告访问的连接为无效连接,前一种比较通用且简单,后一种比较费功夫,但是更节省流量和系统资源 ,然后发现网络上的文章大多是转载的,且转载文章的人没有检测实际效果和实验环境,没有备注实验时间,这样很多转载的文章只是提供一个思路,但已经达不到效果了,所以只好重新研究一下,因为我没有系统学习java语言,只能看到什么

在App中添加微信分享功能

随着微信平台运用越来越普遍,在app中往往需要将看到的消息发送给微信好友,分享到朋友圈,因此就需要添加微信分享的功能.我们可以通过微信的开发者平台上的相关文档来实现这个简单的功能. 1.在微信开发者平台注册应用程序的id,通过审核后可以获得一个appid 2.有了appID后下载最新的微信终端sdk文件,SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 这三个.资料下载页面: https://open.weixin.qq.com/cgi-bin/showd

利用浏览器调试APP中的H5页面

安卓手机的情况下,可以用chrome浏览器来调试. 打开地址: chrome://inspect/#devices 手机用USB数据线连接电脑,并启动USB调试模式. 只要在APP中打开H5页面,界面就会显示该页面地址 点击inspect进入调试模式 之后就可以像调试浏览器页面一样调试了. 这个方法也可以用来查看APP中哪些页面调用的是H5的页面. 苹果手机可以用Safari自带的调试工具调试,在Safari浏览器工具栏-开发一栏下.

如何把apk编译时间和最后次git commit的sha值,写入到app中

需求背景:我们修复Bug的时候,频繁提交APK包,导致测试同学搞不清哪个包才是最新的 比如一个版本3.0.1,我们可能后续基于这个版本陆续提交了好几个修复包 同时,如果服务端ip地址能在界面上配置的话,更好了 以上都是基于debug模式下的,线上版本不会出现这些选项 思路:git每次提交commit的时候,都会创建一个唯一的sha串,我们拿这个作为内部版本号. 先给上最终效果图 那么如何在gradle编译的时候,就把这些信息写入到app中呢 关键字 BuildConfig类. 在build.gr

iOS利用HealthKit框架从健康app中获取步数信息

微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食. 统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为我们统计好了步数数据 我们只要使用HealthKit框架从健康app中获取这个数据信息就可以了 这篇文章对HealthKit框架进行了简单的介绍:http://www.cocoachina.com/ios/20140915/9624.html 对HealthKit框架有了简单的了解后我们就可以开始了