Redis란?
- In Memory Data Structure Store
- 비관계형 데이터베이스
- String, set, sorted-set, hash, list 의 자료구조를 지원
Memcached와 Redis
- 공통점
- 인메모리 데이터 저장소
- 응답시간이 매우 빠름: 1ms 이하의 응답시간
- 데이터 파티셔닝 가능
- 다양한 프로그래밍 언어 지원: 자바, 파이썬 C, C++, C# 등등
- 차이점
- Memcached
- 멀티스레드 지원
: 단일스레드인 Redis와는 다르게 멀티스레드를 지원해 더 많은 작업 처리가 가능하다.
- Reids
- 다양한 데이터 구조
: Memcached는 문자열만 지원하지만 Redis의 경우 String, Set, List등의 다양한 데이터 조를 지원한다.
- Disk에 데이터 저장
: 데이터를 디스크에 저장할 수 있다. 따라서 데이터를 복구할 수 있다.
Redis의 특징
- 데이터의 영속성을 지원한다.
: Redis는 인메모리 데이터이면서 디스크에도 데이터를 저장한다. 따라서 서버가 다운되어도 데이터가 사라지지 않으며 다시 시작한 후 데이터를 복구할 수 있다.
- RDB(Sanpshotting) 방식: 순간적으로 메모리의 데이터 전체를 디스크에 옮겨 담는 방식
- AOF(Append On File)방식: Redis의 모든 write/update 연산을 log 파일에 기록하는 방식
- 읽기 성능 중대를 위한 서버 측 복제를 지원한다.
- 쓰기 성능 중대를 위한 클라이언트 측 샤딩(Sharding)을 지원한다.
샤딩 : 같은 테이블의 스키마를 가진 데이터를 다수의 데이터베이스에 분산 저장하는 방법
- 다양한 데이터 형식을 지원한다.
Redis Collection
Redis는 다양한 데이터 형식을 지원하는데 이를 Redis Collection이라 하며 크게 5가지를 지원한다.
String
- 일반적인 문자열로 text 문자열 분만 아니라 숫자나 JPEG같은 Binary File 까지 저장할 수 있다.
Set
- String의 집합으로 여러개의 값을 하나의 value 내에 넣을 수 있다. Redis는 Setㅇ간의 연산을 지원하는데, 집합인 만큼 교집합, 차집합, 차이 를 매우 빠른 시간 내에 추출할 수 있다.
- 중복된 데이터를 담지 않기 위해 사용하는 자료구조로 중복된 데이터를 여러번 저장하면 최종 한번만 저장된다. 따라서 Set을 사용하게 되면 모든 데이터를 다 가져올 수 있기 때문에 주의해야한다.
Sorted Set
- Set에 "score"라는 필드가 추가된 데이터 형으로 데이터는 오름차순으로 내부 정렬되며, 정렬되는 만큼 score값 범위에 따른 데이터 조회가 가능하다.
Hashes
- value내에 field/string value 쌍으로 이루어진 데이터 구조체이다.
List
- String의 집합으로 저장되며 Set과 비슷하지만 일종의 Linked List로 리스트의 앞과 뒤, 지정된 인덱스에 데이터를 넣거나 뺄 수 있다.
Redis의 Key
- 레디스의 키는 문자열이기 때문에 text문자열부터 JPEG파일까지 모든 이진 시퀀스를 키로 사용할 수 있고 빈 문자열도 키가 될 수 있다.
하지만 키를 조회할 때의 비용을 생각하면, 키를 너무 길게 사용하는 것을 권장하지 않는다.
Exprie 기능
- 레디스는 In-memory DB이기 때문에 메모리에 저장할 수 있는 데이터는 한정적이다.
- 메모리가 다 차게 되면 레디스는 자체적으로 가장 먼저 들어온 데이터나 사용을 오래 안한 데이터를 삭제해 메모리 확보 후 저장하거나 더이상 데이터를 입력받지 못하게 막는다.
- 하지만 레디스가 자체적으로 처리하는 것이 아니라 직접 개발자가 설정해 처리할 수 있다. 데이터를 저장할 때 데이터의 사용기한이 언제까지인지를 직접 설정해 그 기간이 지나면 해당 데이터를 삭제해서 메모리를 확보할 수 있다.
Redis의 장점
- 리스트, 배열과 같은 데이터를 처리하는데 유용하다.
: 다양한 데이터 형식 지원으로 다양한 방식으로 데이터를 활용할 수 있다.
- 리스트형 데이터의 입력과 삭제가 빠르다
- 메모리를 활용해 영속적인 데이터 보존이 가능하다.
: 명령어로 명시적 삭제를 하지 않으면 데이터가 삭제되지 않는다.
- 싱글 스레드로 수행되며 서버 하나에 여러개이 서버를 띄우는것이 가능하다.
Redis의 단점
- Key-Value의 형태로 저장된 데이터이기 때문에 레디스 내에서 데이터를 처리하는 것이 어렵다.
- Redis의 처리속도가 빠른편이지만 Single Threaded이기 때문에 처리시간이 긴 명령어가 들어오면 뒤에 들어오는 명령어는 모두 대기해야한다.
: 해결 방법으로는 keys 대신 scan 명령을 사용해 긴 명령을 짧은 여러번의 명령으로 바꾸고, Collection의 모든 아이템을 다 가져와야할 때는 큰 컬렉션을 다른 여러개의 컬렉션으로 나누어 저장해 데이터를 불러오는 것이 좋다.
긴 명령어
- keys: 모든 아이템을 순회하는 명령어
- FLUSHALL, FLUSHDB: 모든 데이터 삭제
- Delete Collections: Collection 내 아이템을 전부 삭제하는 명령
- Get All Collections: 모든 데이터를 조회
참고
레디스 활용 사례