63 lines
1.2 KiB
JavaScript
63 lines
1.2 KiB
JavaScript
import { logger } from './logger.js'
|
|
|
|
class SimpleCache {
|
|
constructor(ttl = 30000) { // 30秒TTL
|
|
this.cache = new Map()
|
|
this.ttl = ttl
|
|
}
|
|
|
|
generateKey(...parts) {
|
|
return parts.filter(Boolean).join(':')
|
|
}
|
|
|
|
get(key) {
|
|
const item = this.cache.get(key)
|
|
if (!item) return null
|
|
|
|
if (Date.now() - item.timestamp > this.ttl) {
|
|
this.cache.delete(key)
|
|
return null
|
|
}
|
|
|
|
logger.log(`Cache hit: ${key}`)
|
|
return item.data
|
|
}
|
|
|
|
set(key, data) {
|
|
this.cache.set(key, {
|
|
data,
|
|
timestamp: Date.now()
|
|
})
|
|
logger.log(`Cache set: ${key}`)
|
|
}
|
|
|
|
clear() {
|
|
this.cache.clear()
|
|
logger.log('Cache cleared')
|
|
}
|
|
|
|
invalidatePattern(pattern) {
|
|
let deletedCount = 0
|
|
for (const key of this.cache.keys()) {
|
|
if (key.includes(pattern)) {
|
|
this.cache.delete(key)
|
|
deletedCount++
|
|
}
|
|
}
|
|
logger.log(`Cache invalidated: ${pattern} (${deletedCount} items)`)
|
|
}
|
|
|
|
getStats() {
|
|
return {
|
|
size: this.cache.size,
|
|
keys: Array.from(this.cache.keys())
|
|
}
|
|
}
|
|
}
|
|
|
|
export const dataCache = new SimpleCache()
|
|
|
|
// デバッグ用:開発環境でのみグローバルからアクセス可能にする
|
|
if (import.meta.env.DEV) {
|
|
window.dataCache = dataCache
|
|
} |