Redis를 사용하여 Node.js에서 캐싱 구현

캐싱은 API가 반복적인 요청에 더 빠르게 응답하도록 할 수 있는 간단한 메커니즘입니다.

문제를 설명하겠습니다.
특정 사이트에서 일부 데이터를 스크랩하고 해당 데이터에 대해 무거운 계산을 수행하는 간단한 API가 있습니다.
API 응답이 느리고 사용자에게 좋지 않습니다.
우리는 이 특정 요청이 여러 번 수신될 수 있으며 스크랩한 사이트의 정보가 매시간 업데이트된다는 것을 알고 있습니다.

우리의 솔루션:
캐싱!
다음 시간 동안 첫 번째 응답을 캐시하고 느린 계산을 반복해서 수행하지 않아도 됩니다.
Redis는 이러한 종류의 작업에 완벽한 메모리 데이터 저장소에서 매우 빠릅니다.

구현:
컴퓨터에 Redis가 설치되어 있다고 가정하겠습니다. 그렇지 않은 경우 Redis 문서는 매우 쉽고 이해하기 쉽습니다.
우선 익스프레스로 앱을 시작하겠습니다.

//index.js
const express = require("express");

const app = express();

app.get("/heavy-task",(req, res) => {
  const { searchTerm } = req.query;

  const result = heavyTask(searchTerm);

  res.status(200).json({ result });
});

app.listen(PORT, () => {
  console.log("Server is listening on port " + PORT);
});


이제 Redis 클라이언트를 설치하여 앱에서 Redis를 사용하겠습니다. ioredis를 사용하겠습니다.cache.js라는 다른 파일에서 클라이언트를 시작합니다.

//cache.js

const Redis = require("ioredis");

const redisClient = new Redis();

redisClient.on("connect", () => {
  console.log("Redis connected");
});

redisClient.on("error", (err) => {
  console.log("Redis error", err);
})


module.exports = redisClient;


핸들러에서 사용하기 위해 redisClientindex.js로 가져오겠습니다.
우리는 SETEX 데이터 저장소에 대한 키, 데이터가 저장소에 있을 시간(초)을 나타내는 숫자, 마지막으로 저장된 데이터를 JSON으로 받아들이는 메서드를 사용할 것입니다.

//index.js
const express = require("express");
const redisClient = require("./cache.js");

const app = express();

app.get("/heavy-task",(req, res) => {
  const { searchTerm } = req.query;

  const result = heavyTask(searchTerm);

  const resultJSON =  JSON.stringify(result);

  redisClient.setex(searchTerm, 3600, resultJSON);

  res.status(200).json({ result });
});

app.listen(PORT, () => {
  console.log("Server is listening on port " + PORT);
});


엄청난! 이제 데이터는 다음 시간 동안 Redis에 저장됩니다.
이제 요청이 수신될 때마다 실행되는 checkCache 미들웨어를 생성하고 Redis에 searchTerm (키)가 존재하는지 묻고 그렇다면 데이터를 반환합니다. 그렇지 않으면 next() .

//middleware/checkCache.js
const redisClient = require("../cache.js");

const checkCache = (req, res, next) => {
  const { searchTerm } = req.query;
  redisClient.get(searchTerm, (err, result) => {
    if (err) {
      console.error(err);
    }
    if (result) {
      const cachedRes = JSON.parse(result);
      return res.status(200).json({cachedRes});
    } else {
      next();
    }
  });
};

module.exports = checkCache;


핸들러에서 미들웨어를 구현합니다.

//index.js
const express = require("express");
const redisClient = require("./cache.js");
const checkCache = require("./middleware/checkCache.js");

const app = express();

app.get("/heavy-task",checkCache,(req, res) => {
  const { searchTerm } = req.query;

  const result = heavyTask(searchTerm);

  const resultJSON =  JSON.stringify(result);

  redisClient.setex(searchTerm, 3600, resultJSON);

  res.status(200).json({ result });
});

app.listen(PORT, () => {
  console.log("Server is listening on port " + PORT);
});


그게 다야! 이제 우리의 요청은 Redis로 쉽게 캐시됩니다.
이 간단한 가이드가 도움이 되었기를 바랍니다 😄

좋은 웹페이지 즐겨찾기