YYCache小编也是通过网络上面的介绍,对其进行基本的使用,希望能帮助到大家,下面小编不会对起其源码进行介绍如果大家想研究其内部的代码可以看看这篇博客写的非常不错:http://www.jianshu.com/p/b8dcf6634fab。

YYCache的下载地址:https://github.com/ibireme/YYCache.git

1. 内存缓存(YYMemoryCache)

存储的单元是_YYLinkedMapNode,除了key和value外,还存储了它的前后Node的地址_prev,_next.整个实现基于_YYLinkedMap,它是一个双向链表,除了存储了字典_dic外,还存储了头结点和尾节点.它实现的功能很简单,就是:有新数据了插入链表头部,访问过的数据结点移到头部,内存紧张时把尾部的结点移除.就这样实现了淘汰算法.因为内存访问速度很快,锁占用的时间少,所以用的速度最快的OSSpinLockLock

2. 硬盘缓存(YYDiskCache)

采用的是文件和数据库相互配合的方式.有一个参数inlineThreshold,默认20KB,小于它存数据库,大于它存文件.能获得效率的提高.key:path,value:cache存储在NSMapTable里.根据path获得cache,进行一系列的set,get,remove操作更底层的是YYKVStorage,它能直接对sqlite和文件系统进行读写.每次内存超过限制时,select key, filename, size from manifest order by last_access_time desc limit ?1会根据时间排序来删除最近不常用的数据.硬盘访问的时间比较长,如果用OSSpinLockLock锁会造成CPU消耗过大,所以用的dispatch_semaphore_wait来做.

@interface YYCache : NSObject

// 读取当前数据库名称

@property (copy, readonly) NSString *name;

// memoryCache内存缓存,diskCache文件缓存

@property (strong, readonly) YYMemoryCache *memoryCache;

@property (strong, readonly) YYDiskCache *diskCache;

// 可通过下面三种方法来实例化YYCache对象

- (nullable instancetype)initWithName:(NSString *)name;

- (nullable instancetype)initWithPath:(NSString *)path NS_DESIGNATED_INITIALIZER;

+ (nullable instancetype)cacheWithPath:(NSString *)path;

// 禁止通过下面两个方式实例化对象

- (instancetype)init UNAVAILABLE_ATTRIBUTE;

+ (instancetype)new __attribute__((unavailable("new方法不可用,请用initWithName:")));

// 通过key判断是否缓存了某个东西,第二个法是异步执行,异步回调

- (BOOL)containsObjectForKey:(NSString *)key;

- (void)containsObjectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key, BOOL contains))block;

// 读--通过key读取缓存,第二个法是异步执行,异步回调

- (nullable id<NSCoding>)objectForKey:(NSString *)key;

- (void)objectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key, id<NSCoding> object))block;

// 增、改--缓存对象(可缓存遵从NSCoding协议的对象),第二个法是异步执行,异步回调

- (void)setObject:(nullable id<NSCoding>)object forKey:(NSString *)key;

- (void)setObject:(nullable id<NSCoding>)object forKey:(NSString *)key withBlock:(nullable void(^)(void))block;

// 删--删除缓存

- (void)removeObjectForKey:(NSString *)key;

- (void)removeObjectForKey:(NSString *)key withBlock:(nullable void(^)(NSString *key))block;

- (void)removeAllObjects;

- (void)removeAllObjectsWithBlock:(void(^)(void))block;

- (void)removeAllObjectsWithProgressBlock:(nullable void(^)(int removedCount, int totalCount))progress

endBlock:(nullable void(^)(BOOL error))end;

@end

下边直接上小编写的代码:

#import <YYCache.h>

//同步存储

- (void)synchronizingStorageForCache{

NSString * values = @"who is FLS";

NSString * key = @"fls";

NSArray * arr = @[@"1",@"2",@"3",@"4"];

NSString * key2 = @"arr1";

YYCache * cache = [YYCachecacheWithName:@"FLSCache"];

// ��   缓存实现,默认同时进行内存缓存与文件缓存

[cache setObject:values forKey:key];

[cache setObject:arr forKey:key2];

//    [cache.memoryCache setObject:values forKey:key];//只缓存在内存

//    [cache.diskCache setObject:values forKey:key];//只缓存在文件

//判断是否存在

BOOL success = [cache containsObjectForKey:key2];

NSLog(@"%@",success?@"YES":@"NO");

id obj = [cache objectForKey:key2];

NSLog(@"%@",obj);

NSLog(@"%@",cache.name);

//    [cache removeObjectForKey:key];//更具key删除

//    [cache removeAllObjects];//删除全部

}

