最簡單的一種快取演算法,設定快取上限,當達到了快取上限的時候,按照先進先出的策略進行淘汰,再增加進新的 k-v 。
使用了乙個物件作為快取,乙個陣列配合著記錄新增進物件時的順序,判斷是否到達上限,若到達上限取陣列中的第乙個元素key,對應刪除物件中的鍵值。
/**
* fifo佇列演算法實現快取
* 需要乙個物件和乙個陣列作為輔助
* 陣列記錄進入順序
*/class fifocache
this.keys =
}set(key,value)
keys.push(key)
}map[key] = value//無論存在與否都對map中的key賦值
}get(key)
}module.exports = fifocache
lru(least recently used,最近最少使用)演算法。該演算法的觀點是,最近被訪問的資料那麼它將來訪問的概率就大,快取滿的時候,優先淘汰最無人問津者。
演算法實現思路:基於乙個雙鏈表的資料結構,在沒有滿員的情況下,新來的 k-v 放在鍊錶的頭部,以後每次獲取快取中的 k-v 時就將該k-v移到最前面,快取滿的時候優先淘汰末尾的。
雙向鍊錶的特點,具有頭尾指標,每個節點都有 prev(前驅) 和 next(後繼) 指標分別指向他的前乙個和後乙個節點。
關鍵點:在雙鏈表的插入過程中要注意順序問題,一定是在保持鍊錶不斷的情況下先處理指標,最後才將原頭指標指向新插入的元素,在**的實現中請注意看我在注釋中說明的順序注意點!
class lrucache
this.size = 0
}get(key, ifreturnnode)
// 不是頭結點,鐵定要移動元素了
if (node.prev)
//把當前節點的後繼交接給當前節點的前驅去指向。
node.prev.next = node.next
}if (node.next)
node.prev = undefined //移動到最前面,所以沒了前驅
node.next = this.head //注意!!! 這裡要先把之前的排頭給接到手!!!!讓當前節點的後繼指向原排頭
if (this.head)
this.head = node //完成了交接,才能執行此步!不然就找不到之前的排頭啦!
return ifreturnnode ?
node :
node.value
}set(key, value)
node =
this.map[key] = node
if(this.head)else
this.size++//減少乙個快取槽位}}
//節點存不存在都要給他重新賦值啊
node.value = value
}}module.exports = lrucache
具體的思路就是如果所要get的節點不是頭結點(即已經是最近使用的節點了,不需要移動節點位置)要先進行平滑的斷鏈操作,處理好指標指向的關係,拿出需要移動到最前面的節點,進行鍊錶的插入操作。 缺頁中斷演算法 FIFO,LRU
在請求分頁系統中,可以通過查詢頁表中的狀態位來確定所要訪問的頁面是否存在於記憶體中。每當所要訪問的頁面不在記憶體時,會產生一次缺頁中斷,此時作業系統會根據頁表中的外存位址在外存中找到所缺的一頁,將其調入記憶體。缺頁本身是一種中斷,與一般的中斷一樣,需要經過4個處理步驟 1.保護cpu現場 2.分析中...
頁面置換演算法(FIFO LRU)
1.通過模擬實現幾種基本頁面置換的演算法,了解虛擬儲存技術的特點。2.通過置換演算法的模擬和比較,進一步了解它們的優缺點。3.鍛鍊知識的運用能力和實踐能力 編寫程式實現 先進先出頁面置換演算法 fifo 和最近最久未使用頁面置換演算法 lru 說明 1 關於頁面走向的頁位址流可利用隨機數產生乙個序列...
使用js實現前端快取
使用js實現前端快取的工具類,在支援html5的瀏覽器上優先使用html5的storage進行快取 呼叫方式為 例如儲存 sy.cookiestring key value 此處使用的第三方js庫為 jquery.cookie.js jquery.js json2.js var sy sy sy.d...