雙向鏈表 + 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;