//异步存储

- (void)asynchronousStorageForCache{

//模拟数据

NSString *value=@"I want to know who is FLS ?";

//模拟一个key

//异步方式

NSString *key=@"key";

YYCache *yyCache=[YYCachecacheWithName:@"FLSCache"];

//根据key写入缓存value

[yyCache setObject:value forKey:key withBlock:^{

NSLog(@"setObject sucess");

}];

//判断缓存是否存在

[yyCache containsObjectForKey:key withBlock:^(NSString * _Nonnull key, BOOL contains) {

NSLog(@"containsObject : %@", contains?@"YES":@"NO");

}];

//根据key读取数据

[yyCache objectForKey:key withBlock:^(NSString * _Nonnull key, id<NSCoding> _Nonnull object) {

NSLog(@"objectForKey : %@",object);

}];

//根据key移除缓存

[yyCache removeObjectForKey:key withBlock:^(NSString * _Nonnull key) {

NSLog(@"removeObjectForKey %@",key);

}];

//移除所有缓存

[yyCache removeAllObjectsWithBlock:^{

NSLog(@"removeAllObjects sucess");

}];

//移除所有缓存带进度

[yyCache removeAllObjectsWithProgressBlock:^(int removedCount,int totalCount) {

NSLog(@"removeAllObjects removedCount :%d  totalCount : %d",removedCount,totalCount);

} endBlock:^(BOOL error) {

if(!error){

NSLog(@"removeAllObjects sucess");

}else{

NSLog(@"removeAllObjects error");

}

}];

}

//定时清理

//YYCache和PINCache一样并没有实现基于最大内存开销进行LRU,不过YYCache实现了最大缓存数据个数进行LRU清理,这一点也是选择YYCache原因之一,对于YYCache磁盘LRU清理并不是及时清理,而是后台开启一个定时任务进行RLU清理操作,定时时间默认是60s。

- (void)LruDataCache{

YYCache *yyCache=[YYCachecacheWithName:@"FLSCache"];

[yyCache.memoryCache setCountLimit:50];//内存最大缓存数据个数

[yyCache.memoryCachesetCostLimit:1*1024];//内存最大缓存开销 目前这个毫无用处

[yyCache.diskCache setCostLimit:10*1024];//磁盘最大缓存开销

[yyCache.diskCache setCountLimit:50];//磁盘最大缓存数据个数

[yyCache.diskCachesetAutoTrimInterval:60];//设置磁盘lru动态清理频率 默认 60秒

for(int i=0 ;i<100;i++){

//模拟数据

NSString *value=@"I want to know who is FLS ?";

//模拟一个key

NSString *key=[NSStringstringWithFormat:@"key%d",i];

[yyCache setObject:value forKey:key];

}

NSLog(@"��yyCache.memoryCache.totalCost:%lu",(unsignedlong)yyCache.memoryCache.totalCost);

NSLog(@"��yyCache.memoryCache.costLimit:%lu",(unsignedlong)yyCache.memoryCache.costLimit);

NSLog(@"��yyCache.memoryCache.totalCount:%lu",(unsignedlong)yyCache.memoryCache.totalCount);

NSLog(@"��yyCache.memoryCache.countLimit:%lu",(unsignedlong)yyCache.memoryCache.countLimit);

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(120 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

NSLog(@"����yyCache.diskCache.totalCost:%lu",(unsignedlong)yyCache.diskCache.totalCost);

NSLog(@"����yyCache.diskCache.costLimit:%lu",(unsignedlong)yyCache.diskCache.costLimit);

NSLog(@"����yyCache.diskCache.totalCount:%lu",(unsignedlong)yyCache.diskCache.totalCount);

NSLog(@"����yyCache.diskCache.countLimit:%lu",(unsignedlong)yyCache.diskCache.countLimit);

for(int i=0 ;i<100;i++){

//模拟一个key

NSString *key=[NSStringstringWithFormat:@"key%d",i];

id vuale=[yyCache objectForKey:key];

NSLog(@"key :%@ value : %@",key ,vuale);

}

});

}

