라벨이 redis인 게시물 표시

Docker-Compose yaml파일을 이용하여 Redis를 Local로 구축하기

이미지
  사전에 Docker및 Docker-Compose가 설치되어 있어야 합니다. mysql official docker image link : https://hub.docker.com/_/redis docker-compose로 컨테이너를 만들기전 .yaml파일을 작성합니다. # 참고 링크 : https://hub.docker.com/_/redis services : redis : # 컨테이너의 베이스가 될 이미지를 받는다(현재 docker-compose.yaml은 mysql 8.2.0버전을 사용한다.) image : redis:7.2.3 volumes : # redis의 데이터의 초기화를 방지하기 위해 볼륨으로 저장한다. - redis_data:/data #- ${REDIS_DEFAULT_CONFIG_FILE}:/usr/local/etc/redis/redis.conf # redis의 config파일. {REDIS_DEFAULT_CONFIG_FILE}에서 직접 수정 가능 # command: redis-server /usr/local/etc/redis/redis.conf # redis.conf파일을 사용시 명령을 내린다. env_file : # yaml의 상대경로로 환경변수 파일을 찾는다. - .redis.env # 아래처럼 직접 비밀번호를 입력할수 있지만 추천하지 않음 #environment: # - REDIS_PASSWORD=safePassword! command : - /bin/sh - -c # - Double dollars, so that the variable is not expanded by Docker Compose # - Surround by quotes, so that the she...

NestJS Redis를 이용하여 캐시(Cache) 관리 mset, mget

이미지
 이전 글에서는 하나의 키와 값을 저장하거나 하나만 조회를 했습니다. 이번에는 여러개의 키값을 이용하여 값을 저장하거나 조회하는 비즈니스 로직을 작성하도록 하겠습니다. 아래 링크를 참고하시면 NestJS와 Redis를 연결하고 사용하는 방법에 대해서 알수 있습니다. NestJS Redis 연결 NestJS Redis를 이용하여 캐시(Cache) 관리 redis가 Local에 설치되지 않을시 해당 'docker-compose.yaml'을 사용하여 redis컨테이너를 생성하면 됩니다.  // 여러개의 keys값과 values를 저장하기 위한 서비스 async saveDataMany ( key : string [], value : any []) { try { const setKeysValues : any [] = []; if ( key . length === value . length ) { // mset을 하기 위해서 [key, value] for ( let i = 0 ; i < key . length ; i ++) { setKeysValues . push ( key [ i ]); setKeysValues . push ( value [ i ]); } } else { throw new ConflictException ( 'key와 value갯수가 일치하지 않음' ); } console . log ( 'setKeysValues : ' , setKeysValues ); // ttl이 설정되지 않는다면 기본 5초간 유지되고 사라진다. 0은 무제한 const result = await this . cacheManager . store . mset (... setKeysValues , { t...

docker-compose NodeJS(NestJS) 적용하기 -3

이미지
 이번에는 기존의 docker-compose를 이용하여 server에 redis를 연결하도록 하겠습니다. 이전글에서는 postgres을 이용하여 연결했습니다. 아래글을 참고해 주시기 바랍니다. 이전글 : docker-compose NodeJS(NestJS) 적용하기 - 2 진행하기 전에 Docker와 Docker-Compose가 설치되 있어야 하고 OS는 Ubuntu(Linux)를 사용합니다.  docker install by terminal : ubuntu 20.04 docker-compose Ubuntu Install 먼저 해당 프로젝트에 redis를 yarn으로 설치해 줍니다. $ yarn add cache-manager@^4.1.0 cache-manager-redis-store@^2.0.0 redis@^4.3.0 copy $ yarn add -D @types/cache-manager@^4.0.2 @types/cache-manager-redis-store@^2.0.1 copy 해당 redis 설치는 아래 링크를 참고해 주시기 바랍니다. 링크1 : NestJS Redis를 이용하여 캐시(Cache) 관리 파일에 변경사항이 있으니 참고해 주시기 바랍니다. --build를 추가하여 변경된 코드를 반영합니다. $ docker-compose up --build -d copy 해당 gitHub(branch : docker-compose_NodeJS_NestJS_적용하기-1 -> docker-compose_NodeJS_NestJS_적용하기-3)

NestJS Redis Pub/Sub과 Cluster로 SocketIO 채팅 앱 만들기 -2

 이제 본격적으로 Cluster를 이용한 채팅앱 서버를 만들도록 하겠습니다. 처음 이글을 보시는 분들은 이전글을 참고해 주시기 바랍니다. 링크 : NestJS Redis Pub/Sub과 Cluster로 SocketIO 채팅 앱 만들기 -1 제 컴퓨터는 12개의 코어를 갖고 있기 때문에 12개의 Workers를 만듭니다. 먼저 src경로에 'app-cluster.service.ts'를 만들어 줍니다. // src/app-cluster.service.ts import { Injectable } from '@nestjs/common' ; import * as os from 'os' ; const cluster = require ( 'cluster' ); // nodejs의 cluster를 사용 const numCPUs = os . cpus (). length ; // 현재 os의 cpu갯수 확인 @ Injectable () export class AppClusterService { static clusterize ( callback : Function ): void { console . log ( '총 cpu갯수 : ' , numCPUs ); if ( cluster . isMaster ) { console . log ( `Master server started on ${ process . pid } ` ); for ( let i = 0 ; i < numCPUs ; i ++) { cluster . fork (); } cluster . on ( 'exit' , ( worker , code , signal ) => { // 워커가 죽을시 console . log ( `Worker ${ worker . process . pi...

