CS 공부

레디스(Redis) 본문

CS공부/데이터베이스

레디스(Redis)

kluiop1 2021. 7. 22. 01:33

레디스(Redis)Remote Dictionary Server의 약자로서, "-" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템(DBMS)이다.

 

인메모리 상태에서 데이터를 처리함으로써 흔히 사용하는 관계형 DB나 문서형 DB보다 빠르고 가볍다.

 

운영중인 웹 서버에서 키-값 형태의 데이터 타입을 처리해야하고 I/O가 빈번히 발생해 다른 저장 방식을 사용하면 효율이 떨어지는 경우 사용

 

어마어마한 I/O를 발생시키는 데이터를 처리할 때 레디스를 사용해 데이터를 캐싱 처리하고, 일정한 주기에 따라 RDS에 업데이트를 한다면 RDS에 가해지는 부담을 크게 줄이고, 성능은 크게 향상할 수 있다.

 

많은 I/O를 예시로 들었지만 가장 많이 사용되는 건 역시 사용자의 세션 관리와 API 캐싱, 메시지 큐잉에 사용된다.

 

레디스의 데이터 구조

레디스는 RDS와 달리 데이터 타입(VARCHAR, INT, DATETIME) 등을 지원하지 않고 오직 몇 가지 로우 레벨의 데이터 타입을 지원한다.

 

1. 문자열(String)

거의 대부분의 데이터를 문자열로 표현한다. 가령 숫자나 날짜 및 시간 등을 문자열로 저장한다고 생각하면 된다.

 

2. 해시(Hash)

해시는 필드를 가질 수 있다. 예를 들어 사용자 정보라는 해시가 있다면 이메일과 닉네임을 가질 수 있다. 해시는 전체를 가져오거나 개별 필드를 가져올 수 있다.

 

3. 리스트(List)

리스트는 연결 리스트(Linked list)이다. 배열의 왼쪽, 오른쪽에 엘리먼트를 추가할 수 있습니다. 리스트 안의 데이터는 문자열만 가능하다.

 

4. (Set)

셋은 리스트와 유사한 특징을 보이지만 고유 값(Distinct value)을 저장한다는 점에서 차이점이 있다. 고유 값이 이미 정해진 셋에는 고유 값에 해당하는 멤버를 생성할 수 없다. 또한 셋은 정렬을 할 수 있다.(Sorted Set) 정렬을 통해서 특정 기준 값에 들어온 데이터만 필터링하는 게 가능하다.

 

레디스 스키마

레디스의 스키마는 데이터를 정규화하고, 데이터의 로우에 대해 일관된 레퍼런스를 가지게 해 줄 수 있게 해주는 용도로 존재한다. 이는 데이터 입출력에 큰 도움을 준다.

 

예를 들어 아래는 사용자의 이메일, 닉네임, 최근 로그인 시간을 레디스에 저장한 모습이다.

 

user:userId:email:문자열

user:userId:nickname:문자열

user:userId:lastLogin:문자열

 

데이터를 :로 구분해 접근이 가능한 걸 유추할 수 있다. 이렇게 스키마를 활용하면 사용자 아이디에 해당하는 userId만 알아도 연결된 데이터인 email, nickname, lastLogin도 알 수 있게 된다.

 

레디스의 키

레디스는 하나의 키-값 데이터에 여러 키가 존재하는 것처럼 보인다. 때문에 스키마를 깊고, 넓게 만들게 되면 성능에 악영향을 주지 않을까 라는 우려가 생길 수도 있다.

 

다행인 점은 레디스의 스키마는 RDS의 로우의 숫자와 비슷하게 동작하지 않는다. 즉 성능에 영향을 주지 않는다.

 

RDS의 경우 탐색해야 하는 로우가 많아짐에 따라 검색 속도가 느려지다 보니 인덱스 로우, 프리머리 키(Primary Key), 포린 키(Foreign Key) 등을 설정해 사용한다. 반면 레디스는 O(1)의 수행 시간을 가지고, 많은 키(100,000,000,000) 건 적은 키(1) 건 스키마가 많건 적건 동일한 시간이 사용된다.

 

레디스 유의사항

레디스는 한 번 생성한 키를 선택적으로 삭제하기 어렵다. 키가 영원히 쌓이는 방식이다. 특별한 조치를 하지 않으면 레디스의 키는 삭제가 아닌 보관되며 심지어 서버를 종료했다가 다시 켜도 상태가 유지된다.

 

레디스 키 삭제

레디스 키를 삭제하는 방법은 크게 3가지다.

 

1. 일괄 삭제

FLUSHDB 명령어를 통해 모든 키를 파괴한다. 복구가 불가능하며 보통 개발 수준에서 사용한다.

 

2. 일정 시간 이후 삭제

각각의 키를 저장할 때 셋에 저장해 특정 시간이나 조건에 따라 삭제하는 방법

이 방법은 실제 삭제를 사용한다기 보단 밀어내기를 한다고 이해하면 편하다.

셋은 하나의 키에 대해 여러 번 등록을 해도 하나의 데이터만 남게 된다. 이러한 특징과 더불어 셋은 교집합, 차집합, 합집합 같은 기능을 제공한다. 이러한 두 가지 특징을 활용해 교차되는 키만 남기거나 뺀 연산을 적용해 키를 삭제할 수 있다.

 

3. 기간 만료 후 삭제

가장 많이 사용되는 방법이다. 키를 추적할 필요도 없고, 쉽게 관리할 수 있다. 이 방식을 사용할 때는 키-값을 SET 커맨드로 저장해 EXPIRE 커맨드로 기간 만료 시간을 정하는 방법을 사용한다. 또는 레디스 버전 2.0.0 이상을 사용할 때 SETEX 커맨드를 사용하는 방법이 있다. SETEX 방법은 SETEXPIRE를 합친 것과 같다고 보면 된다.

 

중요한 이유

1. 캐시

2. 싱글 스레드 -> 정합성, 내부 동기화 지원

 

 

참고:

https://ko.wikipedia.org/wiki/%EB%A0%88%EB%94%94%EC%8A%A4

https://brunch.co.kr/@skykamja24/575