背景
APIの結果を指定した時間キャッシュさせたかったので、シンプルにキャッシュできるクラスを自前で実装する。
使用ライブラリ
- ioredis
- zlib
実装
importioredisfrom'ioredis'importzlibfrom'zlib'classClient{privateredis:ioredis.Redis=newioredis('redis://exammple:6379')asyncfetch<T>(key:string,func:()=>Promise<T>,expire):Promise<T>{constcached=awaitthis.redis.get(key)// キャッシュがあれば、解凍して返却if(cached){constcacheString=awaitnewPromise<string>((resolve,reject)=>zlib.inflate(Buffer.from(cached,'base64'),(err,buffer)=>{if(err)returnreject(err)resolve(buffer.toString())}))returnJSON.parse(cacheString)}// キャッシュがなければ、メソッドの結果を圧縮してredisに保存constresult=awaitfunc()constcache=awaitnewPromise<string>((resolve,reject)=>zlib.deflate(JSON.stringify(result),(err,buffer)=>{if(err)returnreject(err)resolve(buffer.toString('base64'))}))awaitthis.redis.setex(key,expire,cache)returnresult}}exportconstcacheClient=newClient()
使用例
awaitcacheClient.fetch('cache-key',()=>{heavyTask()},3000)