Search

Redis

Redis (Remote Dictionary Server)

Redis는 Key-Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 NoSQL DBMS이다.
Redis를 데이터베이스로 사용할 수도 있고, Cache Server로 사용할 수도 있다.
→ NoSQL 방식 DBMS로 분류되기도 하고, In Memory 솔루션으로 분류되기도 한다.
가장 큰 특징은 In-Memory 데이터 구조 저장소로 데이터를 빠르게 처리할 수 있다.
싱글 스레드 방식을 사용하여 한 번에 하나의 명령어만을 처리하기 때문에 경쟁상태가 거의 발생하지 않는다.

Redis를 사용하는 이유

Redis의 가장 큰 특징인 In-Memory구조이기 때문에 매우 빠른 속도로 데이터를 처리할 수 있다.
데이터베이스에 가해지는 부하를 감소하고 서비스의 속도를 향상시킬 수 있다.
매번 데이터베이스에 접근하여 데이터를 조회하는 경우 Cache Server로 사용을 고려해 볼 수 있고 Redis에서 저장된 값을 그대로 반환하여 사용할 수 있다.
Redis의 데이터는 다양한 데이터 타입을 지원하여 애플리케이션 요구 사항에 맞는 다양한 데이터 타입을 활용할 수 있다.
Redis는 싱글 스레드이기 때문에 모든 자료구조가 Atomic하기 때문에 데이터의 정합성을 보장하기도 좋다.

Redis의 여러 자료구조

Redis에서 자주 쓰는 자료구조만 정리해 보았다.
Hash
field-value 쌍을 사용한 자료구조
key에 대한 filed의 개수는 제한이 없다.
RDB와 유사 key(USER1)은 RDB 하나의 row와 같다.
Set
정렬되지 않은 문자열의 모음, 중복될 수 없다.
교집합, 차집합, 합집합 등 연산을 레디스에서 수행할 수 있다.
Sorted Set
set과 마찬가지로 key 하나에 중복되지 않은 여러 멤버를 저장하지만 각각의 멤버는 SCORE에 연결된다.
모든 데이터는 SCORE로 정렬되며 주로 sort가 필요한 곳에 사용된다.

Redis 사용시 주의할 점

Redis는 싱글 스레드 기반이기 때문에 한 요청을 수행하는 동안 다른 요청을 받지 못한다.
한 클라이언트가 많은 시간을 소모하는 요청을 할 경우 장애가 발생할 수 있다.
하나의 key에 너무 많은 데이터를 적재하지 않도록 한다.
TTL timeout 적절한 값을 설정해야 한다.

Redis의 ZSet

Redis는 key-value 타입의 자료 저장 형태를 제공한다. 거기에 추가로 ZSET이라는 특이한 형태의 저장 형태를 제공한다.
ZSET은 일반적인 Set 자료구조와 유사하지만 각 요소에 점수(Score)를 할당 할 수 있고, 이 점수에 따라 자동으로 정렬되는 특성을 가지고 있다.

ZSET의 특징

요소와 점수로 이루어진 구조
ZSET의 요소(Member)는 고유한 점수(Score)와 함께 저장된다. Score는 double 타입의 실수이고 요소의 정렬 기준이 된다.
중복 없음
ZSET 내의 요소(Member)는 유일해야 하며, 중복된 요소(Member)를 추가하면 Score만 갱신된다.
자동 정렬
ZSET은 요소들이 점수에 따라 정렬된다. 기본적으로 점수가 낮은 순으로 정렬되지만 높은 순서대로 조회할 수도 있다.
보통 RDBMS에서는 정렬이 필요한 컬럼을 index를 이용하여 정렬할 수 있지만, 하나의 테이블에 미리 인덱싱을 해줄 수 있는 Clustered Index는 하나만 생성할 수 있다. 다른 컬럼에 대해서 인덱싱이 필요한 경우에는 Non-Clustered Index를 사용하게 되는데 이는 조회하는 순간 부하가 커지고 속도가 느려지는 현상이 일어난다.
하지만, ZSET은 Sorted Set을 이용하여 구현했기때문에 랭킹 등 인덱싱이 필요한 기능을 처리하는데 알맞는 자료구조이다.