摘要:在上圖中,一旦充滿所分配的內(nèi)存塊,那么最新出現(xiàn)的將替代最低使用的,訪問順序?yàn)?。滿額時(shí),從鏈表尾部開始往前刪除指定數(shù)目的數(shù)據(jù),即可解決。
LRU
Discards the least recently used items first. This algorithm requires keeping track of what was used when, which is expensive if one wants to make sure the algorithm always discards the least recently used item. General implementations of this technique require keeping "age bits" for cache-lines and track the "Least Recently Used" cache-line based on age-bits. In such an implementation, every time a cache-line is used, the age of all other cache-lines changes.
在上圖中,一旦 A B C D 充滿所分配的內(nèi)存塊,那么最新出現(xiàn)的 E 將替代最低使用的 A(0),訪問順序?yàn)?A -> B -> C -> D -> E -> D -> F。
原理這里將會出現(xiàn)一個(gè)性能瓶頸,也就是在 Cache 滿時(shí),淘汰那些不常用的數(shù)據(jù),空出空間存儲新的數(shù)據(jù)。假設(shè)每一條數(shù)據(jù)都有一個(gè)最后訪問時(shí)間, 當(dāng)滿額的時(shí)候,將要遍歷所有元素,才能刪除訪問時(shí)間最小的那個(gè)元素,時(shí)間復(fù)雜度為 $O(1)$,數(shù)據(jù)量越大,性能越低。
所以選擇使用 鏈表,每訪問一次數(shù)據(jù),把最新的訪問數(shù)據(jù)放至頭部,那尾部的數(shù)據(jù)就是最舊未訪問的數(shù)據(jù)。 滿額時(shí),從鏈表尾部開始往前刪除指定數(shù)目的數(shù)據(jù),即可解決。
代碼實(shí)現(xiàn)class LruCache { constructor(maxsize) { this._cache = {}; // 緩存 this._queue = []; // 隊(duì)列 this._maxsize = maxsize; // 最大值 // 如果最大值輸入非法 默認(rèn)無限大 if (!this._maxsize || !(typeof this._maxsize === "number") || this._maxsize <= 0) { this._maxsize = Infinity; } // 運(yùn)行定時(shí)器,定時(shí)檢查過期值 setInterval(() => { this._queue.forEach((el, idx) => { const key = el; const insertTime = this._cache[key].insertTime; const expire = this._cache[key].expire; const curTime = +new Date(); // 如果存在過期時(shí)間且超期,移除數(shù)據(jù) if (expire && curTime - insertTime > expire) { this._queue.splice(idx--, 1); delete this._cache[key]; } }); }, 1000); } // 生成唯一索引 _makeSymbol(key) { return Symbol.for(key); } // 更新隊(duì)列 _update(queue, key) { // 移除 queue.forEach((el, idx) => { if (el === key) { queue.splice(idx, 1); } }); // 前置 queue.unshift(key); return queue; } // 插入數(shù)據(jù) set(key, value, expire) { key = this._makeSymbol(key); // 生成唯一索引 // 如果已經(jīng)存在該值,則重新賦值 if (this._cache[key]) { this._cache[key] = { value, expire, insertTime: this._cache[key].insertTime } this._queue = this._update(this._queue, key); // 更新隊(duì)列 } else { // 如果不存在,則插入 this._cache[key] = { value, expire, insertTime: +new Date() } // 索引置前 this._queue.unshift(key); // 超出最大值,截?cái)? while (this._queue.length > this._maxsize) { const item = this._queue.pop(); // 尾截?cái)? delete this._cache[item]; // 刪除 } } } // 獲取數(shù)據(jù) get(key) { key = this._makeSymbol(key); // 如果存在該值 if (this._cache[key]) { const insertTime = this._cache[key].insertTime; // 插入時(shí)間 const expire = this._cache[key].expire; // 過期時(shí)間 const curTime = +new Date(); // 當(dāng)前時(shí)間 // 如果不存在過期時(shí)間 或 存在過期時(shí)間但尚未過期 if (!expire || (expire && curTime - insertTime < expire)) { // 更新隊(duì)列,前置索引 this._queue = this._update(this._queue, key); return this._cache[key].value; } else if (expire && curTime - insertTime > expire) { // 已經(jīng)過期 this._queue.forEach((el, idx) => { if (el === key) { this._queue.slice(idx, 1); delete this._cache[key]; } }) return null } } else { return null; } } }
同步至我的個(gè)人博客:https://blog.trevor.top/item/34
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/94639.html
摘要:如果處理不得當(dāng),就會造成緩存污染問題。解決緩存污染的算法算法,英文名,字面意思就是最不經(jīng)常使用的淘汰掉算法,是通過數(shù)據(jù)被訪問的頻率來判斷一個(gè)數(shù)據(jù)的熱點(diǎn)情況。分析降低了緩存污染帶來的問題,命中率比要高。 微信公眾號:IT一刻鐘大型現(xiàn)實(shí)非嚴(yán)肅主義現(xiàn)場一刻鐘與你分享優(yōu)質(zhì)技術(shù)架構(gòu)與見聞,做一個(gè)有劇情的程序員關(guān)注可第一時(shí)間了解更多精彩內(nèi)容,定期有福利相送喲。 showImg(https://s...
摘要:但是內(nèi)存空間畢竟有限,隨著我們存儲數(shù)據(jù)的不斷增長,要緩存的數(shù)據(jù)量越來越大,當(dāng)超過了我們的內(nèi)存大小時(shí),該怎么辦呢解決方法有兩種增加物理內(nèi)存搭建集群和緩存數(shù)據(jù)的淘汰機(jī)制。增加物理內(nèi)存簡單粗暴,價(jià)格十分昂貴,內(nèi)存的價(jià)格大約是萬元左右。redis 使用的時(shí)內(nèi)存空間來存儲數(shù)據(jù)的,避免業(yè)務(wù)應(yīng)用從后端數(shù)據(jù)庫中讀取數(shù)據(jù),可以提升應(yīng)用的響應(yīng)速度。但是內(nèi)存空間畢竟有限,隨著我們存儲數(shù)據(jù)的不斷增長,要緩存的數(shù)據(jù)量...
摘要:哈希的結(jié)果應(yīng)能夠保證原有已分配的內(nèi)容可以被映射到新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區(qū)。平衡性平衡性是指哈希的結(jié)果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。 memcached分布式原理與實(shí)現(xiàn) 標(biāo)簽(空格分隔): nosql 0x01 概況 1.1 什么是memcached memcached是一個(gè)分布式,開源的數(shù)據(jù)存儲引擎。memcach...
閱讀 2645·2021-10-12 10:12
閱讀 790·2019-08-29 17:25
閱讀 2793·2019-08-29 17:24
閱讀 3226·2019-08-29 17:19
閱讀 1806·2019-08-29 15:39
閱讀 3053·2019-08-26 16:50
閱讀 1997·2019-08-26 12:17
閱讀 2703·2019-08-26 12:16