Redis

본 글은 네이버 부스트캠프 과정을 위해 작성한 내용을 수정한 게시글입니다.


1. 서론

1.1. Redis란

  • Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형(NoSQL) 데이터베이스 관리 시스템(DBMS)
  • 데이터베이스, 캐시, 메시지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소
  • dB-engines.com을 기준으로 key, value 저장소 중에서 가장 순위가 높음

1.2. 캐시 서버(Cache Server)를 사용하는 이유

  • 데이터베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않음
    • 하지만 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 느려질 수 있음
  • 일반적으로 서비스 운영 초반, 규모가 작은, 사용자가 많지 않은 서비스의 경우 WEB (Client) - WAS (Server) - DB의 구조로 데이터베이스에 무리가 가지 않음
    • 하지만 사용자가 늘어난다면 데이터베이스에 과부하가 올 수 있기 때문에 캐시 서버를 도입하여 사용하곤 함

1.3. 캐시란

  • 한번 읽어온 데이터를 임의의 공간에 저장하여 다음에 읽을 때는 빠르게 결과값을 받을 수 있도록 도와주는 공간
    • 같은 요청이 여러 번 들어오는 경우 매번 데이터베이스를 거치는 것이 아니라 캐시 서버에서 첫 번재 요청 이후 저장된 결과값을 바로 내려주기 때문에 DB의 부하를 줄이고 서비스의 속도도 느려지지 않는 장점이 있음
  • Look aside cache 패턴과 Write Back 패턴으로 구분됨

1.3.1. Look aside cache 동작 순서

  1. 클라이언트가 데이터 요청
  2. 웹서버는 데이터가 존재하는지 Cache 서버에 먼저 확인
  3. Cache 서버에 데이터가 있으면 DB에 데이터를 조회하지 않고 Cache 서버에 있는 결과값을 클라이언트에게 바로 반환 (Cache Hit)
  4. Cache 서버에 데이터가 없으면 DB에 데이터를 조회하여 Cache 서버에 저장하고 결과값을 클라이언트에게 반환 (Cache Miss)

1.3.2. Write Back 동작 순서

  1. 웹 서버는 모든 데이터를 Cache 서버에 저장
  2. Cache 서버에 특정 시간 동안 데이터가 저장
  3. Cache 서버에 있는 데이터를 DB에 저장
  4. DB에 저장된 Cache 서버의 데이터를 삭제
  • insert 쿼리를 한 번씩 500번 날리는 것보다 insert 쿼리 500개를 붙여서 한 번에 날리는 것이 더 효율적이라는 원리
  • 단점 : 들어오는 데이터들이 저장되기 전에 메모리 공간에 머무르는데 이때 서버에 장애가 발생하여 다운된다면 데이터가 손실될 수 있음

