Cet article présente principalement le fonctionnement du traitement du cache de Nodejs basé sur l'algorithme LRU. Il analyse les principes et les fonctions de l'algorithme LRU et la mise en œuvre de l'algorithme LRU dans. nodejs basé sur des exemples spécifiques. Pour les compétences d'implémentation liées aux opérations de traitement du cache, les amis dans le besoin peuvent se référer à
Cet article décrit les opérations de traitement du cache implémentées par Nodejs sur la base de l'algorithme LRU. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
LRU est l'abréviation de Least Récemment utilisé, c'est-à-dire l'algorithme de remplacement de page le moins récemment utilisé, qui sert à la gestion du stockage de pages virtuelles et est chargé dans la mémoire en fonction de la page. Les décisions d'utilisation sont prises. Puisqu'il est impossible de prédire l'utilisation future de chaque page, nous ne pouvons utiliser que le « passé récent » comme approximation du « futur proche ». Par conséquent, l'algorithme LRU élimine les pages qui n'ont pas été utilisées depuis le plus longtemps.
Une pile spéciale peut être utilisée pour enregistrer le numéro de page de chaque page actuellement utilisée. Lorsqu'un nouveau processus accède à une page, le numéro de page est poussé vers le haut de la pile et les autres numéros de page sont déplacés vers le bas de la pile. S'il n'y a pas assez de mémoire, le numéro de page en bas de la pile est déplacé. supprimé. De cette façon, le haut de la pile est toujours le numéro de la page la plus récemment consultée, et le bas de la pile est le numéro de la page la plus récemment visitée.
Par exemple, en saisissant la séquence suivante : 4,7,0,7,1,0,1,2,1,2,6
Le résultat est :
4
4 7
4 7 0
4 0 7
4 0 7 1
4 7 1 0
4 7 0 1
4 7 7 1 2
4 7 1 🎜>Un cache LRU de Node.js
, la capacité est la capacité du cache, construite lorsqu'elle est à 0 Mise en cache générale.
function CacheLRU(capacity) { /* 利用Buffer写的一个LRU缓存,capacity为缓存容量,为0时不限容量。 myCache = new CacheLRU(capacity); //构造缓存 myCache.get(key); //读取名为key的缓存值 myCache.put(key, value); //写入名为key的缓存值 myCache.remove(key); //删除名为key的缓存值 myCache.removeAll(); //清空缓存 myCache.info(); //返回myCache缓存信息 LRU原理:对所有缓存数据的key构建hash链表,当对某一数据进行get或put操作时,将其key提到链表前端(最新)。当进行put数据超出容量时,删除链表尾端(最旧)的缓存数据。 hash链表操作可直接定位key,无需历遍整个hash对象,故读写极快。缓存容量不再影响读写速度。 */ 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: /*var user = new CacheLRU(5); user.put('user1', {name:'admin', age: 30}); user.put('user2', {name:'user', age: 31}); user.put('user3', {name:'guest', age: 32}); user.put('user4', {name:'guest', age: 34}); user.put('user5', {name:'guest', age: 35}); console.log(user.get('user1')); console.log(user.get('user2')); console.log(user.get('user3')); user.put('user6', {name:'guest', age: 36}); console.log(user.info());*/
est représentée, afin que la pile puisse enregistrer des objets.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!