IOS缓存管理之PINCache使用
前言:
今年重点在于公司iOS架构的梳理工作,上周整理了http请求接口管理与解耦,接下来准备整理一下项目中的缓存处理,目前项目中使用的是PINCache,去年加入这个开源框架时并没有对这个框架进行了解,导致现在同步方式异步方式的使用存在一定的混乱情况和错误使用现象。今天重新站在使用者的角度对这个再做一次了解,以避免在后期的使用中出现类似以往的问题。
关于缓存:
无论是Android还是IOS都会使用到缓存,缓存的设计方案也大致雷同(内存缓存+磁盘缓存),内存缓存方面Android采用LinkedHashMap,IOS采用NSDictionary,两者都是基于Key-Value模型进行存储,磁盘缓存方面Android采用写文件,IOS这边采用归档操作本质是也是写文件。
关于PINCache
PINCache是Pinterest的程序员在Tumblr的TMCache基础上发展而来的,TMCache已经不再维护,PINCache主要的改进是修复了dealock的bug,是一个快速,无死锁的并行对象缓存,支持 iOS 和 OS X 系统。上面已经了解到PINCache分两层缓存(内存缓存+磁盘缓存),内部实现主要有两个类实现:PINMemoryCache、PINDiskCache,同时对两者提供了同步异步调用方式,由于磁盘缓存采用的是归档操作,所以对自定义的对象必须实现NSCoding协议,PINCache除了可以按键取值、按键存值、按键删值之外,还可以移除某个日期之前的缓存数据、删除所有缓存、限制缓存大小,限制缓存对象的存活时间等。接下来看下具体使用方式。
PINCache使用
同步方式
//模拟数据
NSString *value=@"who is lcj";
//模拟一个key
NSString *key=@"whoislcj";
//sync 同步方式
//写入缓存
[[PINCache sharedCache] setObject:value forKey:key]; //判断缓存是否存在
BOOL containsObject =[[PINCache sharedCache] containsObjectForKey:key];
NSLog(@"containsObject : %@", containsObject?@"YES":@"NO"); //根据key读取数据
id vuale=[[PINCache sharedCache] objectForKey:key];
NSLog(@"value : %@",vuale); //根据key移除缓存
[[PINCache sharedCache]removeObjectForKey:key]; //移除所有缓存
[[PINCache sharedCache]removeAllObjects]; //根据截至日期 清除缓存
[[PINCache sharedCache]trimToDate:[NSDate date]];
异步方式
//模拟数据
NSString *value=@"who is lcj";
//模拟一个key
NSString *key=@"whoislcj";
//async 异步方式
//写入数据
[[PINCache sharedCache] setObject:value forKey:key block:^(PINCache * _Nonnull cache, NSString * _Nonnull key, id _Nullable object) {
NSLog(@"value : %@",object);
}]; //判断缓存是否存在
[[PINCache sharedCache]containsObjectForKey:key block:^(BOOL containsObject) {
NSLog(@"isContains : %@", containsObject?@"YES":@"NO");
}]; //根据key读取数据
[[PINCache sharedCache]objectForKey:key block:^(PINCache * _Nonnull cache, NSString * _Nonnull key, id _Nullable object) {
NSLog(@"value : %@",object);
}]; //根据key移除缓存
[[PINCache sharedCache]removeObjectForKey:key block:^(PINCache * _Nonnull cache, NSString * _Nonnull key, id _Nullable object) {
NSLog(@"value : %@",cache);
}]; //移除都有缓存
[[PINCache sharedCache]removeAllObjects:^(PINCache * _Nonnull cache) {
NSLog(@"value : %@",cache);
}]; //根据截至日期 清除缓存
[[PINCache sharedCache]trimToDate:[NSDate date] block:^(PINCache * _Nonnull cache) {
NSLog(@"value : %@",cache);
}];
PINCache使用起来还是非常容易的。
PINCache缓存LRU清理机制
LRU(Least Recently Used)算法大家都比较熟悉,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现的话就是将最老的数据删掉。接下来我们测试一下,
PINCache *pinCache=[PINCache sharedCache];
//模拟内存使用最大开销限制是1k
[pinCache.memoryCache setCostLimit:*];
//模拟磁盘使用最大开销限制是10k
[pinCache.diskCache setByteLimit:*];
模拟500条数据进行存储
for(int i =;i<;i++){
//模拟数据
NSString *value=@"I want to know who is lcj ?";
//模拟一个key
NSString *key=[NSString stringWithFormat:@"whoislcj:%d",i];
//写入数据
[pinCache setObject:value forKey:key];
}
NSLog(@"pinCache.memoryCache.totalCost:%lu",(unsigned long)pinCache.memoryCache.totalCost);
NSLog(@"pinCache.memoryCache.costLimit:%lu",(unsigned long)pinCache.memoryCache.costLimit);
NSLog(@"pinCache.diskCache.byteCount:%lu",(unsigned long)pinCache.diskCache.byteCount);
NSLog(@"pinCache.diskCache.byteLimit:%lu",(unsigned long)pinCache.diskCache.byteLimit);

