diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2023-06-10 13:45:11 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2023-06-10 13:45:11 +0900 |
| commit | e8420ad90bd290a2c10d563f6ccbffd0d4a0a97b (patch) | |
| tree | 90c09fdd6ad4f8a53acb88e0a6218215816f9d47 /packages/backend/src/misc | |
| parent | enhance(backend): WebSocketのPing/Pongをプロトコル制御フレーム... (diff) | |
| download | misskey-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.ts | 32 |
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> { |