欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

IOS緩存管理之YYCache使用詳解

前言:

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)霍林郭勒,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

最近一直在致力于為公司app添加緩存功能,為了尋找一個(gè)最佳方案,這幾天先做個(gè)技術(shù)預(yù)研,經(jīng)過這兩天的查找資料基本上確定了兩個(gè)開源框架進(jìn)行選擇,這兩個(gè)開源框架分別是:PINCache、YYCache,上篇已經(jīng)簡單介紹了PINCache使用,本篇主要來學(xué)習(xí)一下YYCache的使用方式,以及和PINCache性能的簡單對比。

關(guān)于YYCache

1. 內(nèi)存緩存(YYMemoryCache)

存儲(chǔ)的單元是_YYLinkedMapNode,除了key和value外,還存儲(chǔ)了它的前后Node的地址_prev,_next.整個(gè)實(shí)現(xiàn)基于_YYLinkedMap,它是一個(gè)雙向鏈表,除了存儲(chǔ)了字典_dic外,還存儲(chǔ)了頭結(jié)點(diǎn)和尾節(jié)點(diǎn).它實(shí)現(xiàn)的功能很簡單,就是:有新數(shù)據(jù)了插入鏈表頭部,訪問過的數(shù)據(jù)結(jié)點(diǎn)移到頭部,內(nèi)存緊張時(shí)把尾部的結(jié)點(diǎn)移除.就這樣實(shí)現(xiàn)了淘汰算法.因?yàn)閮?nèi)存訪問速度很快,鎖占用的時(shí)間少,所以用的速度最快的OSSpinLockLock

2. 硬盤緩存(YYDiskCache)

采用的是文件和數(shù)據(jù)庫相互配合的方式.有一個(gè)參數(shù)inlineThreshold,默認(rèn)20KB,小于它存數(shù)據(jù)庫,大于它存文件.能獲得效率的提高.key:path,value:cache存儲(chǔ)在NSMapTable里.根據(jù)path獲得cache,進(jìn)行一系列的set,get,remove操作更底層的是YYKVStorage,它能直接對sqlite和文件系統(tǒng)進(jìn)行讀寫.每次內(nèi)存超過限制時(shí),select key, filename, size from manifest order by last_access_time desc limit ?1會(huì)根據(jù)時(shí)間排序來刪除最近不常用的數(shù)據(jù).硬盤訪問的時(shí)間比較長,如果用OSSpinLockLock鎖會(huì)造成CPU消耗過大,所以用的dispatch_semaphore_wait來做.

YYCache使用

1.同步方式

  //模擬數(shù)據(jù)
  NSString *value=@"I want to know who is lcj ?";
  //模擬一個(gè)key
  //同步方式
  NSString *key=@"key";
  YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
  //根據(jù)key寫入緩存value
  [yyCache setObject:value forKey:key];
  //判斷緩存是否存在
  BOOL isContains=[yyCache containsObjectForKey:key];
  NSLog(@"containsObject : %@", isContains?@"YES":@"NO");
  //根據(jù)key讀取數(shù)據(jù)
  id vuale=[yyCache objectForKey:key];
  NSLog(@"value : %@",vuale);
  //根據(jù)key移除緩存
  [yyCache removeObjectForKey:key];
  //移除所有緩存
  [yyCache removeAllObjects];

2.異步方式

  //模擬數(shù)據(jù)
  NSString *value=@"I want to know who is lcj ?";
  //模擬一個(gè)key
  //異步方式
  NSString *key=@"key";
  YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
  //根據(jù)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");
  }];

  //根據(jù)key讀取數(shù)據(jù)
  [yyCache objectForKey:key withBlock:^(NSString * _Nonnull key, id<NSCoding> _Nonnull object) {
    NSLog(@"objectForKey : %@",object);
  }];

  //根據(jù)key移除緩存
  [yyCache removeObjectForKey:key withBlock:^(NSString * _Nonnull key) {
    NSLog(@"removeObjectForKey %@",key);
  }];
  //移除所有緩存
  [yyCache removeAllObjectsWithBlock:^{
    NSLog(@"removeAllObjects sucess");
  }];

  //移除所有緩存帶進(jìn)度
  [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緩存就是使用這種原理實(shí)現(xiàn),簡單的說就是緩存一定量的數(shù)據(jù),當(dāng)超過設(shè)定的閾值時(shí)就把一些過期的數(shù)據(jù)刪除掉,比如我們緩存10000條數(shù)據(jù),當(dāng)數(shù)據(jù)小于10000時(shí)可以隨意添加,當(dāng)超過10000時(shí)就需要把新的數(shù)據(jù)添加進(jìn)來,同時(shí)要把過期數(shù)據(jù)刪除,以確保我們最大緩存10000條,那怎么確定刪除哪條過期數(shù)據(jù)呢,采用LRU算法實(shí)現(xiàn)的話就是將最老的數(shù)據(jù)刪掉。接下來我們測試一下

  YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
  [yyCache.memoryCache setCountLimit:50];//內(nèi)存最大緩存數(shù)據(jù)個(gè)數(shù)
  [yyCache.memoryCache setCostLimit:1*1024];//內(nèi)存最大緩存開銷 目前這個(gè)毫無用處
  [yyCache.diskCache setCostLimit:10*1024];//磁盤最大緩存開銷
  [yyCache.diskCache setCountLimit:50];//磁盤最大緩存數(shù)據(jù)個(gè)數(shù)
  [yyCache.diskCache setAutoTrimInterval:60];//設(shè)置磁盤lru動(dòng)態(tài)清理頻率 默認(rèn) 60秒

模擬一下清理

  for(int i=0 ;i<100;i++){
    //模擬數(shù)據(jù)
    NSString *value=@"I want to know who is lcj ?";
    //模擬一個(gè)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++){
      //模擬一個(gè)key
      NSString *key=[NSString stringWithFormat:@"whoislcj%d",i];
      id vuale=[yyCache objectForKey:key];
      NSLog(@"key :%@ value : %@",key ,vuale);
    }

  });

