ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [redis] redis를 통한 response time 감소
    여행가자[사이드 프로젝트] 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 });
      }
    });

    '여행가자[사이드 프로젝트]' 카테고리의 다른 글

    [node-mail] node-mail 사용 예시  (0) 2023.10.10
Designed by Tistory.