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를 설정하지 않으면 데이터가 삭제되지 않는다.
- 메모리를 활용하면서도 데이터의 영속적인 보존(Persistence)
- 1개의 Thread 사용 (Single Thread)
- 서버 하나에 여러개의 Redis Server 실행 가능 -> Master-slave 구조 개념
- 하나의 트랜잭션당 하나의 명령만 수행함.
- List타입의 데이터 처리가 MySQL에 비해 10배 정도 빠름.
- 서버 복제 지원 -> master-slave
- 장애 발생 대비, 읽기 성능 증대를 위해 slave가 master에 연결되어
master 데이터를 slave 에 복제를 지원한다.
- master에 쓰기가 수행된다면, slave로의 데이터 전송이 실시간으로 이루어진다.
- 장애 발생 대비, 읽기 성능 증대를 위해 slave가 master에 연결되어
* 단점 : 인메모리 방식이기 때문에, 장애 발생시 데이터 유실의 위험이 있음. 따라서 스냅샷, 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 지원 데이터 타입(형식)
- String: 일반적인 Key-value 형태
- Hash: 하나의 key에 여러개의 value를 저장할 때 사용함.
- List: Array 형식의 데이터 구조, 처음과 끝 데이터를 넣고 뺴는 것은 빠르지만, 중간 데이터는 성능이 떨어진다.
- Set: String의 집합체, 중복을 허용하지 않는다.
- Sorted Set: 중복된 데이터를 허용하지않는 Set구조에 정렬(Sort)를 적용한 구조.
- Bitmaps: 실제 데이터유형이 아닌, 문자열 유형에 정의된 비트 지향 연산의 집합
- 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
* 실행 옵션에 대한 설명. (맨 위부터 순서대로)
- 컨테이너명 지정 -> myredis
- 포트 포워딩 -> 로컬:도커 포트 포워딩
- 기존에 설정했던 redis-network 네트워크 사용
- 로컬의 지정 폴더와, redis의 data 폴더를 연결 -> redis의 데이터가 로컬 지정폴더에 저장됨.
- 이미지 지정, 백그라운드 실행.
- 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번 접속방법으로 접속 했을 떄 위와 같은 상태가 되면 접속 완료!
- 간단한 데이터 삽입, 조회로 Redis 연동 테스트 종료!
- 전체 키 삭제 : flushall
Redis 란 무엇인지 간단하게 알아보았고, 다음은 Spring boot 와 Local 에 설치한 Redis 를 연동 시켜보겠다!
'DB > Redis' 카테고리의 다른 글
[Redis] Spring Boot - Redis Pub, Sub 구현&응용 (3) | 2024.03.29 |
---|---|
[Redis] Redis를 이용한 임시번호 발급(OTP, 임시비밀번호, 인증문자) - Spring Boot (0) | 2024.03.23 |
[Redis] Redis - pub/sub 이란? (1) | 2023.07.16 |
[Redis] Redis + Spring boot 연동 (2) (2) | 2023.03.30 |
댓글