YYCache的基本使用相关推荐

  1. YYCache 源码学习(一):YYMemoryCache

    其实最近是在重新熟练Swift的使用,我想出了一个比较实用的方法,那就是一边看OC的项目,看懂之后用Swift实现一遍.这样既学习了优秀的源码又练习了Swift,一举两得. 之前看过几篇文章是剖析YY ...

  2. YYCache 源码分析(一)

    iOS 开发中总会用到各种缓存,YYCache或许是你最好的选择.性能上有优势,用法也很简单.作者ibireme曾经对比过同类轮子:http://blog.ibireme.com/2015/10/26 ...

  3. YYCache深入学习

    深知,源码还是一点点读,加点读书笔记,才可以深入挖掘,因此还是觉得每次读源码都记录一番,无论好坏,如有写错,请斧正 简介 YYCahce 是作为 ibireme 大神开源的一个YYkit组件库中的一部 ...

  4. YYCache 源码学习(二):YYDiskCache

    整体思路 从作者的<YYCache 设计思路>一文中可以看出,作者在设计YYDiskCache之前做了充分的测试:iPhone 6 64G 下,SQLite 写入性能比直接写文件要高,但读 ...

  5. YYKit系列之——YYCache使用

    YYCache类引用 继承自nsobject 中声明yycache.h 概述 YYCache是线程安全的缓存键值. 它使用YYMemoryCache存储对象在一个小而快内存缓存,并使用YYDiskCa ...

  6. YYCache 源码解析(一):使用方法,架构与内存缓存的设计

    YYCache是国内开发者ibireme开源的一个线程安全的高性能缓存组件,代码风格简洁清晰,阅读它的源码有助于建立比较完整的缓存设计的思路,同时也能巩固一下双向链表,线程锁,数据库操作相关的知识. ...

  7. iOS—缓存YYCache框架

    下载地址 :点击打开链接 一.简介: 计算上的的cache 就是高速缓存,计算机组成课程里的定义是,存在于主存和cpu之间,主要用于解决CPU处理数据的速度远远大于读取主存数据的速度. 手机上也有ca ...

  8. 源码解析--YYCache

    前言:准备看下YY系列中的YYWebImage框架,发现该框架是使用YYCache来做缓存的.那就从缓存开始吧. 先奉上YYCache框架的地址以及作者的设计思路 学习YYCache框架你可以get到 ...

  9. 面试总结 - YYCache

    YYCache YYCache 是提供用户使用的对象,内部对 YYMemoryCache 和 YYDiskCache 功能的整合封装.为 YYMemoryCache 提供了多线程功能,而 YYDisk ...

  10. 读 YYCache 源码解析

    YYCache 中分为YYMemoryCache 和 YYDiskCache 两种存储方式 下面解析两个类 使用 LRU淘汰算法 YYMemoryCache 内部是对的 _YYLinkedMap(双向 ...

最新文章

  1. SQL Server 2008 R2占用内存越来越大解决方法
  2. 如何用纯 CSS 创作气泡填色的按钮特效
  3. 高性能MySQL-3rd-(六)查询性能优化
  4. mysql 64位 8.0.11_mysql8.0.11 在windows64安装 步骤
  5. VS2017安装或卸载错误1303
  6. 谷歌也挖墙脚啊[抠鼻]
  7. 西南交通大学计算机应用基础,西南交通大学计算机应用基础作业-客观部分
  8. 绕过密码关闭趋势防毒墙
  9. iOS 【iOS-切换控制器的手段及异同】
  10. excel 计算复合增长率
  11. (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  12. 最近穷疯了只好吃馒头
  13. java nio 学习笔记2
  14. 如何在未越狱的ios系统安装ipa文件
  15. history查看历史命令,并显示运行时间
  16. MuleSoft知识总结-11.Mule基本组件(Transform Message)
  17. Hexo速度优化及遇到的问题(gulp4、hexo-neat)
  18. 无人驾驶汽车背后的伦理困境
  19. 注册网站域名多少钱_注册一个域名多少钱一年
  20. Python中 axis=0、axis=1是行还是列?

热门文章

  1. 抓大放小,把握项目管理中的关键行动
  2. 鼠标事件类型:click和dblclick事件共存依赖问题
  3. OMAP3630 Linux I2C总线驱动分析
  4. R语言怎样检验单位根是否存在
  5. DAY2022/07/26
  6. 计算机网络 数据链路层 要解决的三个问题 差错检测
  7. line-height 行高
  8. 解决PHP使用MPDF,图片不显示。
  9. 骨骼动画的插值与融合
  10. 按位与、或、异或等运算方法