본문 바로가기

카테고리 없음

Node.js에서 redis 모듈 사용 (캐싱, 세션)

redislabs 에서 등록한 cloud db에 접속하기 위해, 이전단계에서 얻어놓은 4가지 정보를 가져와 .env 파일에 환경변수로 저장해주자

 

.env 파일

 

이후엔 redis 패키지를 설치해주자

> yarn add redis

 

Redis 에 접속하는 JS 코드 생성 

 

<Local>

const express = require('express');
const dotenv = require('dotenv');
const redis = require('redis');

dotenv.config(); // env환경변수 파일 가져오기

//* Redis 연결
const redisClient = redis.createClient({ legacyMode: true }); // legacy 모드 반드시 설정 !!
redisClient.on('connect', () => {
   console.info('Redis connected!');
});
redisClient.on('error', (err) => {
   console.error('Redis Client Error', err);
});
redisClient.connect().then(); // redis v4 연결 (비동기)
const redisCli = redisClient.v4; // 기본 redisClient 객체는 콜백기반인데 v4버젼은 프로미스 기반이라 사용

 

<Cloud>

const express = require('express');
const dotenv = require('dotenv');
const redis = require('redis');

dotenv.config(); // env환경변수 파일 가져오기

//* Redis 연결
// redis[s]://[[username][:password]@][host][:port][/db-number]
const redisClient = redis.createClient({
   url: `redis://${process.env.REDIS_USERNAME}:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/0`,
   legacyMode: true, // 반드시 설정 !!
});
redisClient.on('connect', () => {
   console.info('Redis connected!');
});
redisClient.on('error', (err) => {
   console.error('Redis Client Error', err);
});
redisClient.connect().then(); // redis v4 연결 (비동기)
const redisCli = redisClient.v4; // 기본 redisClient 객체는 콜백기반인데 v4버젼은 프로미스 기반이라 사용

 

위의 코드들은 예시로 https://inpa.tistory.com/entry/REDIS-NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9Cexpress%EC%97%90%EC%84%9C-redis-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%BA%90%EC%8B%B1-%EC%84%B8%EC%85%98-%EC%8A%A4%ED%86%A0%EC%96%B4

 

[REDIS] 📚 Node.js 에서 redis 모듈 사용법 (캐싱 & 세션 스토어)

Node 프로젝트에서 pm2로 다중 클러스터 인프라를 구축했다면 세션 불일치 문제가 생기게 마련이다. 만일 서버가 종료되어 메모리가 날라가면 접속자들의 로그인이 모두 풀려버리게 된다. 따라서

inpa.tistory.com

블로그에서 가져왔다.

 

나는 express를 통해 ES6문법을 코딩을 하고 있고, cloud를 이용할것이기 때문에 약간의 수정을 거쳤다.

 

import express from 'express';
import dotenv from 'dotenv'
import redis from 'redis'

const app = express();
const PORT = 3334;
dotenv.config(); // .env 환경변수 파일 가져오기

/* redis 연결 */
const redisClient = redis.createClient({
  url: `redis://${process.env.REDIS_USERNAME}:${process.env.REDIS_PASSWORD}@${process.env.REDIS_HOST}:${process.env.REDIS_PORT}/0`,
   legacyMode: true,
});

redisClient.on('connect', () => {
  console.info('Redis 연결 성공')
});
redisClient.on('error', (err) => {
  console.error('Redis 에러', err)
});
redisClient.connect().then();  // redis v4 연결 (비동기)
const redisCli = redisClient.v4 // v4버전은 프로미스 기반이라 사용 (뭔소리?)

 

현재 3334번 포트에서 localhost로 app을 실행하는 app.js에서 수정을 해줬고

> node app.js 로 앱을 실행하면 다음과 같이 출력된다

 

 

>> Redis 명령어 정리

출처&nbsp;https://tgyun615.com/192

이중에 몇개나 사용할지 모르겠지만, 이후 내가 찾아보기 편하게 이미지를 올려놓는다

 

------ redis CRUD 구현 ------

 

>> 예시코드 <<

const redisCli = redisClient.v4 // 기본 redisClient 객체는 콜백기반인데 v4버젼은 프로미스 기반이라 사용

// GET
router.get('/', (req, res, next) => {
   await redisCli.get('username');
});

// POST
router.post('/set', (req, res, next) => {
   await redisCli.set('username', 'inpa');
});

