如何設計一個內存緩存庫

雙向鏈表 + LRU淘汰算法 + 線程安全

雙向鏈表的設計

用OC來設計雙向鏈表(不是循環鏈表)

單個節點


image.png

整個鏈表


image.png
備注:
  • ->是啥:如果我們手動開辟一個結構體,再給他的元素設置值,需要加上這個,舉個栗子:
//使用系統的方法創建結構體,直接用'.'就可以
CGPoint p = CGPointMake(42,42);
NSLog(@"%f", p.x);
//手動創建一個結構體,獲取他的元素需要用'->'
CGPoint *p = malloc(1*sizeof(CGPoint));
p->x = 2.0;
NSLog(@"%f", p->x);
free(p);

退一萬步說,結構體p是一個不完整的地址,里面的x、y就是地址偏移量,p->x其實拿到的是偏移量的地址,也就是指向x的指針

LRU

1.算法思想

Least Recently Used 近期最少使用算法, 常應用于緩存中的數據淘汰, 其核心思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高“。

2.插入數據
  • 新數據在鏈表中存在(一般稱為命中),則把該節點移到鏈表頭部
  • 新數據在鏈表中不存在,則新建一個節點,放到鏈表頭部
  • 若緩存滿了,則把鏈表最后一個節點刪除
3.讀取數據
  • 數據在鏈表中存在,則把該節點移到鏈表頭部
  • 數據在鏈表中不存在,返回-1

附錄:

  • Core Foundation對象,簡稱CF,可不是穿越火線哦,這個嘛,需要自己創建,自己釋放,比如CFMutableDictionaryRef,創建方法是CFDictionaryCreateMutable,釋放方法是CFRelease
  • CF和OC對象轉化
    OC->CF:加__bridge,舉例如下:
id p;
void * key;
key = (__bridge const void *)p

CF->OC:加__bridge_transfer,舉例如下:

id obj = (__bridge_transfer id)p;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容