점점 규격이 커지다 보니,
반복 요청 하는 구간이나, 계산이 많은 곳에서 부하가 조금씩 생겼다.
디비랑 서버에서 짱구를 아무리 굴려봐도 어쩔 수 없는 부분이 있었다.
그렇다. 이젠 캐시처리가 필요했다...
여러가지를 알아보다가, 엘라스틱캐시-레디스를 선택했다.
EC2에 레디스를 직접 배포해서 할 수도 있었지만,
증설, 로그 등 관리에 용이했기 때문이다.
elasticcache는 아마존에서 Redis로 만들면 된다. 셋팅은 생략한다.
Nodejs에 연결하려 한다.
리더 엔드포인트는 읽기만 하는 용도고, 기본 엔드 포인트로 연결을 일단 해보자.
해당 사진은 ElasticCache 대시보드에 Redis에 있다.
여러 Npm이있는데, redis를 사용했다.
사람들의 인기도나, 속도, 쓰이는 함수, 업데이트 주기도 거의 비슷해서 마음에 드는거 쓰면 되겠다.
// /model/redisConnect.js
const redis = require('redis');
require('dotenv').config();
const redisClient = redis.createClient({
host: process.env.REDIS_HOST,
port: process.env.REDIS_PORT,
});
module.exports = redisClient;
여기서 중요한건 엘라스틱 캐시 레디스는 무조건 같은 보안그룹 내에 있는 EC2에서만 연결 가능하다.
그래서 AWS에서 레디스를 생성할 때도 사용하고 싶은 EC2랑 같은 보안그룹에 넣어서 만들자.
const redisClient = require('./model/redisConnect');
const redisSet = async (key, values, expire) => {
try {
await redisClient.set(key, values, 'EX', expire);
return;
} catch (err) {
console.log('redisSet', err);
return;
}
};
module.exports = redisSet;
이런식으로 redisSet을 사용할 수 있다.
Key와 values를 넣어서 생성하고,
뒤에 'EX'와 expire는 해당 키값의 시한부선고다. 초단위다.
위에 만들어둔 함수를 이용해서 이런 식으로 넣을 수 있다.
await redisSet(
`abcd${id}`,
JSON.stringify(results),
864000,
);
abcd${id} : Json.stringfy(results)
864000초 동안 유지하겠단거다.
그래서 다음에 부를땐
await redisClient.get(`abcd${id}`, async (err, value) => {
try {
if (value === null) {
next();
} else {
console.log('foodSearch Cached');
return res.status(200).send(JSON.parse(value));
}
} catch (err) {
console.log('cache', err);
next();
}
});
이렇게 미들웨어로 만들어서 쓸 수 있다.
get으로 키값을 불러왔는데, 없으면 다음으로 넘겨서 DB작동을 하게 하고,
작동한 결과값을 JSON.stringfy로 묶어서 저장하면 된다.
해당 키값이 레디스 내에 있다면 JSON으로 보냈으니 parse해서 쓰면 된다.
모든 명령어는 여기 있다.
캐시 설계를 할 때 중요한 점은,
정보가 업데이트된 경우, 캐시도 업데이트 된다는 점이다.
그래서 프로덕트 내에 여러 정보가 유기적으로 연결되어 있다면
캐시처리도 프로덕트 상황에 맞게 잘해줘야한다...
굉장히 고통받고 있다...
'Back > Node.js' 카테고리의 다른 글
[Node.js] Express-typescript 전환 (0) | 2022.05.27 |
---|---|
[Node.js] FCM Notification 알람 자동화 작업 (0) | 2022.05.01 |
[Node.Js, ReactNative] FCM Notification firebase-admin 전체 유저에게 푸쉬알람 보내기 (0) | 2022.02.11 |
[Node.js] Apple Login Passport 애플 로그인 (0) | 2021.12.14 |
[NestJs] Prisma2 셋팅 (0) | 2021.11.23 |