여행가자[사이드 프로젝트]

[redis] redis를 통한 response time 감소

j9972 2023. 10. 10. 20:34
728x90

"여행 가자" 라는 웹사이트에서 해당 지역의 코스, 장소, 먹거리를 추천해주는 로직중 지역을 선택하는 부분의 로직입니다.

 

키워드를 통해서 검색을 하는 API를 사용했는데, 검색 조합의 개수가 많다보니까 관련 데이터를 처음에 가지고 올때 6~8초 정도 걸렸는데, redis - cache를 통해서 0.1초로 줄였습니다.

 

검색에 해당하는 해당 데이터를 받아서 기존에 검색한 기록이 있는지 체크해서 있다면 cache hit로 데이터를 빠르게 가져다 주고, 없다면 axios를 통해서 데이터를 조회하였습니다

 

// REDIS
const redis = require("redis");
const client = redis.createClient(); // ({url: defualt url})
const DEFAULT_EXPIRATION = 3600; // 3600s = 1hr

client.connect();

// Router -> 지역 선택하는 과정에서 넘어오는 title을 가지고 검색

// 키워드 검색 조회
router.post("/search-keyword", async (req, res) => {
  try {
    const keyword = req.body.keyword;
    console.log(keyword);

    // check data which we want
    let cacheData = await client.get(`searchKeyword:${keyword}`);

    // cache hit
    if (cacheData) {
      console.log("cache hit");
      return res.json(JSON.parse(cacheData));
    }

    const response = await axios.get(
      "http://api.visitkorea.or.kr/openapi/service/rest/KorService/searchKeyword",
      {
        params: {
          serviceKey: process.env.RECOMMEND_COURSE_DATA_API,
          MobileOS: "ETC",
          MobileApp: "GoTrip",
          listYN: "Y",
          _type: "json",
          keyword: keyword,
          contentTypeId: 25,
        },
      },
      {
        headers: {
          "Access-Control-Allow-Origin": "*",
          "Content-Type": "application/json",
        },
      }
    );
    if (response.status === 200) {
      const courseInfo = response.data.response.body.items.item;
      res.json(courseInfo);

      client.set(
        `searchKeyword:${keyword}`,
        JSON.stringify(courseInfo),
        "EX",
        DEFAULT_EXPIRATION
      );

      console.log("cache miss");
      return res.json(courseInfo);
    }
  } catch (e) {
    console.error(e);
    res.json({ msg: e });
  }
});