LoginSignup
0
0

More than 3 years have passed since last update.

Typescript Node.js メソッドの結果をキャッシュする

Last updated at Posted at 2020-01-23

背景

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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0