@thermopylae/lib.cache
Version:
54 lines (53 loc) • 1.77 kB
JavaScript
import { createException } from "../../error.js";
import { OrderedBucketList } from "../../data-structures/bucket-list/ordered-bucket-list.js";
const IGNORED_BUCKET_ID = -1;
class BaseLFUEvictionPolicy {
frequencies;
cacheMaxCapacity;
cacheBackendElementsCount;
deleteFromCache;
constructor(cacheMaxCapacity, cacheBackendElementsCount) {
if (cacheMaxCapacity <= 0) {
throw createException("INVALID_CACHE_MAX_CAPACITY" , `Capacity needs to be greater than 0. Given: ${cacheMaxCapacity}.`);
}
this.cacheMaxCapacity = cacheMaxCapacity;
this.cacheBackendElementsCount = cacheBackendElementsCount;
this.frequencies = new OrderedBucketList();
}
get size() {
return this.frequencies.size;
}
onHit(entry) {
const oldFrequency = OrderedBucketList.getBucketId(entry);
const newFrequency = this.computeEntryFrequency(entry, oldFrequency);
this.frequencies.move(IGNORED_BUCKET_ID, newFrequency, entry);
return 1 ;
}
onMiss() {
return undefined;
}
onSet(entry) {
if (this.cacheBackendElementsCount.size > this.cacheMaxCapacity) {
this.evict();
}
this.frequencies.add(this.initialFrequency, entry);
}
onUpdate(_entry) {
return undefined;
}
onDelete(entry) {
this.frequencies.remove(IGNORED_BUCKET_ID, entry);
}
onClear() {
this.frequencies.clear();
}
setDeleter(deleter) {
this.deleteFromCache = deleter;
}
evict() {
const currentFreqListHead = this.frequencies.head;
this.deleteFromCache(currentFreqListHead.bucket.tail);
this.onEvict(currentFreqListHead.id);
}
}
export { BaseLFUEvictionPolicy };