[Node.js_4기] Redis, 트러블 슈팅 (24/02/28)

2024. 2. 28. 23:14공부/내배캠 TIL

목차

 

1. 학습 내용

2. 내용 정리

3. 생각 정리

 

1. 학습 내용 

 

Redis란 오픈소스, 인 메모리 데이터 저장소로, 캐시, 벡터DB, 문서DB, 스트리밍 엔진, 메시지 브로커 역할을 하는 Key-Value 저장소 입니다. Remote Dictionary Server의 약자로, 번역하자면 원격 Dictionary 서버라는 이름입니다.

Key로는 string, Value로는 다양한 타입을 지원하며

메모리 기반이기 때문에 disk기반의 RDBMS보다 빠릅니다.

또한, 레디스랩 등의 서비스를 사용해 여러 웹 서버들의 공유 메모리 역할로 레디스를 사용할 수 있다고 한다.

레디스(Redis)는 언제 어떻게 사용하는 게 좋을까 (brunch.co.kr)

더 자세한 내용은 위의 글을 확인하면 된다.

 

2. 내용 정리 

 

redis를 설치하고(윈도우에서 레디스를 설치하는건  Releases · microsoftarchive/redis (github.com) 좀 오래된 방법뿐인듯 하다. 도커를 사용해 설치하는 방법도 있으나, 지금 프로젝트에선 불필요한듯해 추후 공부할 생각이다.)

 ioredis와 cache-store-manager를 설치하고

import dotenv from 'dotenv';
import { Cache } from 'cache-store-manager';

dotenv.config();

export let redisCache;

if (process.env.NODE_ENV === 'test') {
    redisCache = {};
} else {
    redisCache = Cache.create('redis', {
        port: process.env.REDIS_PORT,
        host: process.env.REDIS_HOST,
        // username: process.env.REDIS_USERNAME,
        // password: process.env.REDIS_PASSWORD,
        db: 0,
        ttl: 60 * 1000 // milliseconds
    });
}

config를 통해 redis와 nodejs를 연결해주고(cache-store-manager를 사용해 캐시로 사용할 예정)

import { redisCache } from "../src/redis/index.js";
import { UsersRepository } from "../src/repository/users.repository.js";
import { AuthService } from "../src/service/auth.service.js";
import { dataSource } from "../src/typeorm/index.js";

const usersRepository = new UsersRepository(dataSource)
const authService = new AuthService(usersRepository, redisCache)

const jwtValidate = async (req, res, next) => {
    // try {
    // const authorization = req.headers.access;
    const { access } = req.cookies;
    if (!access) {
        throw new Error('인증 정보가 올바르지 않습니다.');
    }
    const [tokenType, tokenValue] = access.split(' ');
    if (tokenType !== 'Bearer') {
        throw new Error('인증 정보가 올바르지 않습니다.');
    }
    if (!tokenValue) {
        throw new Error('인증 정보가 올바르지 않습니다.');
    }
    console.log(tokenType, " and ", tokenValue)

    const user = await authService.verifyAccessToken(tokenValue); // return user
    console.log('jwt-validated user', user)
    res.locals.user = user;

    next();
    // } catch (err) {
    //     return res.status(400).json({
    //         success: false,
    //         message: err.message,
    //     })
    // }
}

export default jwtValidate;

이런 방식으로 accress토큰을 저장하는 캐시로 사용하면 된다.

 

3. 생각 정리 

 

추가적으로, docker-composer를 사용하여 redis-container를 만들어 사용할수도 있다.

Docker compose로 Redis 실행하기 (velog.io)

 

Docker compose로 Redis 실행하기

Docker로 쉽게 Redis를 구동시키자!

velog.io

 

<redis를 사용한 멀티서버에 대한 짤막한 메모.>

하나의 서버(컴퓨터)에서 여러 서버를 띄운다 = x 
여러개의 소프트웨어 레벨에서의 서버를 띄운다.
ip = 주소
port = 방
ip는 갖게, port만 다르게 해서 서버를 돌린다.
-> redis 서버로 port를 다르게 해서 여러개 만든다.
-> redis 를 여러 port로 run 하는 방법을 찾아라
-> docker compose, compose yaml
근데?
-> 똑같은 하드웨어 공유한다.(같은 ram) / 사실 물리 서버는 단 하나! 
-> 멀티 프로세스적인 이점이 있다.

 

docker를 사용한 redis cluster

Docker로 Redis 클러스터 구성하기 | Hwasurr's Devlog

 

Docker로 Redis 클러스터 구성하기 | Hwasurr's Devlog

로컬 환경 테스트를 위한 Dokcer cluster를 docker-compose로 구성하는 과정을 알아봅니다.

hwasurr.com