본문 바로가기
DB/Redis

[Redis] Redis란? - Docker로 간단 Redis(Local) 설치 (1)

by lucas_owner 2023. 3. 29.

1. Redis 란? 

- in-memory 방식의 No-SQL 기반 DBMS

- Key-Value(키-값) 구조의 데이터를 저장, 관리 

- Singel-Thread 기반으로 동작함.(명령 수행)

- DB, Cache(캐시),Message Broker(메시지브로커) 용도로 주로 사용함. 
   - 사용예시)  세션관리, 대기열, 실시간 순위표, 캐시

 

1-1. In-memory (인메모리 저장소)

- MySQL, PostgreSQL, Oracle 과 같은 DBMS에서는 디스크 또는 SSD 와 같은 저장소에 저장하지만, 

Redis는 in-memory 방식으로 인해, 서버의 주 메모리에 저장된다.

필요한 데이터를 빠르게 조회, 처리 할 수 있다. (서버 메모리에 데이터가 적재되기 때문.)

in-memory 방식이지만, 스냅샷을 통해 디스크에 백업 하는 기능이 있다. 

 

기존의 WAS-DB 구조를 사용한다고 했을때, 사용자가 많아져 DB로의 요청이 많아진다면, DB에 부하가 걸리게 된다. 

Redis는 이럴 때 캐시 서버로서 이용 하게 된다. (요청 데이터를 얻기위해 DB에 접근하지 않아 된다.)

 


1-2. Redis 특징 및 장단점

  • 초당 10만 ~ 15만건 정도의 명령 수행 가능. 
    • 공식문서상: 리눅스 시스템에서 파이프링(pipelining)을 통해 초당 100만건 요청 수행가능
  • 영속성을 지원하는 In-memory 데이터 저장소
    • 메모리를 활용하면서도 데이터의 영속적인 보존(Persistence)
      • 스냅샷 기능을 제공하여 메모리 내용을 *.rdb 파일로 저장하여, 해당 시점으로 데이터 복구 가능.
    • 명령어로 명시적 삭제, expires를 설정하지 않으면 데이터가 삭제되지 않는다.
  • 1개의 Thread 사용 (Single Thread)
    • 서버 하나에 여러개의 Redis Server 실행 가능 -> Master-slave 구조 개념
    • 하나의 트랜잭션당 하나의 명령만 수행함. 
  • List타입의 데이터 처리가 MySQL에 비해 10배 정도 빠름. 
  • 서버 복제 지원 -> master-slave
    • 장애 발생 대비, 읽기 성능 증대를 위해 slave가 master에 연결되어 
      master 데이터를 slave 에 복제를 지원한다. 

      - master에 쓰기가 수행된다면, slave로의 데이터 전송이 실시간으로 이루어진다.

 

* 단점 : 인메모리 방식이기 때문에, 장애 발생시 데이터 유실의 위험이 있음. 따라서 스냅샷, AOF 기능을 통한 복구 및 백업을 통해 데이터 유실에 대비해야함


1-3. Redis 용어

  • AOF - Append Only File
    • 모든 쓰기 명령에 대한 로그를 남기고 저장한다.
    • 서버가 재시작 할 시 write/update 를 순차적으로 재실행, 데이터를 복구한다.
  • COW - Copy On Write
    • redis가 데이터를 쓰기위해 사용하는 메커니즘
  • RSS - Resident Set Size
    • 데이터를 포함한, redis가 실제로 사용하고 있는 메모리.
    • 해당 값은 실제로 사용하고 있는 메모리 값보다 클 수 있다. 

* 이외에도 Redis 를 더 효율적으로 사용하기 위한 개념들이 존재한다. 

 

- Redis Replication: master-Replica (단순한 비동기식 복제, master를 그대로 Replica로 복제{replicaof 커맨드로 연결})

- Redis Cluster: 분산처리 -> 데이터가 여러 마스터에 분할 저장되는 샤딩 기능제공, 모든 노드가 서로 감시, 마스터3대 이상필요

