Redis ?
- key, value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반 비관계형 데이터베이스 관리 시스템
- 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소
- db-engines.com 에서 key, value 저장소 중 가장 순위가 높다
- 레디스를 이해하기 위해 다음 두 개념을 우선적으로 살표보자.
인메모리 데이터 구조
In-Memory DB
IMDB, 혹은 MMDB(Main Memory DBMS) 라고도 한다.
디스크가 아닌 주 메모리에 모든 데이터를 보유하고 있는 데이터베이스.
In-Memory DB의 장점
- 디스크검색보다 자료접근이 훨씬 빠른것이 가장 큰 장점이다.
- 데이터양의 증가로 DB 응답속도가 떨어지는 문제를 해결할 수 있는 대안이 인메모리 데이터베이스
- 디스크방식은 저장된 데이터를 대상으로 쿼리를 수행하지만 인메모리 방식은 메모리상에 색인을 넣어 필요한 모든 정보를 메모리상의 색인을 통해 빠르게 검색이 가능하다.
In-Memory DB의 단점
- 매체가 휘발성이다(DB전원이 갑자기 꺼지면 자료들이 삭제된다.)
- 로그인 세션과같은 서버가 꺼져서 날아가도 상관없는 임시 데이터에 주로 쓰인다.
- 데이터에 비해 RAM 용량이 넉넉하지 않을 경우 가상메모리를 쓰게 되어 역효과가 날 수 있다.
주요 제품
- Amazon ElastiCache
- Redis
- 알티베이스
- Kairos 등
캐시서버
Redis 와 같은 인메모리 데이터 구조 저장소를 사용하는 이유??
- 데이터베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 문제가 발생하여도 데이터가 손실되지 않는다.
- 하지만 매번 디스크에 접근해야하기 때문에 사용자가 많아질수록 부하가 많아져 느려질 수 있다.
- 서비스 운영 초기나 규모가 작은 서비스의 경우 WEB-WAS-DB 구조로도 데이터 베이스에 무리가 없다.
- But! 사용자가 늘어나면 데이터베이스가 과부하 될수 있기 때문에 캐시서버를 도입하여 사용한다. 그리고 이 캐시서버로 사용할 수 있는것이 바로 Redis 이다.
- 캐시는 한번 읽어온 데이터를 임의 공간에 저장하여 다음에 읽을때는 빠르게 결과값을 받을 수 있도록 도와주는 공간
- 같은 요청이 여러번 들어오는 경우 매번 데이터베이스를 거치는 것이 아닌 캐시 서버에서 첫번째 요청 이후 저장된 결과값을 바로 내려주기 때문에 DB의 부하를 줄이고 서비스의 속도도 느려지지 않는 장점이 있다.
캐시서버의 패턴
-
Look aside cache
- 클라이언트가 데이터를 요청
- 웹서버는 데이터가 존재하는지 캐시서버에 먼저 확인
- 캐시서버에 데이터가 있으면 DB에서 데이터를 조회하지 않고 캐시서버에 있는 결과값을 클라이언트에게 바로 반환 (Cache Hit)
- 캐시서버에 데이터가 없으면 DB에 데이터를 조회하여 캐시서버에 저장하고 결과값을 클라이언트에게 반환 (Cache Miss)
-
Write Back
- 웹서버는 모든 데이터를 캐시 서버에 저장
- 캐시서버에 특정 시간동안 데이터가 저장됨
- 캐시서버에 있는 데이터를 DB에 저장
- DB에 저장된 캐시서버의 데이터를 삭제
Redis의 특징
- Key, Value 구조이기 때문에 쿼리를 사용할 필요가 없다.
- 데이터를 디스크에 쓰는 구조가 아닌 메모리에서 데이터를 처리하기 때문에 속도가 빠르다.
- String, Lists, Sets, Sorted Sets, Hashes 자료 구조를 지원한다.
- String : 가장 일반적인 key-value 구조의 형태
- Sets : String의 집합. 여러개의 값을 하나의 value 에 넣을 수 있다.
- Sorted Sets : 중복된 데이터를 담지 않는 Set 구조에 정렬 Sort를 적용한 구조
- Lists : Array 형식의 데이터 구조. List를 사용하면 처음과 끝에 데이터를 넣고 빼는건 빠르지만 중간에 데이터를 삽입하거나 삭제하는것은 어렵다.
- Single Threaded로 한번에 하나의 명령만 처리할 수 있다. 중간에 처리시간이 긴 명령어가 들어오면 그 뒤 명령어들은 모두 앞에 있는 명령어가 처리될때까지 대기한다.
Redis 사용시 주의점
- 서버에 장애가 발생했을 경우에 대한 대비책이 필요하다.
- 인메모리 데이터 저장소 특성상 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문
- 메모리 관리가 중요하다.
- 싱글 쓰레드의 특성상 한번에 하나의 명령만 처리할 수 있다. 처리하는데 시간이 오래 걸리는 요청, 명령은 피하는 것이 좋다.