Redis로 Cache data 다루기2

김현진·2020년 12월 14일
0

redis

목록 보기
2/2

express, redis를 이용하여 Caching 실습

1. 필요한 Package 설치

npm i express redis node-fetch
  • 추가적으로 더 설치할 package가 있으면 더 설치하면 된다.(예를들어 nodemon이라던지 등등)

  • node-fetch를 이용하여 서버에게 요청을 보낼예정

2. code 작성

전제조건

  • 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번 포트에서 실행 중`));

block 단위로 코드 해석 🤯

// 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부분은 공식문서를 참조하면 됩니다. 간단하게 설명을 하면

  • host: redis가 실행되는 host IP
  • port: redis가 실행중인 포트(디폴트: 6379)

혹시나 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번 포트에서 실행 중`));

caching 전

응답속도: 148ms

caching 후

응답속도: 19ms

profile
기록의 중요성

0개의 댓글