Express에서 node-cache 모듈 사용해보기
2019-07-12 20:13:46

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, // IAM
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY // IAM
});

const awsClient = new AWS.DynamoDB();

const dynamo = new doc.DynamoDB(awsClient);

const nodeCache = require('node-cache');

const myCache = new nodeCache( { stdTTL: 0, checkperiod: 600 } ); // init

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 { // 캐시에 업으면 DB에서 불러서 캐시에 남기고 전송.
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로 줄어드는 걸 볼 수 있다.