iOS緩存小結(jié)

我們平常的iOS開發(fā)過程中湃崩,總會(huì)遇到各種需要緩存的需求,今天就來總結(jié)一下關(guān)于緩存方面的知識(shí)。

從緩存的類型上來說呀狼,通常一個(gè)緩存是由內(nèi)存緩存和磁盤緩存組成的。

內(nèi)存緩存其容量有限但是可以高速存取损离,反之磁盤緩存是一種容量大但存儲(chǔ)速率相對較慢的緩存哥艇。

蘋果也為開發(fā)者提供了一種內(nèi)存緩存方式NSCache,NSCache的API類似于NSDictionary僻澎,使用方便貌踏,在著名的AF和SDWebImage框架中被使用來進(jìn)行緩存管理。

這里要注意一下:

蘋果官方文檔提到過在系統(tǒng)內(nèi)存吃緊發(fā)出內(nèi)存警告時(shí)窟勃,NSCache會(huì)自動(dòng)釋放對象祖乳。因此通常會(huì)在

收到內(nèi)存警告時(shí)主動(dòng)調(diào)用其removeAllObjects方法來釋放對象。

NSCache是線程安全的秉氧,因此在多線程操作中眷昆,不需要對其加鎖。

NSCache的key只是對對象進(jìn)行強(qiáng)引用而不是拷貝汁咏,因此在清理時(shí)計(jì)算的大小是緩存的實(shí)際大小而不是引用的大小亚斋。

NSCache提供了NSCacheDelegate,在緩存對象即將被清理的時(shí)候(回收過程)攘滩,系統(tǒng)回調(diào)其代理方法帅刊,一般只在測試環(huán)境下調(diào)用。

提供一段簡單的代碼看下:

NSCache

另外漂问,參考來自大神ibireme文章的分析:NSCache的性能和key 的相似度有關(guān)赖瞒,如果存在大量相似的key(比如"1","2","3"......)NSCache的存儲(chǔ)性能下降的會(huì)非常厲害,大量的時(shí)間被消耗在CFStringEqual()上级解。

磁盤緩存的實(shí)現(xiàn)技術(shù)大致分為三類:基于文件讀寫冒黑,基于mmap文件內(nèi)存映射,基于數(shù)據(jù)庫勤哗;

SDWebImage抡爹,TMDiskCache等緩存都是基于文件系統(tǒng)的,即一個(gè)value對應(yīng)一個(gè)文件芒划,通過文件讀寫來緩存數(shù)據(jù)冬竟,他們的性能比較相近欧穴。

FastImageCache采用的是mmap將文件映射到內(nèi)存。mmap也有缺點(diǎn):熱數(shù)據(jù)的文件不要超過物理內(nèi)存大小泵殴,不然mmap會(huì)導(dǎo)致內(nèi)存交換嚴(yán)重降低性能涮帘;另外內(nèi)存中的數(shù)據(jù)是定時(shí)flush到文件的,如果數(shù)據(jù)還未同步時(shí)程序就掛掉了就會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)誤笑诅,除了這些mmap性能還是很高的调缨。

NSURLCache和faceBook的FBDiskCache都是基于SQLite數(shù)據(jù)庫的∵耗悖基于數(shù)據(jù)庫的緩存可以很好的元數(shù)據(jù)弦叶,擴(kuò)展方便,數(shù)據(jù)統(tǒng)計(jì)速度快妇多,也很容易實(shí)現(xiàn)LRU或其他淘汰算法伤哺,但讀寫性能取決于數(shù)據(jù)大小,當(dāng)單條數(shù)據(jù)小于20k時(shí)者祖,數(shù)據(jù)越小SQLite讀取性能越好立莉,單條數(shù)據(jù)大于20k時(shí),直接寫文件的速度會(huì)更快七问。

備注:

關(guān)于OSSpinLock自旋鎖:性能最高的鎖蜓耻,原理很容易理解,就是一直忙等(dowhile)械巡,但等待時(shí)會(huì)消耗大量CPU資源媒熊,所以它不適用于較長時(shí)間的任務(wù),但是對于內(nèi)存緩存的存取來說它非常合適坟比。

dispatch_semaphore是信號(hào)量芦鳍,當(dāng)信號(hào)總量設(shè)為1時(shí)也可以當(dāng)做鎖來用。在沒有等待情況出現(xiàn)時(shí)葛账,它的性能比pthread_mutex還高柠衅,一旦有等待情況出現(xiàn)時(shí),其性能就會(huì)下降很多籍琳。相對于OSSpinLock來說菲宴,它的優(yōu)勢在于等待時(shí)不會(huì)消耗CPU資源,對于磁盤緩存來說它比較合適趋急。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喝峦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子呜达,更是在濱河造成了極大的恐慌谣蠢,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異眉踱,居然都是意外死亡挤忙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門谈喳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來册烈,“玉大人,你說我怎么就攤上這事婿禽∩蜕” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵扭倾,是天一觀的道長次哈。 經(jīng)常有香客問我,道長吆录,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任琼牧,我火速辦了婚禮恢筝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巨坊。我一直安慰自己撬槽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布趾撵。 她就那樣靜靜地躺著侄柔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪占调。 梳的紋絲不亂的頭發(fā)上暂题,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機(jī)與錄音究珊,去河邊找鬼薪者。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剿涮,可吹牛的內(nèi)容都是我干的言津。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼取试,長吁一口氣:“原來是場噩夢啊……” “哼悬槽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞬浓,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤初婆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烟逊,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渣窜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宪躯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乔宿。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曼月,我是刑警寧澤鲁沥,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站枷恕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜计寇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脂倦。 院中可真熱鬧番宁,春花似錦、人聲如沸赖阻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽火欧。三九已至棋电,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苇侵,已是汗流浹背赶盔。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榆浓,地道東北人招刨。 一個(gè)月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像哀军,于是被迫代替她去往敵國和親沉眶。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容