NestJS Redis Pub/Sub과 Cluster로 SocketIO 채팅 앱 만들기 -1

이미지
 채팅앱을 만드는 법은 이전글에도 설명을 했지만 멀티 Cluster를 사용하여 채팅앱의 효율을 극대화 하기 위해서 글을 작성합니다. 위 블로그는 이전에 작성한 채팅앱을 기준으로 프로그래밍을 합니다. 해당 자료는 아래 링크를 참고해 주시기 바랍니다. 링크0 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -0 링크1 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -1 링크2 : NestJS Cluster를 이용하여 CPU최대로 활용하기 사진1) 개선된 채팅앱 백엔드 구조도  사진1을 확인할때 이전 채팅앱과 다른점은 서버가 1개 이상이라는 것입니다. 서버안에 Worker가 있는데 이것은 PID가 다른 NestJS프로그램입니다. 해당 서버의 CPU코어수에 따라 Worker를 생성할수 있으며 각각의 워커는 채팅앱 백엔드를 구성합니다.  만약 PubSub기능을 사용하지 않고 그대로 한다면 문제점이 생깁니다.  사진2) PubSub을 사용하지 않을시 문제점 사진2에서 SocketIO 1을 통해서 데이터가 Worker 1으로 전송이 되면 서버를 통해서 Redis에 저장도비니다. 그러면 Server1의 Worker1만 제외하고 나머지 Worker는 Redis의 데이터를 읽기전까지 데이터가 변경 된것을 모르게 됩니다. 사진3) PubSub을 적용후 데이터 흐름 사진2와 달리 사진3은 PubSub기능을 적용한 데이터 흐름도 입니다. SocketIO 1이 Worker1을 통해 Redis에 Publish합니다. 그러면 Redis는 이 데이터를 해당 채널에 SubScribe하는 Worker에 전달합니다. 필요시 Publish한 서버에도 전송합니다. 사진3에서 SubScribe 서버는 Server1과 Server2입니다. 즉 Server에 연결된 모든 Worker가 SocketIO1(Server1)의 Publish 한 데이터를 알수있습니다. 이전...

NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -1

이미지
 안녕하세요. 이번에는 NestJS와 Redis의 Pub/Sub기능을 이용하여 채팅 채널을 만들도록 하겠습니다. 채팅 채널을 테스트히기 위한 툴로는 Postman을 사용할 것이며 자세한 내용은 아래 링크를 참고해 주시기 바랍니다. 링크 : Postman 소켓IO 테스트하기 그리고 이전글을 참고하실려면 아래 링크를 확인해 주시기 바랍니다. 링크 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 백엔드 만들기 -0 일단 현재 블로그에서 작성하는 Node버전은 16.17.0이며 NestJS버전은 9.1.2입니다. 프로젝트를 생성(위 블로그에서는 nestjs-microservice-example)하고 필요한 npm모듈을 설치합니다. socketIO모듈을 설치할때는 아래 링크를 참고해 주시기 바랍니다. 링크 : NestJS SocketIO - 방을 선택해서 들어가는 채팅방 만들기 위 사항이 마무리 되면 microservice 모듈을 설치합니다. - @nestjs/microservices npm 설치 $ npm i --save @nestjs/microservices copy - redis바탕으로 microservices를 구상할때 설치 $ npm i --save ioredis copy 먼저 최상단 루트에 .development.env파일을 만들어주고 아래와 같이 작성합니다. NESTJS_PORT=4500 REDIS_PORT=6379 REDIS_HOST="localhost" NestJS_PORT가 4500이지만 추가로 실행할 서버는 포트번호를 다르가 하면서 추가하시면 됩니다. 사진1) 백엔드 구성 사진1은 개발할려는 기본적인 백엔드 구조 입니다. 모듈안에는 컨트롤러와 웹소켓 서버(socketio.gateway)가 있는데 기본적으로 웹소켓이 채팅앱입니다.  다만 Redis에서 데이터를 Subscribe는 socket_publish에서 받고나서 socketio.ga...

NestJS Redis Pub/Sub과 socketIO로 채팅 앱 백엔드 만들기 -0

