npm i express redis node-fetch
추가적으로 더 설치할 package가 있으면 더 설치하면 된다.(예를들어 nodemon이라던지 등등)
node-fetch를 이용하여 서버에게 요청을 보낼예정
redis-server가 실행이 되어져 있는 상태(저는 docker를 이용하여 docker 환경에서 redis가 실행중입니다.)
간단한 express에 대한 이해도
// redis-실전예제
const express = require("express");
const redis = require("redis");
const fetch = require("node-fetch");
const app = express();
const redisClient = redis.createClient({
host: "127.0.0.1",
port: "6379",
});
redisClient.on("error", (err, res) => {
console.log(err);
});
app.get("/cached", (request, response) => {
const redisKey = "comments";
return redisClient.get(redisKey, (err, res) => {
if(err) {
console.log(err);
}
if (res) {
return response.json({ type: "cached data", data: JSON.parse(res)});
} else {
fetch("https://koreanjson.com/comments")
.then(res => res.json())
.then(res => {
redisClient.setex(redisKey, 10000, JSON.stringify(res));
return response.json({ type: "no cached Data", data: res});
})
.catch(res => {
console.log(res);
});
}
});
});
app.listen(3050, () => console.log(`3050번 포트에서 실행 중`));
// redis-실전예제
const express = require("express");
const redis = require("redis");
const fetch = require("node-fetch");
const app = express();
const redisClient = redis.createClient({
host: "127.0.0.1",
port: "6379",
});
redisClient.on("error", (err, res) => {
console.log(err);
});
// redis가 오류가 발생한다면 오류출력
redis.createClient
부분은 공식문서를 참조하면 됩니다. 간단하게 설명을 하면
혹시나 password가 설정이 되어 있다면 password도 설정하면 된다.
// http://localhost:3050/cached endpoint로 get요청이 왔을때
app.get("/cached", (request, response) => {
const redisKey = "comments";
// key가 redisKey인 get 요청
return redisClient.get(redisKey, (err, res) => {
// error 처리
if(err) {
console.log(err);
}
if (res) {
// 만약 redis에 해당 키가 있을경우
// 여기서 res는 key에 해당하는 value의 값이다.
return response.json({ type: "cached data", data: JSON.parse(res)});
} else {
// redis에 해당 키가 없을경우
// 해당서버에게 요청을 보내는 로직
// redis에 값을 저장하는 로직
fetch("https://koreanjson.com/comments")
.then(res => res.json())
.then(res => {
// 만료시간까지 설정하는 로직
// 'EX' , 10초
// 값을 저장할때는 JSON.stringify 이용하여 저장
// client.set(key, value, 'EX', 60 * 60 * 24, callback);만료 24시간
redisClient.set(redisKey,JSON.stringify(res),'EX', 10);
return response.json({ type: "no cached Data", data: res});
})
.catch(res => {
console.log(res);
});
}
});
});
app.listen(3050, () => console.log(`3050번 포트에서 실행 중`));
응답속도: 148ms
응답속도: 19ms