// DELETE
router.delete('/del', (req, res, next) => {
   // exist : 키가 존재하는지
   const n = await redisCli.exists('username'); // true: 1 , false: 0
   if(n) await redisCli.del('username');
});

// PUT
router.put('/rename', (req, res, next) => {
   // username이라는 키값이 있다면 그 값을 helloname으로 바꿈
   redisCli.rename('username', 'helloname');
});

이렇게 응용할 수 있구나 정도로 알아두고 코드를 짜면서 익혀보자

 

 

 

app.get을 통해 활용하는 코드

app.get('/get', async (req, res) => {
   let value = await redisCli.get(req.key); // redis get key 를 한다.
   if (value) {
      // 만약 redis(캐시 메모리)에 데이터가 있다면 그대로 반환 → Cache Hit
      res.send(value);
   } else {
      // 만약 redis(캐시 메모리)에 데이터가 없다면 DB에서 조회 → Cache Miss
      let data = await sequelize.query('SELECT data FROM tables where id = key');
      await redisCli.set(key, data); // 그리고 그 데이터를 캐시에 저장하고 반환
      res.send(value);
   }
});

 

보다 깔끔한 코드와 파일구조를 이용하기 위해 middleware로 빼서 이용하는 코드

// 캐시 체크를 위한 미들웨어
const checkCache = (req, res, next) => {
   let value = await redisCli.get(req.key); // redis get key 를 한다.
   if (value) {
      // Redis에 저장된게 존재하면 바로 클라이언트에 응답
      res.send(data);
   } else {
      // Redis에 저장된게 없기 때문에 다음 미들웨어 실행
      next();
   }
};

app.get('/get', checkCache, async (req, res) => {
   // 만약 redis(캐시 메모리)에 데이터가 없다면 DB에서 조회 → Cache Miss
   let data = await sequelize.query(`SELECT data FROM tables where id = ${req.key}`);
   await redisCli.set(key, data); // 그리고 그 데이터를 캐시에 저장하고 반환
   res.send(value);
});

 

캐시 기간 설정하기

router.post('/set', (req, res, next) => {
   await redisCli.set('username', 'inpa');
   await redisCli.expire('username', 3600); // 3600초 후에 username 키 삭제
   
   if(redisCli.ttl('username') < 300) { 
     // usename 키 남은 시간이 300초 이하 일 경우...
   }
});
await redisCli.setex('username', 3600, 'inpa'); // setex 명령어로 키-밸류와 기간을 한번에 지정할 수도 있다.

 

 

해당 글은 Inpa Dev 블로그를 보고 공부하며 적었기에 그대로 가져온 예시코드가 많음.

 

캐싱 전략 부분은 이해는 했지만 암기하거나 응용 방법등이 아직 떠오르지 않는게 대부분이기에 링크를 남겨놓고 재차 읽도록 하자

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-%EC%BA%90%EC%8B%9CCache-%EC%84%A4%EA%B3%84-%EC%A0%84%EB%9E%B5-%EC%A7%80%EC%B9%A8-%EC%B4%9D%EC%A0%95%EB%A6%AC

 

[REDIS] 📚 캐시(Cache) 설계 전략 지침 💯 총정리

Redis - 캐시(Cache) 전략 캐싱 전략은 웹 서비스 환경에서 시스템 성능 향상을 기대할 수 있는 중요한 기술이다. 일반적으로 캐시(cache)는 메모리(RAM)를 사용하기 때문에 데이터베이스 보다 훨씬 빠

inpa.tistory.com


그 외 캐싱, 스토어 부분도 내가 보기 편한대로 정리했을 뿐 모드 내용은 이곳에서

https://inpa.tistory.com/entry/REDIS-NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9Cexpress%EC%97%90%EC%84%9C-redis-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%BA%90%EC%8B%B1-%EC%84%B8%EC%85%98-%EC%8A%A4%ED%86%A0%EC%96%B4

 

[REDIS] 📚 Node.js 에서 redis 모듈 사용법 (캐싱 & 세션 스토어)

Node 프로젝트에서 pm2로 다중 클러스터 인프라를 구축했다면 세션 불일치 문제가 생기게 마련이다. 만일 서버가 종료되어 메모리가 날라가면 접속자들의 로그인이 모두 풀려버리게 된다. 따라서

inpa.tistory.com

 

해당 내용을 실제 적용하는 삽질은 다음 포스팅에서