Merge pull request #416 from PR0M3TH3AN/perf-optimize-memory-cache-expiration-16783439769219340578

⚡ Optimize memory cache expiration strategy
This commit is contained in:
thePR0M3TH3AN authored and GitHub committed 2026-02-21 14:11:48 -05:00
commit 77c8b88ae6
1 file changed
+26 -17
+26 -17
View File
@@ -91,21 +91,26 @@ export function createMemoryCache(options = {}) {
}
}
function removeExpired(now = Date.now()) {
for (const [namespaceKey, bucket] of runtimeNamespaces.entries()) {
if (!bucket.events.length) continue;
function expireNamespace(namespaceKey, now) {
const bucket = runtimeNamespaces.get(namespaceKey);
if (!bucket || !bucket.events.length) return;
const originalLength = bucket.events.length;
bucket.events = bucket.events.filter((entry) => entry.expiresAt > now);
const removed = originalLength - bucket.events.length;
if (removed > 0) {
totalRuntimeEvents -= removed;
metrics.runtime_events_expired += removed;
}
const originalLength = bucket.events.length;
bucket.events = bucket.events.filter((entry) => entry.expiresAt > now);
const removed = originalLength - bucket.events.length;
if (removed > 0) {
totalRuntimeEvents -= removed;
metrics.runtime_events_expired += removed;
}
if (bucket.events.length === 0) {
runtimeNamespaces.delete(namespaceKey);
}
if (bucket.events.length === 0) {
runtimeNamespaces.delete(namespaceKey);
}
}
function expireAllNamespaces(now = Date.now()) {
for (const [namespaceKey] of runtimeNamespaces.entries()) {
expireNamespace(namespaceKey, now);
}
}
@@ -162,11 +167,15 @@ export function createMemoryCache(options = {}) {
},
setRuntimeEvent(scope, event, ttlMs = MINUTE_MS) {
const now = Date.now();
removeExpired(now);
const namespaceKey = getNamespaceKey(scope);
expireNamespace(namespaceKey, now);
if (totalRuntimeEvents >= maxTotalEvents) {
expireAllNamespaces(now);
}
const safeTtlMs = Number.isFinite(ttlMs) && ttlMs > 0 ? ttlMs : MINUTE_MS;
const expiresAt = now + safeTtlMs;
const namespaceKey = getNamespaceKey(scope);
const bucket = runtimeNamespaces.get(namespaceKey) ?? { events: [] };
bucket.events.push({
@@ -190,9 +199,9 @@ export function createMemoryCache(options = {}) {
},
getRecentRuntimeEvents(scope, params = {}) {
const now = Date.now();
removeExpired(now);
const namespaceKey = getNamespaceKey(scope);
expireNamespace(namespaceKey, now);
const bucket = runtimeNamespaces.get(namespaceKey);
if (!bucket) return [];