YYCache 源碼流程

存儲技術

  • 基于文件讀寫
  • 基于 mmap 文件內存映射
  • 基于數(shù)據(jù)庫

基于文件系統(tǒng)

SDWebImage 等緩存:一個 Value 對應一個文件贮缕。
不方便擴展久妆、沒有元數(shù)據(jù)、難以實現(xiàn)較好的淘汰算法跷睦、數(shù)據(jù)統(tǒng)計緩慢。

Memory Map-mmap

缺點:
熱數(shù)據(jù)的文件不要超過物理內存大小肋演,不然 mmap 會導致內存交換嚴重降低性能抑诸。
內存中的數(shù)據(jù)是定時 flush 到文件的烂琴,如果數(shù)據(jù)還未同步時程序掛掉,就會導致數(shù)據(jù)錯誤蜕乡。

優(yōu)點:

普通讀取文件奸绷。

disk -> 緩存 -> 內存中

普通寫文件

內存操作 -> 緩存 ->disk

mmap 內存操作 -> disk

mmap

比如文件大小為50k。會在內存中申請>50 具體是4k的整數(shù)倍层玲。所以此處可以是52k的內存号醉。

然后你就在0-50k的區(qū)域內進行讀寫,過一段時間辛块,會把內存中的數(shù)據(jù)同步到disk中畔派。

因為是相當于對內存的讀寫,所以讀寫速度很快润绵。

Link

認真分析mmap:是什么 為什么 怎么用

從內核文件系統(tǒng)看文件讀寫過程

數(shù)據(jù)庫

SQLite

  • 寫入:數(shù)據(jù)庫大于直接寫入文件线椰。
  • 讀取:
    • 大于20k尘盼,文件讀取更快憨愉。
    • 小于20k,數(shù)據(jù)庫的讀取快

鎖的使用

OSSpinLock卿捎,自旋鎖配紫,適合內存緩存的存取
dispatch_semaphore午阵,等待時不會消耗 CPU 資源躺孝,適合磁盤緩存


Link

源碼分析

YYMemoryCache

_YYLinkedMapNode

_YYLinkedMapNode *_prev; 
_YYLinkedMapNode *_next; 
id _key;
id _value;
NSUInteger _cost; // The cost with which to associate the key-value pair.
NSTimeInterval _time; // 插入的時間,到時候可以依據(jù)這個清除超時對象

雙向鏈表中的一個節(jié)點趟庄。

_YYLinkedMap

CFMutableDictionaryRef _dic; // do not set object directly
NSUInteger _totalCost;
NSUInteger _totalCount;
_YYLinkedMapNode *_head; // MRU, do not change it directly
_YYLinkedMapNode *_tail; // LRU, do not change it directly

手動維持一個支持LRU (least-recently-used)的哈希表括细。

YYMemoryCache

   pthread_mutex_t _lock; 
    _YYLinkedMap *_lru;
    dispatch_queue_t _queue; // 用于釋放對象

特點:

  • 訪問key,也會計算在LRU里面

  • 添加key-value戚啥,先添加node奋单,再修剪cost,count

  • 進入background猫十,內存警告览濒。你都可以自定義操作。

  • 修剪:每5s做一次裁剪拖云。 清除超過限定的對象贷笛。

    • 依據(jù):cost,count宙项,age(子線程中完成)
  • Nothing

總結:

YYMemoryCache是一個包裝了字典的乏苦,雙向鏈表的對象。

支持LRU。

依據(jù)cost, count , age來裁剪超載對象汇荐。(因為LRU的關系洞就,都從尾部開始裁)

支持內存警告,進入后臺時的自定義操作掀淘。

YYKVStorage

數(shù)據(jù)庫名詞解釋:

blob // (binary large object) 二進制大對象旬蟋。可以是一張圖片或一個聲音文件革娄。

File:
 /path/
      /manifest.sqlite
      /manifest.sqlite-shm
      /manifest.sqlite-wal
      /data/
           /e10adc3949ba59abbe56e057f20f883e
           /e10adc3949ba59abbe56e057f20f883e
      /trash/
            /unused_file_or_folder

 SQL:
 create table if not exists manifest (
    key                 text, // 傳值獲取
    filename            text, // 傳值獲取
    size                integer, // 計算文件獲取
    inline_data         blob, // 如果文件名length=0倾贰,此處插入文件。
    奇怪的設定拦惋。相當于把本來存在數(shù)據(jù)庫外的文件匆浙,存在了數(shù)據(jù)庫里面。
    
    modification_time   integer, // 最后修改時間
    last_access_time    integer,    // 最后訪問時間
    extended_data       blob, // 傳值獲取
    primary key(key)
 ); 
 create index if not exists last_access_time_idx on manifest(last_access_time);
image.png

YYDiskCache

YYKVStorage *_kv;
dispatch_semaphore_t _lock;
dispatch_queue_t _queue;            // 并發(fā)queue
_freeDiskSpaceLimit         // 占用空間極限 0就是沒有限制
_countLimit | _costLimit | _ageLimit
TrimInterval = 60                   // 修剪上面limit的intv
image.png

YYCache

存儲

  • 先存內存

    • YYMemoryCache 進行存儲
  • 再存disk

    • YYDiskCache save kv

      • 序列化對象
      • 依據(jù)value大屑芗伞(默認20k)吞彤,選擇存儲方式
      • YYKVStorage save kv

獲取

  • 從YYMemoryCache中獲取

  • 如果內存沒有,從本地獲取叹放。

    • 從kv獲取
    • 反序列化(可能需要拼裝上extData)
    • 返回對象(同時緩存到YYMemoryCache饰恕,方便下次獲取)

細節(jié)

setObject的 obj 都遵循NSCoding協(xié)議

修剪:Disk定期修剪是60s井仰,Memory是5s埋嵌。

疑惑

mmap 熱數(shù)據(jù)的文件不要超過物理內存大小,不然 mmap 會導致內存交換嚴重降低性能啥意思俱恶?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末雹嗦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子合是,更是在濱河造成了極大的恐慌了罪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聪全,死亡現(xiàn)場離奇詭異泊藕,居然都是意外死亡,警方通過查閱死者的電腦和手機难礼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門娃圆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛾茉,你說我怎么就攤上這事暇赤±屎停” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵展融,是天一觀的道長歉糜。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任散劫,我火速辦了婚禮,結果婚禮上幕帆,老公的妹妹穿的比我還像新娘。我一直安慰自己赖条,他們只是感情好失乾,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纬乍,像睡著了一般碱茁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仿贬,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天纽竣,我揣著相機與錄音,去河邊找鬼茧泪。 笑死蜓氨,一個胖子當著我的面吹牛,可吹牛的內容都是我干的队伟。 我是一名探鬼主播穴吹,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗜侮!你這毒婦竟也來了港令?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤锈颗,失蹤者是張志新(化名)和其女友劉穎顷霹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體击吱,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡淋淀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姨拥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绅喉。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叫乌,靈堂內的尸體忽然破棺而出柴罐,到底是詐尸還是另有隱情,我是刑警寧澤憨奸,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布革屠,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏似芝。R本人自食惡果不足惜那婉,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望党瓮。 院中可真熱鬧详炬,春花似錦、人聲如沸寞奸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枪萄。三九已至隐岛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瓷翻,已是汗流浹背聚凹。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留齐帚,地道東北人妒牙。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像童谒,于是被迫代替她去往敵國和親单旁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353