IOS缓存管理之YYCache使用详解

2020-01-21 00:45:44丽君

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字符串,我这里就以存储字符串来对比一下写入与读取效率