下载地址 :点击打开链接
一、简介:
计算上的的cache 就是高速缓存,计算机组成课程里的定义是,存在于主存和cpu之间,主要用于解决CPU处理数据的速度远远大于读取主存数据的速度。
手机上也有cache ,主要作用是保存一些软件生成的临时文件,避免每次都要重复地向服务器请求相同的数据,即浪费用户流量,也影响app响应速度。
二、YYCache 的组成
YYCache 由YYcache、YYDiskCache、YYMemoryCache 和YYKVStroage组成,其中YYKVStorage可直接对sqlite 和文件系统进行读写(YYDiskCache的底屋实现)
注意点
1.如果保存的自定义对象不遵守
NSCoding的协议或不实现
NSCoding协议的方法,就不能使用YYDiskCache进行长期缓存;
- (void)encodeWithCoder:(NSCoder *)aCoder;- (instancetype)initWithCoder:(NSCoder *)aDecoder;
一、YYCache 基本使用
1、同步方式
//模拟数据
NSString *value=@"I want to know who is lcj ?";
//模拟一个key
//同步方式
NSString *key=@"key";
YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
//根据key写入缓存value
[yyCache setObject:value forKey:key];
//判断缓存是否存在
BOOL isContains=[yyCache containsObjectForKey:key];
NSLog(@"containsObject : %@", isContains?@"YES":@"NO");
//根据key读取数据
id vuale=[yyCache objectForKey:key];
NSLog(@"value : %@",vuale);
//根据key移除缓存
[yyCache removeObjectForKey:key];
//移除所有缓存
[yyCache removeAllObjects];
2、异步方式
//模拟数据
NSString *value=@"test文字";
//存取时key
NSString *key =@"key";
//创建目录
YYCache *cache=[YYCache cacheWithName:@"haha"];
//判断缓存是否存在
[cache containsObjectForKey:key withBlock:^(NSString * _Nonnull key, BOOL contains) {
}];
//根据key写入缓存
[cache setObject:value forKey:key withBlock:^{
}];
//读取
[cache objectForKey:key withBlock:^(NSString * _Nonnull key, id<NSCoding> _Nonnull object) {
NSLog(@"%@",object);
}];
//根据key 移除缓存
[cache removeObjectForKey:key withBlock:^(NSString * _Nonnull key) {
}];
// 移除所有缓存
[cache removeAllObjectsWithBlock:^{
}];
//移除所有缓存带进度
[cache removeAllObjectsWithProgressBlock:^(int removedCount, int totalCount) {
} endBlock:^(BOOL error) {
if (!error) {
NSLog(@"移除成功");
}
else
{
NSLog(@"移除失败");
}
}];
二、YYCache 缓存LRU清理
LRU(Least Recently used)算法大家都比较熟悉,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现的话就是将最老的数据删掉。
YYCache *cache=[YYCache cacheWithName:@"myText"];
//内存最大缓存数据个数
[cache.memoryCache setCountLimit:50];
//内存最大缓存开销,目前这个没有效果
[cache.memoryCache setCostLimit:1*1024];
//磁盘最大缓存开销
[cache.diskCache setCostLimit:1*1024];
//磁盘最大缓存数据个数
[cache.diskCache setCountLimit:50];
//设置磁盘lru动态清理频率 默认 60秒
[cache.diskCache setAutoTrimInterval:60];
for (int i=0; i<100; i++) {
NSString *str=[NSString stringWithFormat:@"第%d条数据",i+1];
NSString *key=[NSString stringWithFormat:@"key%d",i];
[cache setObject:str forKey:key];
}
NSLog(@"cache.memoryCache.totalCost=%lu",(unsigned long)cache.memoryCache.totalCost);
NSLog(@"cache.memoryCache.costLimit=%lu",(unsigned long)cache.memoryCache.costLimit);
NSLog(@"cache.memoryCache.totalCount=%lu",(unsigned long)cache.memoryCache.totalCount);
NSLog(@"cache.memoryCache.countLimit=%lu",(unsigned long)cache.memoryCache.countLimit);
NSLog(@"cache.diskCache.totalCost=%lu",(unsigned long)cache.diskCache.totalCost);
NSLog(@"cache.diskCache.costLimit=%lu",(unsigned long)cache.diskCache.costLimit);
NSLog(@"cache.diskCache.totalCount=%lu",(unsigned long)cache.diskCache.totalCount);
NSLog(@"cache.diskCache.countLimit=%lu",(unsigned long)cache.diskCache.countLimit);
for(int i=0 ;i<100;i++){
//模拟一个key
NSString *key=[NSString stringWithFormat:@"key%d",i];
id vuale=[cache objectForKey:key];
NSLog(@"%@=%@",key ,vuale);
}