- Redis Sentinel: 장애 복구 시스템 -> 센티널 노드가 다른 노드 감시, 마스터가 비정상일때 자동으로 페일오버함.

- Redis Topology

- Redis Sharding

- Redis Failover 

 


1-4. Redis 지원 데이터 타입(형식)

  1. String: 일반적인 Key-value 형태
  2. Hash: 하나의 key에 여러개의 value를 저장할 때 사용함.
  3. List: Array 형식의 데이터 구조, 처음과 끝 데이터를 넣고 뺴는 것은 빠르지만, 중간 데이터는 성능이 떨어진다.
  4. Set: String의 집합체, 중복을 허용하지 않는다.
  5. Sorted Set: 중복된 데이터를 허용하지않는 Set구조에 정렬(Sort)를 적용한 구조.
  6. Bitmaps: 실제 데이터유형이 아닌, 문자열 유형에 정의된 비트 지향 연산의 집합
  7. streams

 

 

2. Redis 설치 - Docker 

- 작업 환경 

OS : Mac OS Monterey 12.6

docker version : 20.10.8

Redis : 7.0.10 (2023.03.29 기준 latest)

 

 

2-1. Redis Image Pull (받아오기)

# 가장 최근 버전의 Image
$docker image pull redis


# 버전 지정 pull - 예시
$docker image pull redis:6.0.18

 

2-2. Docker 내부에 network 생성 및 확인

# network 생성
$docker network create redis-network

# network 확인.
$docker network ls

- Redis 를 실행 하는 방법은 여러가지가 존재하지만, Redis를 편하게 사용하게 해주는 redis-cli 를 사용하기 위해서는 

  redis-cli 컨테이너를 실행하고 두개의 컨테이너를 연결 시켜줘야 하기 때문에 설정해준다. 

(docker 컨테이너 내부 접속 후 redis-cli 사용한다면 안해줘도 된다.)

 

 

2-3. Redis 서버 실행 - Docker run

docker run --name myredis \
-p 6379:6379 \
--network redis-network \
-v /Users/my/dockers/redis:/data \
-d redis:latest redis-server \
--appendonly yes

* 실행 옵션에 대한 설명. (맨 위부터 순서대로)

  1. 컨테이너명 지정 -> myredis
  2. 포트 포워딩 -> 로컬:도커 포트 포워딩
  3. 기존에 설정했던 redis-network 네트워크 사용
  4. 로컬의 지정 폴더와, redis의 data 폴더를 연결 -> redis의 데이터가 로컬 지정폴더에 저장됨.
  5. 이미지 지정, 백그라운드 실행.
  6. redis 의 데이터를 파일로 보존할건지 여부 -> default = no (저장안함.)

 

2-4. Redis 접속 - 방법 2가지!!!!! 

 

- 1번 방법

# docker run -it --network [네트워크명] --rm [컨테이너id] redis-cli -h [컨테이너명]

$docker run -it --network redis-network --rm redis:latest redis-cli -h myredis

- 현재 실행중인 Redis Server에 또하나의 컨테이너(redis_cli)를 네트워크를 통해 접속. 

 

 

- 2번 방법

$docker exec -it myredis redis-cli --raw

- 도커 컨테이너 내부에 접속하여, redis-cli 를 실행하여 접속하는 방법

- --raw 옵션은 redis-cli 를 사용할때 한글을 정상적으로 출력하기 위해 사용하는 옵션이다.

 

 

3. 설치 완료 테스트 

 

1번 접속 방법
2번 접속 방법

- 1번 혹은 2번 접속방법으로 접속 했을 떄 위와 같은 상태가 되면 접속 완료! 

 

- 간단한 데이터 삽입, 조회로 Redis 연동 테스트 종료! 

 

- 전체 키 삭제 : flushall

 


Redis 란 무엇인지 간단하게 알아보았고, 다음은 Spring boot 와 Local 에 설치한 Redis 를 연동 시켜보겠다! 

 

 

 

 

 

 

 

반응형

댓글