YYCache和PINCache一樣并沒有實(shí)現(xiàn)基于最大內(nèi)存開銷進(jìn)行LRU,不過YYCache實(shí)現(xiàn)了最大緩存數(shù)據(jù)個(gè)數(shù)進(jìn)行LRU清理,這一點(diǎn)也是選擇YYCache原因之一,對于YYCache磁盤LRU清理并不是及時(shí)清理,而是后臺(tái)開啟一個(gè)定時(shí)任務(wù)進(jìn)行RLU清理操作,定時(shí)時(shí)間默認(rèn)是60s。

YYCache與PINCache對比

 對于我這里的使用場景大部分用于緩存json字符串,我這里就以存儲(chǔ)字符串來對比一下寫入與讀取效率

1.寫入性能對比

YYCache

  //模擬數(shù)據(jù)
  NSString *value=@"I want to know who is lcj ?";
  //模擬一個(gè)key
  NSString *key=@"key";
  //YYCache
  YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
  //寫入數(shù)據(jù)
  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);

運(yùn)行結(jié)果

IOS緩存管理之YYCache使用詳解

PINCache

   //PINCache
  //模擬數(shù)據(jù)
  NSString *value=@"I want to know who is lcj ?";
  //模擬一個(gè)key
  NSString *key=@"key";
  PINCache *pinCache=[PINCache sharedCache];
  //寫入數(shù)據(jù)
  CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
  [pinCache setObject:value forKey:key block:^(PINCache * _Nonnull cache, NSString * _Nonnull key, id _Nullable object) {
    CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();
    
    NSLog(@" pincache async setObject time cost: %0.5f", end - start);
  }];
  
  CFAbsoluteTime start1 = CFAbsoluteTimeGetCurrent();
  [pinCache setObject:value forKey:key];
  CFAbsoluteTime end1 = CFAbsoluteTimeGetCurrent();
  NSLog(@" pinCache sync setObject time cost: %0.5f", end1 - start1);

運(yùn)行結(jié)果

IOS緩存管理之YYCache使用詳解

通過上面的測試可以看出 同樣大小的數(shù)據(jù),無論同步方式還是異步方式,YYCache性能都要由于PINCache。

2.讀取性能對比

YYCache

  YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];
  //模擬一個(gè)key
  NSString *key=@"key";
  CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
  //讀取數(shù)據(jù)
  [yyCache objectForKey:key withBlock:^(NSString * _Nonnull key, id<NSCoding> _Nonnull object) {
    CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();
    NSLog(@" yyCache async objectForKey time cost: %0.5f", end - start);
  }];

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

運(yùn)行結(jié)果:

IOS緩存管理之YYCache使用詳解

PINCache

 PINCache *pinCache=[PINCache sharedCache];
  //模擬一個(gè)key
  NSString *key=@"key";
  CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
  //讀取數(shù)據(jù)
  [pinCache objectForKey:key block:^(PINCache * _Nonnull cache, NSString * _Nonnull key, id _Nullable object) {
    CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();
    NSLog(@" pincache async objectForKey time cost: %0.5f", end - start);
  }] ;
  
  CFAbsoluteTime start1 = CFAbsoluteTimeGetCurrent();
  [pinCache objectForKey:key];
  CFAbsoluteTime end1 = CFAbsoluteTimeGetCurrent();
  NSLog(@" pinCache objectForKey time cost: %0.5f", end1 - start1);

運(yùn)行結(jié)果:

IOS緩存管理之YYCache使用詳解

通過運(yùn)行結(jié)果,在讀取方面YYCache也是優(yōu)于PINCache。

總結(jié):

經(jīng)過一番查閱資料和自己寫例子測試,最終項(xiàng)目中決定使用YYCache進(jìn)行緩存管理。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)站標(biāo)題:IOS緩存管理之YYCache使用詳解
分享地址:http://aaarwkj.com/article28/ipdhjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、App設(shè)計(jì)定制開發(fā)、營銷型網(wǎng)站建設(shè)、虛擬主機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
国产高清亚洲精品视频| 欧美特黄大片在线观看| 变态另类专区一区二区三区| 美国一级二级三级黄片| 亚洲视频精品一区二区三区| 亚洲国产成人久久综合区| 日韩av在线专区观看| 亚洲老熟女老妇老女人| 99久久偷拍美女大白屁股| 97色伦97色伦国产在线| 欧美日韩精品免费在线观看| 高质量的性生活在线观看| 欧美日韩亚洲国产三级| 日韩免费av在线观看| 日本av人妻在线观看| 中文字幕不卡一区在线| 日本人妻风俗店中文字幕| 一区二区高清免费日本| 亚洲人妻在线一区二区三区| 国产精品一区二在线观看| 粉嫩一区二区三区精品视频| 女同三人按摩高潮喷出| 91九色国产老熟女乱子| 婷婷色中文字幕综合在线| 未满十八禁止下载软件| 亚洲成a人片777777久久| 青青草视频在线针对华人| 欧美一区二区三区高清正版| 日本欧美一区二区三区高清| 日本精品免费专区在线观看| 欧美成人一区二区三区八| 欧美夫妻成人性生活视频| 国内一级黄色片免费观看| 日本韩国精品视频在线| 色综合天天综合天天更新| 久久亚洲春色中文字幕| 亚洲天堂网免费在线看| 自拍日韩亚洲一区在线| 国产精品中文字幕有码| 亚洲一区二区三区日韩欧美| 欧美日韩黄片免费在线观看|