亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS緩存管理之YYCache使用詳解

2020-07-26 02:42:19
字體:
來源:轉載
供稿:網友

前言:

最近一直在致力于為公司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);

運行結果

PINCache

   //PINCache  //模擬數據  NSString *value=@"I want to know who is lcj ?";  //模擬一個key  NSString *key=@"key";  PINCache *pinCache=[PINCache sharedCache];  //寫入數據  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);

運行結果

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

2.讀取性能對比

YYCache

  YYCache *yyCache=[YYCache cacheWithName:@"LCJCache"];  //模擬一個key  NSString *key=@"key";  CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();  //讀取數據  [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);

運行結果:

PINCache

 PINCache *pinCache=[PINCache sharedCache];  //模擬一個key  NSString *key=@"key";  CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();  //讀取數據  [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);

運行結果:

通過運行結果,在讀取方面YYCache也是優于PINCache。

總結:

經過一番查閱資料和自己寫例子測試,最終項目中決定使用YYCache進行緩存管理。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人久久精品视频| 国产综合视频在线观看| 黑人精品xxx一区一二区| 欧美电影免费在线观看| 亚洲欧美日韩在线一区| 欧美又大粗又爽又黄大片视频| www.欧美精品一二三区| 国产日韩欧美另类| 久久97久久97精品免视看| 日韩精品中文字幕视频在线| 色777狠狠综合秋免鲁丝| 欧美成aaa人片免费看| 日韩大片免费观看视频播放| 亚洲欧美制服第一页| 国产一区二区三区欧美| 国产精品电影一区| 亚洲性生活视频在线观看| 欧美激情中文字幕在线| 理论片在线不卡免费观看| 91中文字幕在线观看| 91在线播放国产| 欧美亚洲在线播放| 国产视频福利一区| 成人精品aaaa网站| 国产精品久久久久999| 成人xxxxx| 国产成人97精品免费看片| 欧美成人四级hd版| 国产乱肥老妇国产一区二| xxav国产精品美女主播| 亚洲精品免费网站| 欧美孕妇孕交黑巨大网站| 超薄丝袜一区二区| 国产美女久久精品| 美女999久久久精品视频| 7m第一福利500精品视频| 久久99精品久久久久久青青91| 国产一区二区日韩精品欧美精品| 久久躁日日躁aaaaxxxx| 亚洲国产精品大全| 国产精品三级美女白浆呻吟| 红桃视频成人在线观看| 国产精品成人一区二区| 日韩av在线网站| 91精品国产91久久久| 久久久久久久成人| 欧美精品videos另类日本| 国模极品一区二区三区| 91久久久久久久久久| 大伊人狠狠躁夜夜躁av一区| 日韩国产欧美精品一区二区三区| 夜夜嗨av色一区二区不卡| 日韩精品中文在线观看| 日本一区二三区好的精华液| 欧美黑人性视频| 亚洲精品美女久久| 欧美性受xxxx黑人猛交| 中文字幕av一区| 亚洲三级 欧美三级| 国产精品视频地址| 欧美日韩成人在线播放| 91免费精品国偷自产在线| 亚洲一区二区中文| 超碰91人人草人人干| 欧美成人性色生活仑片| 中文字幕精品www乱入免费视频| 日韩精品中文字幕有码专区| 国产高清在线不卡| 少妇高潮久久久久久潘金莲| 欧美日韩电影在线观看| 91美女福利视频高清| 欧美性猛交xxxx免费看| 黄色一区二区在线观看| 8090成年在线看片午夜| 精品久久久久久国产91| 色妞久久福利网| 久久久精品一区二区三区| 中文国产成人精品久久一| 欧美孕妇毛茸茸xxxx| 日韩欧美第一页| 亚洲尤物视频网| 91亚洲永久免费精品| 国产一区二区黑人欧美xxxx| 欧美日韩另类视频| 欧美日韩国产91| 国产成人精品免高潮费视频| 中文字幕精品视频| 欧美色视频日本高清在线观看| 日韩视频免费大全中文字幕| 欧美日韩精品中文字幕| 日韩最新中文字幕电影免费看| 欧美精品videosex性欧美| 97涩涩爰在线观看亚洲| 亚洲第一精品电影| 亚洲影视中文字幕| 精品久久久久久久久久久久久久| 日日噜噜噜夜夜爽亚洲精品| 久久久久国色av免费观看性色| 91美女福利视频高清| 一区二区三区精品99久久| 97在线观看视频| 中日韩美女免费视频网址在线观看| 久久久久久久久91| 精品亚洲夜色av98在线观看| 一本大道亚洲视频| 亚洲国产精品久久久久久| 欧美多人爱爱视频网站| 亚洲a区在线视频| 色av中文字幕一区| 欧美色xxxx| 日韩美女中文字幕| 午夜精品久久久久久99热软件| 国产精品久久久久7777婷婷| 欧美视频在线观看 亚洲欧| 最近2019中文字幕mv免费看| 91av在线影院| 欧美成人精品在线| 国产成人精品av| 中文字幕欧美亚洲| 久久久久久有精品国产| 26uuu亚洲伊人春色| 日韩精品在线看| 国产精品无码专区在线观看| 日韩久久午夜影院| 国产精品av网站| 韩国日本不卡在线| 成人网在线视频| 国产精品一区二区av影院萌芽| 亚洲国产成人精品女人久久久| 国内精品小视频| 色www亚洲国产张柏芝| 这里精品视频免费| 91九色精品视频| 亚洲激情第一页| 亚洲图片制服诱惑| 国产精品旅馆在线| 日韩av在线一区二区| 国产va免费精品高清在线| 中文字幕日韩欧美精品在线观看| 国产精品久久久久久中文字| 亚洲一区二区久久久| 日韩精品欧美国产精品忘忧草| 精品性高朝久久久久久久| 一区二区三区无码高清视频| 欧美主播福利视频| 日韩精品中文字幕在线播放| 欧美激情综合亚洲一二区| 国产丝袜一区二区三区免费视频| 国产精品高清在线| 久久综合88中文色鬼| 久久国产精彩视频| 日韩视频―中文字幕| 精品日韩视频在线观看| 亚洲欧美另类国产| 精品亚洲一区二区三区| 日韩av免费一区| 亚洲精品大尺度| 久久在线免费观看视频| 97人人模人人爽人人喊中文字| 奇门遁甲1982国语版免费观看高清| 久久精品99无色码中文字幕| 成人黄色在线播放| 日韩av成人在线观看| 一本色道久久88亚洲综合88|