通过上述的运行结果会发现,diskCache起作用了,memoryCache并没有起作用,我一步步跟进源码查看跟踪到memoryCache.m这段代码
- (void)setObject:(id)object forKey:(NSString *)key
{
[self setObject:object forKey:key withCost:];
}
由于每次保存内存存进去的cost开销都是0,由于导致totalCost累计也是0,与costLimit对比永远无法进行内存lru处理,声明一下:我们用的版本是2.3版本,最新的3.0.1-beta.2也有同样的问题,是PINCache没有实现内存LRU还是这仅仅是一个bug就不得而知了。
总结:
内部源码大致看了一遍,大致明白内部实现原理,由于理解不够深刻,就不对其源码进行分析了,大致了解一下具体使用方式。
IOS缓存管理之PINCache使用的更多相关文章
- iOS缓存框架-PINCache解读
文/Amin706(简书作者)原文链接:http://www.jianshu.com/p/4df5aad0cbd4著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在项目中总是需要缓存一 ...
- IOS缓存管理之YYCache使用
前言: 最近一直在致力于为公司app添加缓存功能,为了寻找一个最佳方案,这几天先做个技术预研,经过这两天的查找资料基本上确定了两个开源框架进行选择,这两个开源框架分别是:PINCache.YYCach ...
- iOS内存管理编程指南
iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...
- HTML5 离线缓存管理库
一.HTML5离线缓存技术 支持离线缓存是HTML5中的一个重点,离线缓存就是让用户即使在断网的情况下依然可以正常的运行应用.传统的本地存储数据的方式有 localstorage,sessionsto ...
- Spring自定义缓存管理及配置Ehcache缓存
spring自带缓存.自建缓存管理器等都可解决项目部分性能问题.结合Ehcache后性能更优,使用也比较简单. 在进行Ehcache学习之前,最好对Spring自带的缓存管理有一个总体的认识. 这篇文 ...
- iOS内存管理
iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- 基于吉日嘎拉的通用权限管理WebForm版扩展:字典选项管理和缓存管理
关于字典管理,其实就是2个表,一个表记录字典和对应表,另一个表记录字典内容.我这里改名为字典选项,其实是一个意思.直接上图: 这里的字典选项是分子系统的,每个子系统可以有自己的单独字典,方便管理.但是 ...
- [js开源组件开发]localStorage-cache本地存储的缓存管理
localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 ...
随机推荐
- WINDOWS下搭建SVN服务器端的步骤分享(Subversion)
1.获取svn程序 2.安装 Subversion(以下简称SVN)的服务器端和客户端.下载下来的服务器端是个 zip压缩包,直接解压缩即可,比如我解压到 E:\subversion .客户端安装文件 ...
- DWR3.0框架入门(3) —— ScriptSession的维护及优化
1.ScriptSession使用中存在的问题 在上一节实现了服务器的推送功能,但是根据 ScriptSession的生命周期我们可以得出以下几点的问题: (1)ScriptSess ...
- [cocos2d-x] --- CCNode类详解
Email : awodefeng@163.com 1 CCNode是cocos2d-x中一个很重要的类,CCNode是场景.层.菜单.精灵等的父类.而我们在使用cocos2d-x时,接触最多的就是场 ...
- Map笔记
Map,是一个接口,是以键值对的方式存储的,并且键是无序且不可重复的.Map和Collection没有什么关系,Map是一对一对的存,而Collection是一个一个的存. 下面有一个子接口:Sort ...
- 获取IIS版本
近日,有一项目要分别获取iis6.0和7.5,然后对进程进行操作~ 研究良久,有以下办法获取iis版本. 代码: DirectoryEntry getEntity = new DirectoryEnt ...
- iOS 之 网络 NSURLSession
NSURLSession相比NSURLConnection功能更强大,是更上层的网络封装.相比而言,普通应用场景下NSURLSession没有什么优势,但是,在程序切换到后台的情况下,NSURLSes ...
- WDA 程序文本翻译OTR
1.针对直接使用表字段,数据元素的情况: 1.1修改数据元素对应的语言值:DD04T. 1.2模拟SE63插入翻译条目:LXE_LOG 1.3运行时文件翻译条目:DDFTX *&------- ...
- UVa 706 & ZOJ 1146 LC-Display
题目大意:给你一个数字n和字体大小s,输出数字的液晶显示.直接模拟,代码如下: #include <stdio.h> void draw(int n,int s,int row) { in ...
- CSS 文本、字体、链接
CSS 文本属性可定义文本的外观. 通过文本属性,您可以改变文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. 缩进文本 把 Web 页面上的段落的第一行缩进,这是一种最常用的文本格式化 ...
- ORACLE Postgresql中文排序
当我们order排序不能够实现我们想要的内容时候,尝试一下NLSSORT这个函数吧 他不仅仅按照姓氏排序,名也会排序: nls_param用于指定语言特征,格式为nls_sort = sor ...