时间:2021-05-26
本文实例讲述了Nodejs基于LRU算法实现的缓存处理操作。分享给大家供大家参考,具体如下:
LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的,是根据页面调入内存后的使用情况进行决策了。由于无法预测各页面将来的使用情况,只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU算法就是将最近最久未使用的页面予以淘汰。
可以用一个特殊的栈来保存当前正在使用的各个页面的页面号。当一个新的进程访问某页面时,便将该页面号压入栈顶,其他的页面号往栈底移,如果内存不够,则将栈底的页面号移除。这样,栈顶始终是最新被访问的页面的编号,而栈底则是最近最久未访问的页面的页面号。
如输入以下序列时:4,7,0,7,1,0,1,2,1,2,6
结果为:
4
4 7
4 7 0
4 0 7
4 0 7 1
4 7 1 0
4 7 0 1
4 7 0 1 2
4 7 0 2 1
4 7 0 1 2
7 0 1 2 6
适用于Node.js的一个LRU缓存,capacity为缓存容量,为0时构造一般缓存。
function CacheLRU(capacity) { this.capacity = capacity || Number.MAX_VALUE; this.data = {}; this.hash = {}; this.linkedList = { length: 0, head: null, end: null } if (capacity <= 0) this.capacity = Number.MAX_VALUE;};CacheLRU.prototype.get = function(key) { key = '_' + key; var lruEntry = this.hash[key]; if (!lruEntry) return; refresh(this.linkedList, lruEntry); return JSON.parse(this.data[key].toString());};CacheLRU.prototype.put = function(key, value) { key = '_' + key; var lruEntry = this.hash[key]; if (value === undefined) return this; if (!lruEntry) { this.hash[key] = {key: key}; this.linkedList.length += 1; lruEntry = this.hash[key]; } refresh(this.linkedList, lruEntry); this.data[key] = new Buffer(JSON.stringify(value)); if (this.linkedList.length > this.capacity) this.remove(this.linkedList.end.key.slice(1)); return this;};CacheLRU.prototype.remove = function(key) { key = '_' + key; var lruEntry = this.hash[key]; if (!lruEntry) return this; if (lruEntry === this.linkedList.head) this.linkedList.head = lruEntry.p; if (lruEntry === this.linkedList.end) this.linkedList.end = lruEntry.n; link(lruEntry.n, lruEntry.p); delete this.hash[key]; delete this.data[key]; this.linkedList.length -= 1; return this;};CacheLRU.prototype.removeAll = function() { this.data = {}; this.hash = {}; this.linkedList = { length: 0, head: null, end: null } return this;};CacheLRU.prototype.info = function() { var size = 0, data = this.linkedList.head; while (data){ size += this.data[data.key].length; data = data.p; } return { capacity: this.capacity, length: this.linkedList.length, size: size };};// 更新链表,把get或put方法操作的key提到链表head,即表示最新function refresh(linkedList, entry) { if (entry != linkedList.head) { if (!linkedList.end) { linkedList.end = entry; } else if (linkedList.end == entry) { linkedList.end = entry.n; } link(entry.n, entry.p); link(entry, linkedList.head); linkedList.head = entry; linkedList.head.n = null; }}// 对两个链表对象建立链接,形成一条链function link(nextEntry, prevEntry) { if (nextEntry != prevEntry) { if (nextEntry) nextEntry.p = prevEntry; if (prevEntry) prevEntry.n = nextEntry; }}module.exports = CacheLRU;// test:LRU算法也可以用于一些实际的应用中,如你要做一个浏览器,或类似于淘宝客户端的应用的就要用到这个原理。大家都知道浏览器在浏览网页的时候会把下载的图片临时保存在本机的一个文件夹里,下次再访问时就会,直接从本机临时文件夹里读取。但保存图片的临时文件夹是有一定容量限制的,如果你浏览的网页太多,就会一些你最不常使用的图像删除掉,只保留最近最久使用的一些图片。这时就可以用到LRU算法 了,这时上面算法里的这个特殊的栈就不是保存页面的序号了,而是每个图片的序号或大小;所以上面这个栈的元素都用Object类来表示,这样的话这个栈就可以保存的对像了。
希望本文所述对大家nodejs程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文着重介绍如何在XCODE中,通过C++开发在IOS环境下运行的缓存功能。算法基于LRU(最近最少使用)。有关lru详见:http://en.wikipedi
Android通用流行框架大全1.缓存DiskLruCacheJava实现基于LRU的磁盘缓存2.图片加载AndroidUniversalImageLoader
采用LinkedHashMap自带的LRU算法缓存数据,可检测对象是否已被虚拟机回收,并且重新计算当前缓存大小,清除缓存中无用的键值对象(即已经被虚拟机回收但未
Linux页面置换算法的C语言实现编写算法,实现页面置换算法FIFO、LRU、OPT;针对内存地址引用串,进行页面置换算法进行页面置换。其中,算法所需的各种参数
LRU缓存淘汰算法LRU是最近最少使用策略的缩写,是根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。双向