1.4. Redis의 특징

  • Key, Value 구조이기 때문에 쿼리를 사용할 필요가 없음
  • 데이터를 디스크에 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도가 빠름
  • String, Lists, Sets, Stored Sets, Hashes 등의 자료구조 지원 image (https://redislabs.com/redis-enterprise/data-structures/ 참고)

    • String: 가장 일반적인 key- value 구조의 형태
    • Sets: String의 집합, 여러 개의 값을 하나의 value에 넣을 수 있음, 포스트의 태깅 같은 곳에 사용될 수 있음
    • Sorted Sets: 중복된 데이터를 담지 않는 Set 구조에 정렬(Sort)를 적용한 구조, 랭킹 보드 서버 같은 구현에 사용할 수 있음
    • Lists: Array 형식의 데이터 구조, Lists를 사용하면 처음과 끝에 데이터를 넣고 빼는 건 빠르지만 중간에 데이터를 삽입하거나 삭제하는 것은 어려울 수 있음
  • Single Thread임
    • 한 번에 하나의 명령만 처리할 수 있음
    • 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기가 필요함
      • 하지만 get, set 명령어의 경우 초당 10만 개 이상 처리할 수 있을만큼 빠름
  • 추가적인 특징
    • 영속성을 지원하는 인메모리 데이터 저장소
    • 읽기 성능 증대를 위한 서버 측 복제를 지원
    • 쓰기 성능 증대를 위한 클라이언트 측 샤딩(Sharding) 지원

1.5. Redis 사용 시 주의 사항

  • 서버에 장애가 발생했을 경우 그에 대한 운영 플랜이 꼭 필요
    • 인메모리 데이터 저장소 특성 상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문
  • 메모리 관리가 중요
  • 싱글 스레드의 특성 상, 한 번에 하나의 명령어만 처리할 수 있기 때문에, 처리하는데 시간이 오래 걸리는 요청, 명령은 피하는 것이 좋음

2. NCP - Redis Server 생성

2.1. Redis Server 생성

  1. 네이버 클라우드 플랫폼 콘솔에 접속
  2. Platform 메뉴에서 Classic을 선택하여 클릭
  3. Services > Server 메뉴를 차례대로 클릭
  4. [Server 생성] 버튼 클릭
  5. 이미지 타입 > DBMS 선택
  6. DMBS 이미지 타입 > Redis 선택
  7. 입맛(개발 환경)에 맞게 기타 설정 하기 (나는 전부 Default로 설정하였음)
  8. 서버 생성

2.2. ACG 설정 및 공인 IP 설정

2.2.1. ACG 설정

  1. 네이버 클라우드 플랫폼 콘솔의 Platform 메뉴에서 Classic을 선택하여 클릭해 주십시오.
  2. Services > Storage > Cloud DB for Redis 메뉴를 차례대로 클릭해 주십시오.
  3. Redis Server 메뉴를 클릭해 주십시오.
  4. 설정할 서버의 상세 정보 화면에서 ACG의  버튼을 클릭해 주십시오.
  5. [ACG 설정] 버튼을 클릭해 주십시오.
  6. SSL VPN이 접속할 수 있도록 설정을 추가해 주십시오.
    • 접근 소스: SSL VPN의 IP 주소 대역
    • 허용 포트: DB 서버 포트
    • **추가 사항 : TCP0.0.0.0/06379**

2.2.2. 공인 IP 설정

  1. 네이버 클라우드 플랫폼 콘솔의 Platform 메뉴에서 VPC를 선택하여 클릭해 주십시오.
  2. Services > Compute > Server 메뉴를 차례대로 클릭해 주십시오.
  3. Public IP 메뉴를 클릭해 주십시오.
  4. [공인 IP 신청] 버튼을 클릭해 주십시오.
  5. 적용 서버를 선택하고 메모를 입력한 후 [다음] 버튼을 클릭해 주십시오.
  6. [생성] 버튼을 클릭해 주십시오.

2.3. redis 서버의 ‘/etc/redis/6379.conf’ 파일 수정

  • redis 서버에 접속 후, /etc/redis/6379.conf에서 두가지 옵션을 수정하고 재가동
    • bind 127.0.0.1 –> bind 0.0.0.0
    • protected-mode yes –> protected-mode no

3. redis-cli

소스코드


ioredis 설치 명령어

npm install ioredis

Redis 객체 생성 예제

import Redis from "ioredis";

const redis = new Redis({
  host: "host_name",
  port: "port",
});

key-value 추가 예제

redis.set("abc", "def");

key를 통해 value 출력 예제

redis.get("abc", (err, result) => {
  if (err) {
    console.error(err);
  } else {
    console.log(result);
  }
});

GitHub Repository

https://github.com/jinu0137/redis_example


Reference

Redis란

Redis란? 레디스의 기본적인 개념 (인메모리 데이터 구조 저장소)

NCP 서버 ACG 및 공인 IP 설정

Cloud DB for Redis 시작

Redis 서버 설정

[#1] Redis 서버 생성 및 세팅

Redis - Node.js 예제

ioredis