summaryrefslogtreecommitdiff
path: root/packages/backend/src/misc
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-06-10 13:45:11 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2023-06-10 13:45:11 +0900
commite8420ad90bd290a2c10d563f6ccbffd0d4a0a97b (patch)
tree90c09fdd6ad4f8a53acb88e0a6218215816f9d47 /packages/backend/src/misc
parentenhance(backend): WebSocketのPing/Pongをプロトコル制御フレーム... (diff)
downloadmisskey-e8420ad90bd290a2c10d563f6ccbffd0d4a0a97b.tar.gz
misskey-e8420ad90bd290a2c10d563f6ccbffd0d4a0a97b.tar.bz2
misskey-e8420ad90bd290a2c10d563f6ccbffd0d4a0a97b.zip
fix(backend): キャッシュが溜まり続けないように
Related #10984
Diffstat (limited to 'packages/backend/src/misc')
-rw-r--r--packages/backend/src/misc/cache.ts32
1 files changed, 31 insertions, 1 deletions
diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts
index 5610929648..f130a7db8b 100644
--- a/packages/backend/src/misc/cache.ts
+++ b/packages/backend/src/misc/cache.ts
@@ -83,6 +83,16 @@ export class RedisKVCache<T> {
// TODO: イベント発行して他プロセスのメモリキャッシュも更新できるようにする
}
+
+ @bindThis
+ public gc() {
+ this.memoryCache.gc();
+ }
+
+ @bindThis
+ public dispose() {
+ this.memoryCache.dispose();
+ }
}
export class RedisSingleCache<T> {
@@ -174,10 +184,15 @@ export class RedisSingleCache<T> {
export class MemoryKVCache<T> {
public cache: Map<string, { date: number; value: T; }>;
private lifetime: number;
+ private gcIntervalHandle: NodeJS.Timer;
constructor(lifetime: MemoryKVCache<never>['lifetime']) {
this.cache = new Map();
this.lifetime = lifetime;
+
+ this.gcIntervalHandle = setInterval(() => {
+ this.gc();
+ }, 1000 * 60 * 3);
}
@bindThis
@@ -200,7 +215,7 @@ export class MemoryKVCache<T> {
}
@bindThis
- public delete(key: string) {
+ public delete(key: string): void {
this.cache.delete(key);
}
@@ -255,6 +270,21 @@ export class MemoryKVCache<T> {
}
return value;
}
+
+ @bindThis
+ public gc(): void {
+ const now = Date.now();
+ for (const [key, { date }] of this.cache.entries()) {
+ if ((now - date) > this.lifetime) {
+ this.cache.delete(key);
+ }
+ }
+ }
+
+ @bindThis
+ public dispose(): void {
+ clearInterval(this.gcIntervalHandle);
+ }
}
export class MemorySingleCache<T> {