`

IOS缓存管理之YYCache使用

    博客分类:
  • ios
阅读更多

前言:

    最近一直在致力于为公司app添加缓存功能,为了寻找一个最佳方案,这几天先做个技术预研,经过这两天的查找资料基本上确定了两个开源框架进行选择,这两个开源框架分别是:PINCache、YYCache,上篇已经简单介绍了PINCache使用,本篇主要来学习一下YYCache的使用方式,以及和PINCache性能的简单对比。

关于YYCache

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来做.

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=@"I want to know who is lcj ?";
    //模拟一个key
    //异步方式
    NSString *key=@"key";
    YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
    //根据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缓存LRU清理

  LRU(Least Recently Used)算法大家都比较熟悉,翻译过来就是“最近最少使用”,LRU缓存就是使用这种原理实现,简单的说就是缓存一定量的数据,当超过设定的阈值时就把一些过期的数据删除掉,比如我们缓存10000条数据,当数据小于10000时可以随意添加,当超过10000时就需要把新的数据添加进来,同时要把过期数据删除,以确保我们最大缓存10000条,那怎么确定删除哪条过期数据呢,采用LRU算法实现的话就是将最老的数据删掉。接下来我们测试一下

 

YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
[yyCache.memoryCache setCountLimit:50];//内存最大缓存数据个数
[yyCache.memoryCache setCostLimit:1*1024];//内存最大缓存开销 目前这个毫无用处
[yyCache.diskCache setCostLimit:10*1024];//磁盘最大缓存开销
[yyCache.diskCache setCountLimit:50];//磁盘最大缓存数据个数
[yyCache.diskCache setAutoTrimInterval:60];//设置磁盘lru动态清理频率 默认 60秒

 

模拟一下清理

 

for(int i=0 ;i<100;i++){
        //模拟数据
        NSString *value=@"I want to know who is lcj ?";
        //模拟一个key
        NSString *key=[NSString stringWithFormat:@"key%d",i];
        [yyCache setObject:value forKey:key];
    }

    NSLog(@"yyCache.memoryCache.totalCost:%lu",(unsigned long)yyCache.memoryCache.totalCost);
    NSLog(@"yyCache.memoryCache.costLimit:%lu",(unsigned long)yyCache.memoryCache.costLimit);

    NSLog(@"yyCache.memoryCache.totalCount:%lu",(unsigned long)yyCache.memoryCache.totalCount);
    NSLog(@"yyCache.memoryCache.countLimit:%lu",(unsigned long)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",(unsigned long)yyCache.diskCache.totalCost);
        NSLog(@"yyCache.diskCache.costLimit:%lu",(unsigned long)yyCache.diskCache.costLimit);

        NSLog(@"yyCache.diskCache.totalCount:%lu",(unsigned long)yyCache.diskCache.totalCount);
        NSLog(@"yyCache.diskCache.countLimit:%lu",(unsigned long)yyCache.diskCache.countLimit);

        for(int i=0 ;i<100;i++){
            //模拟一个key
            NSString *key=[NSString stringWithFormat:@"whoislcj%d",i];
            id vuale=[yyCache objectForKey:key];
            NSLog(@"key :%@ value : %@",key ,vuale);
        }

    });

 

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

YYCache与PINCache对比

 对于我这里的使用场景大部分用于缓存json字符串,我这里就以存储字符串来对比一下写入与读取效率

1.写入性能对比

YYCache

 

//模拟数据
    NSString *value=@"I want to know who is lcj ?";
    //模拟一个key
    NSString *key=@"key";
    //YYCache
    YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
    //写入数据
    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
    [yyCache setObject:value forKey:key withBlock:^{
        CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();

        NSLog(@" yyCache async setObject time cost: %0.5f", end - start);
    }];

    CFAbsoluteTime start1 = CFAbsoluteTimeGetCurrent();
    [yyCache setObject:value forKey:key];
    CFAbsoluteTime end1 = CFAbsoluteTimeGetCurrent();
    NSLog(@" yyCache sync setObject time cost: %0.5f", end1 - start1);

 

 

 

分享到:
评论

相关推荐

    IOS缓存管理之YYCache使用详解

    IOS 缓存管理之 YYCache 使用详解 在 IOS 开发中,缓存管理是一个非常重要的方面,YYCache 是一个非常流行的缓存管理框架。本文将对 YYCache 的使用进行详细的介绍,包括内存缓存和硬盘缓存的实现原理、使用方法和...

    两个半小时玩转iOS缓存之YYCache、视频讲解详细清晰.wmv

    两个半小时玩转iOS缓存之YYCache、视频讲解详细清晰.wmv

    ios-基于AFN3.0封装自带缓存.zip

    增加GET/POST数据缓存、获取缓存大小、清空缓存功能 接口增加刷新缓存功能 增加取消所有请求、取消单个请求功能 格式化打印日志 增加对手动取消请求接口是否在失败时还回调的控制 博文专门介绍如何使用:...

    ios-AFNetworking和YYCache超强二次封装.zip

    YYCache和AFNetworking的二次封装,常见的有GET、POST、文件上传/下载、网络状态监测的功能,实现在网络数据的自动缓存 简书地址: http://www.jianshu.com/p/fa627a20c560

    ios-对AFNetworking 3.x 的二次封装,结合YYCache实现对网络数据的缓存,简单易用;.zip

    对AFNetworking 3.x 的二次封装,封装常见的GET、POST、文件上传/下载、网络状态监测的功能、方法接口简洁明了,并结合YYCache实现对网络数据的缓存,简单易用,不用再写FMDB那烦人的SQL语句,一句代码搞定网络数据的请求...

    ios-WebView离线缓存.zip

    本项目“ios-WebView离线缓存.zip”主要探讨的是如何利用YYCache和系统提供的NSURLProtocol实现WebView的离线缓存功能,这对于在网络状况不佳或者无网络环境下的用户体验提升至关重要。 YYCache是由著名iOS开发者...

    ios-基于AFNetworking3.0的网络请求封装,带有缓存.zip

    最近很多人问一些基于AFNetworking3.0网络请求的封装,其实不用真的不用封装,唯一需要封装的地方就是客户端做缓存,统一把所有请求做了缓存接口。缓存用的是YYCache。基于AFNetworking的demo

    YYCache:适用于iOS的高性能缓存框架

    适用于iOS的高性能缓存框架。 (它是的组件) 表现 您可以并编译最新版本的sqlite,而忽略iOS系统中的libsqlite3.dylib以获得更高的性能。 有关更多基准案例,请参阅Benchmark/CacheBenchmark.xcodeproj 。 特征 ...

    swift-基于YYCache和AFNetworking封装的一个网络请求库

    AFNetworking是iOS和macOS平台上最广泛使用的网络库之一,由Alamofire Software Foundation维护。它提供了强大的HTTP客户端,支持异步请求、上传和下载、流媒体以及NSURLSession的全面集成。AFNetworking的设计模式...

    YYCache实现对网络数据的缓存

    对AFNetworking 3.x 与YYCache的二次封装,封装常见的GET、POST、文件上传/下载、网络状态监测的功能、方法接口简洁明了,并结合YYCache实现对网络数据的缓存,简单易用,不用再写FMDB那烦人的SQL语句,一句代码搞定网络...

    ios-数据请求,数据缓存,刷新处理,网络监测,空白页展示全在这了。.zip

    功能介绍: 1.网络情球(AFN)常用post,get,上传图片,一次上传多张; 2.数据缓存(YYCache) 3.数据刷新(MJRefresh) 4.网络监测 (Reachability) 5.空白页处理(DZNEmptyData)

    ios-HJNetwork网络请求 支持RESTful方式请求和数据缓存.zip

    同时使用YYCache做了强大的缓存策略。 拥有 AFNetwork 大部分常用功能,包括网络状态监听等,提供类方法和实例方法调用。 非常好的扩展性,开放出了YYCache和AFNetwork的实例对象,更便于满足各种不同需求。 ...

    YYCache:适用于iOS的高性能缓存框架

    适用于iOS的高性能缓存框架。 (它是的组件) 表现 您可以并编译最新版本的sqlite,而忽略iOS系统中的libsqlite3.dylib以获得更高的性能。 有关更多基准案例,请参阅Benchmark/CacheBenchmark.xcodeproj 。 特征 ...

    ios-基于AFNetworking3.0的请求封装,带有缓存,超时时间.zip

    最近很多人问一些基于AFNetworking3.0网络请求的...缓存用的是YYCache。基于AFNetworking的demo 由于上传第一份比较粗心少了一行代码,现在重新上传一份,并且添加了设置超时时间。可以自由设置超时时间和缓存方式

    ios-HJNetwork网络请求 支持RESTful方式请求和多种数据缓存.zip

    同时使用YYCache做了强大的缓存策略。 拥有 AFNetwork 大部分常用功能,包括网络状态监听等,提供类方法和实例方法调用。 非常好的扩展性,开放出了YYCache和AFNetwork的实例对象,更便于满足各种不同需求。 支持...

    ios-一行代码封装所有AFNetwork请求,并以URL缓存.zip

    对于AFNetwork http请求所有方法的封装,同时增加了YYCache的缓存策略缓存URL的返回(post上传方法均不缓存 一行代码,只需设置url,必要参数,成功的处理Block和失败的处理Block,即可操作并缓存http github地址:...

    ios-网络请求工作.zip

    本资源“ios-网络请求工作.zip”主要关注如何使用AFNetworking 3.0和YYCache来实现高效的网络请求和数据缓存。以下是相关的知识点详解: 1. **AFNetworking 3.0**:AFNetworking是一款广泛使用的Objective-C网络库...

    iOS开发优秀博客网页归档

    "YYCache源码分析.html"讨论的是YYCache,这是一个高效的内存和磁盘缓存库。了解其工作原理和如何适配到项目中,对于提升应用的响应速度和减少网络请求次数有显著帮助。 "php - 计算密集型和IO密集型 - ...

Global site tag (gtag.js) - Google Analytics