Express에서 node-cache 모듈 사용해보기
2019-07-12 20:13:46
# Node.js
# Express
DB의 데이터 중 읽기로 자주 사용하지만 변경은 자주 일어나지 않고 쓰기는 적은 데이터는
메모리에 캐시로 남겨서 사용하면 속도 면에서 좋아진다.
다만 메모리 성능에 맞게 양을 조절해야 할 것이다.
테스트는 AWS 내의 elasticbeanstalk, dynamodb로 진행.
express 자체에 기능이 업기 때문에 node-cache 라는 모듈을 사용 햇다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 const express = require ('express' );const app = express();const PORT = process.env.PORT || 3000 ;const AWS = require ('aws-sdk' );const doc = require ('dynamodb-doc' );AWS.config.update({ region: 'ap-northeast-2' , accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY }); const awsClient = new AWS.DynamoDB();const dynamo = new doc.DynamoDB(awsClient);const nodeCache = require ('node-cache' );const myCache = new nodeCache( { stdTTL : 0 , checkperiod : 600 } ); app.get('/' , (req, res ) => { res.send('d=(´▽`)=b' ); }); app.post('/data' , (req, res ) => { myCache.get('character' , (err, value ) => { if (err) { throw err; } else { if (value) { res.json(JSON .parse(value)); } else { const params = { TableName: 'character_list' }; dynamo.scan(params, (err, datas ) => { if (err) { throw err; } else { myCache.set('character' , JSON .stringify(datas.Items), (err ) => { if (err) { throw err; } else { res.json(datas.Items); } }) } }); } } }); }); app.get('/clear' , (req, res ) => { myCache.keys((err, mykeys ) => { if (err) { throw err; } else { if (mykeys.length > 0 ) { myCache.del(mykeys, (err ) => { if (err) { throw err; } else { res.send('success' ); } }); } else { res.send('no cache' ); } } }); }); app.listen(PORT, () => { console .log(`server listening on port ${PORT} ` ); });
stdTTL는 캐시 적용 시간, 초 단위로 되어잇고 0을 넣으면 무제한
checkperiod는 초 단위고 해당 초 마다 체크하여 캐시를 삭제한다는 의미. 기본값은 600
최초 호출 시에는 캐시에 안 남아있기 떄문에 dynamodb에서 데이터를 가지고 온다.
대충 2자리 ms 단위로 가지고 온다.
이제 다음 호출 시에는 캐시에서 불러오므로 한 자리대 ms로 줄어드는 걸 볼 수 있다.