이미지
 안녕하세요 알렉스 입니다. 이번에는 채팅앱 백엔드를 만들면서 백엔드를 구현하도록 하겠습니다. 백엔드를 NodeJS로 구현을 할때 문제점은 NodeJS가 싱글스레드라는 것입니다. 이는 아래 링크를 참고해 주시기바랍니다. 링크 : Node JS의 싱글스레드 -1 쉽게 말해서 CPU가 한번에 한가지 일만 한다는 것입니다. 물론 NodeJS가 빠르기는 하지만 한번에 많은 부하가 가해지면 서버가 다운될 위험이 있습니다.  사진1) 서버 한개로 채팅앱 구현  만약 서버 하나로만 채팅앱을 구현할때 단일 서버 또는 SocketIO로 많은 부하가 가해질수 있고 이로 인해서 서버가 다운 될수가 있습니다. 사진2) 채팅앱 백엔드 구조 이를 위해 Redis의 Pub/Sub기능을 이용하여 채팅앱을 분산(or MicroService)하여 개발할 것입니다. 사진2의 NestJS-1, NestJS-2, NestJS-3은 코드는 같지만 각각 다른 서버 또는 포트에서 동작하고 있는 프로그램 입니다. 각각의 서버는 SocketIO서버를 통해서 유저들과 통신을 하게 됩니다. 이때 user1이 작성한 내용은 Redis에 Publish되고 NestJS2, 3에 Subscribe되서 해당되는 유저들도 데이터를 전달 받습니다. 즉 각 서버는 분리되어있지만 Redis의 Pub/Sub기능으로 인해 데이터를 즉각적으로 공유할수 있습니다. 물론 NodeJS은 싱글 스레드이지만 여러개의 스레드를 동시에 사용할수 있습니다. 그러면 1개의 서버를 사용해도 부담이 적죠. 하지만 그것에 대한 내용은 나중에 작성하도록 하겠습니다. 이번 시리즈는 싱글스레드 NestJS을 이용해서 분산 채팅앱을 만드는것에 집중하도록 하겠습니다. 다음글 : NestJS Redis Pub/Sub과 socketIO로 채팅 앱 만들기 -1 

NestJS Redis 연결

이미지
 안녕하세요. 이번에는 Redis을 이용하여 NestJS와 연결을 하도록 하겠습니다.  일단 해당 Local 또는 Remote PC에 Redis가 설치되 있어야 하고 특히 Remote PC는 해당 Redis가 외부에서 통신이 가능하도록 셋팅해야 합니다. NestJS 공식 문서 링크 Redis 공식 문서 링크 1. npm모듈 설치(dependencies) - cache-manager와 cache-manager-redis-store를 설치한다 $ npm install cache-manager cache-manager-redis-store copy 2. npm모듈 설치(devDependencies) - cache-manager와 cache-manager-redis-store를 설치한다 $ npm install -D @types/cache-manager copy // src/cache-dbmodule/cache-dbmodule.module.ts import { CacheModule , Global , Module } from '@nestjs/common' ; import * as redisStore from 'cache-manager-redis-store' ; import { CacheDbmoduleController } from './cache-dbmodule.controller' ; import { CacheDbmoduleService } from './cache-dbmodule.service' ; require ( 'dotenv' ). config (); // env파일을 사용하기 위한 코드 // CacheModule를 설정합니다. export const cacheModule = CacheModule . registerAsync ({ useFactory : async () => ({ store : r...

Redis CLI

  1. Install CLI redis install하기 - 공식 설치법은 해당 링크 를 참조해 주시기 바랍니다. 2. redis접속하기 - host 및 port를 입력하여 연결 $ redis-cli -h [host ip] -p [port ex 6379] copy - 키값을 이용하여 데이터 저장 $ set [key] [value] ex) $ set name "alex" 위 예시처럼 작성하면 키값이 name이고 "alex" 데이터를 저장할수 있습니다. copy - 같은 키값이 존재하지 않으면 데이터 저장 $ set [key] [value] nx ex) $ set name "alex" nx 위 예시처럼 작성하면 키값이 name이고 "alex" 데이터를 저장할수 있습니다. 다만 redis안에 동일한 키가 존재하면 생성할수 없습니다. copy - 같은 키값이 존재하지 않으면 여러 데이터 저장 $ msetnx [key1] [value1] [key2] [value2] [key3] [value3] etc ... ex) $ msetnx 1 a 2 b 3 c 위의 예시처럼 키값이 1,2,3이 각각 value를 a,b,c를 갖게합니다. 다만 redis안에 동일한 키가 하나라도 존재하면 입력한 전체 키와 데이터를 생성할수 없습니다. copy - 같은 키값이 존재해야 데이터 저장 $ set [key] [value] xx ex) $ set name "alex" xx 위 예시처럼 작성하면 키값이 name이고 "alex" 데이터를 저장할수 있습니다. 다만 redis안에 동일한 키가 존재하면 생성할수 있습니다. copy - 여러 키값이 존재해야 데이터를 한꺼번에 저장 $ mset [key1] [value1] [key2] [value2] [key3] [value3] etc..... ex) $ ms...