이 당신만큼 효율적이지 않다 있습니다 원하지만 단순성과 가독성 측면에서 그 이점을 보완합니다. 그리고 많은 경우에 그것은 충분히 빠를 것입니다.
적은 수의 비싼 작업 (1 초)을 위해 간단한 LRU 캐시가 필요했습니다. 외부에 뭔가를 소개하는 것보다는 복사하는 것이 더 좋았지 만 찾을 수 없었기 때문에 나는 그것을 썼다 :
업데이트 : 이제는 공간과 시간면에서 훨씬 효율적입니다. Map은 삽입 순서를 유지하므로 배열을 제거했습니다.
class LRU {
constructor(max=10) {
this.max = max;
this.cache = new Map();
}
get(key) {
let item = this.cache.get(key);
if (item) // refresh key
{
this.cache.delete(key);
this.cache.set(key, item);
}
return item;
}
set(key, val) {
if (this.cache.has(key)) // refresh key
this.cache.delete(key);
else if (this.cache.size == this.max) // evict oldest
this.cache.delete(this._first());
this.cache.set(key, val);
}
_first(){
return this.cache.keys().next().value;
}
}
는 사용법 :
> let cache = new LRU(3)
> [1, 2, 3, 4, 5].forEach(v => cache.set(v, 'v:'+v))
> cache.get(2)
undefined
> cache.get(3)
"v:3"
> cache.set(6, 6)
> cache.get(4)
undefined
> cache.get(3)
"v:3"
덕분에, 나는 걸쳐 실행했다. 내 응용 프로그램에 너무 많은 종소리와 호루라기가있는 것 같았습니다. (내 생각에 거대한 붉은 깃발 인 ASP.NET은 말할 것도없고) 어쩌면 다른 모양을 주어야합니다. –
+1 구현은 ASP.NET과 아무런 관련이 없습니다. 나는 그럴 가치가 있다고 생각합니다. –