optimize cache GC by stopping early

This commit is contained in:
Hazel K 2024-08-04 09:58:01 -04:00
parent 672f1ea684
commit ba09338268
1 changed files with 8 additions and 4 deletions

View File

@ -200,7 +200,7 @@ export class RedisSingleCache<T> {
export class MemoryKVCache<T> { export class MemoryKVCache<T> {
private readonly cache = new Map<string, { date: number; value: T; }>(); private readonly cache = new Map<string, { date: number; value: T; }>();
private readonly gcIntervalHandle = setInterval(() => this.gc(), 1000 * 60 * 3); private readonly gcIntervalHandle = setInterval(() => this.gc(), 1000 * 60 * 3); // 3m
constructor( constructor(
private readonly lifetime: number, private readonly lifetime: number,
@ -289,10 +289,14 @@ export class MemoryKVCache<T> {
@bindThis @bindThis
public gc(): void { public gc(): void {
const now = Date.now(); const now = Date.now();
for (const [key, { date }] of this.cache.entries()) { for (const [key, { date }] of this.cache.entries()) {
if ((now - date) > this.lifetime) { // The map is ordered from oldest to youngest.
this.cache.delete(key); // We can stop once we find an entry that's still active, because all following entries must *also* be active.
} const age = now - date;
if (age < this.lifetime) break;
this.cache.delete(key);
} }
} }