背景
APIの結果を指定した時間キャッシュさせたかったので、シンプルにキャッシュできるクラスを自前で実装する。
使用ライブラリ
- ioredis
- zlib
実装
import ioredis from 'ioredis'
import zlib from 'zlib'
class Client {
private redis: ioredis.Redis = new ioredis('redis://exammple:6379')
async fetch<T>(key: string, func: () => Promise<T>, expire): Promise<T> {
const cached = await this.redis.get(key)
// キャッシュがあれば、解凍して返却
if (cached) {
const cacheString = await new Promise<string>((resolve, reject) =>
zlib.inflate(Buffer.from(cached, 'base64'), (err, buffer) => {
if (err) return reject(err)
resolve(buffer.toString())
})
)
return JSON.parse(cacheString)
}
// キャッシュがなければ、メソッドの結果を圧縮してredisに保存
const result = await func()
const cache = await new Promise<string>((resolve, reject) =>
zlib.deflate(JSON.stringify(result), (err, buffer) => {
if (err) return reject(err)
resolve(buffer.toString('base64'))
})
)
await this.redis.setex(key, expire, cache)
return result
}
}
export const cacheClient = new Client()
使用例
await cacheClient.fetch('cache-key', () => { heavyTask() }, 3000)