본문 바로가기

TIL(Today I Learned)

Redis란 무엇일까?

 📌 NoSQL의 종류

  • 서로 연관된 그래프 형식의 데이터를 저장할 수 있는 Graph Store
  • Row가 아닌 Column 위주로 데이터를 저장하는 Column Store
  • 비정형 대량 데이터를 저장하기 위한 Document Store
  • 메모리 기반으로 빠르게 데이터를 읽어올 수 있는 Key-Value Store

 이 중 Redis는 Key-Value Store 중 하나이다.

 

📌 Redis(Remote Dictionary Server)

  • 'key-value' 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈소스 기반의 비관계형 데이터베이스 관리 시스템
  • 다양한 in-memory 데이터 구조 집합을 제공하므로 다양한 사용자 정의 애플리케이션을 손쉽게 생성할 수 있다.
  • 주요 사용 사례 : 캐싱, 세션 관리, pub-sub 및 순위표

 

redis는 인 메모리 데이터베이스이다. 즉, 모든 데이터를 메모리에 저장하고 조회한다. 기존 관계형 데이터베이스보다 훨씬 빠른데 그 이유는 메모리 접근이 디스크 접근보다 빠르기 때문이다. 하지만 빠르다는 것은 redis의 여러 특징 중 일부분이다. 다른 인메모리 데이터베이스와의 가장 큰 차이점은 다양한 자료구조를 지원한다는 것이다. redis는 다양한 자료구조를 Key-Value형태로 저장한다.

 

📍 데이터 모델

redis는 String뿐만 아니라 자료구조의 추상적 자료형도 지원한다.

- 문자열의 리스트, 문자열의 집합, 문자열의 정렬된 집합, key-value가 string인 hash

 

📍 장점

1. 빠른 성능

데이터를 디스크 또는 SSD에 저장하는 대부분의 데이터베이스 관리 시스템과는 달리 모든 redis 데이터는 서버의 주메모리에 상주한다. redis와 같은 인메모리 데이터메이스는 디스크에 액세스해야 할 필요를 없앰으로써 검색 시간으로 인한 지연을 방지하고 CPU 명령을 적게 사용하는 좀 더 간단한 알고리즘으로 데이터에 액세스할 수 있다. 일반적으로 작업을 실행하는 데 1밀리초 미만이 소요된다.

 

2. 인 메모리 데이터 구조

redis를 사용하면 사용자가 다양한 데이터 유형에 매핑되는 키를 저장할 수 있다. 기본적인 데이터 유형을 String으로서, 텍스트 또는 이진 데이터가 이에 해당하며 최대 크기는 512MB이다. 또한, redis는 문자열이 추가된 순서대로 유지되는 Lists of Strings, Sets of unordered Strings, 점수에 따라 정렬되는 Sorted Sets, 필드와 값 목록을 저장하는 Hashes, 데이터 세트에서 고유한 항복을 세는 HyperLogLogs를 지원한다. 거의 모든 유형의 데이터가 Redis를 사용하여 인 메모리에 저장될 수 있다.

 

3. 다양성과 사용 편의성

Redis는 개발과 운영을 좀 더 쉽고 좀 더 빠르게 수행할 수 있는 여러가지 도구를 제공한다. Pub-Sub는 메시지를 채널에 게시하며, 채널에서 구독자에게 전달된다. 채팅과 메시징 시스템에 매우 적합하다. TTL 키는 해당 기간 후에는 스스로를 삭제하는 지정된 Time To Live 값을 가질 수 있다. 데이터베이스를 불필요한 데이터로 채우지 않도록 하는 데 유용하다. 원자성 카운터는 경합 상태가 일관성 없는 결과를 생성하지 않도록 한다. Lua는 강력하지만 간단한 스크립팅 언어이다.

 

4. 복제 및 지속성

Redis는 마스터-슬레이브 아키텍처를 사용하며 비동기식 복제를 지원하여 데이터가 여러 슬레이브 서버에 복제될 수 있다. 이렇게 하면 주 서버에 장애가 발생하는 경우 요청이 여러 서버로 분산될 수 있으므로 향상된 읽기 성능과 복구 기능을 모두 제공할 수 있다.

Redis는 안정성을 제공하기 위해 특정 시점 스냅샷과 데이터가 변경될 때마다 이를 디스크에 저장하는 Append Only File(AOF) 생성을 모두 지원한다. 두 방법 모두 장애 발생 시 Redis 데이터를 신속하게 복원할 수 있다.

 

5. 선호하는 개발 언어 지원

Redis 개발자는 백개가 넘는 오픈 소스 클라이언트를 사용할 수 있으며, Java, Python, PHP, C, C++, C#, JacaScript, Node.js, Ruby, R, Go를 비롯한 다수의 언어가 지원된다.

 

 

📍 사용 사례

1. 캐싱

다른 데이터베이스 앞에 배치된 Redis는 성능이 뛰어난 인 메모리 캐시를 생성하여 액세스 지연 시간을 줄이고, 처리량을 늘리며, 관계형 또는 NoSQL 데이터베이스의 부담을 줄여준다.

 

2. 세션관리

Redis를 세션 키에 대한 적절한 TTL과 함께 빠른 키 값 스토어로 사용하면 간단하게 세션 정보를 관리할 수 있다. 세션 관리는 주로 게임, 전자 상거래 웹 사이트, 소셜 미디어 플랫폼을 비롯한 온라인 애플리케이션에 필요하다.

 

3. 실시간 순위표

Redis Sorted Set 데이터 구조를 사용하면 요소가 목록에 유지되고 점수에 따라 정렬된다. 이를 통해 손쉽게 동적 순위표를 생성하여 게임에서 앞서있는 사람이 누구인지 보여주거나, 좋아요를 가장 많이 받은 메시지를 게시하거나, 선두에 있는 사람이 누구인지 보여주려는 다양한 사례에 사용할 수 있다.

 

4. 속도 제한

Redis는 이벤트 속도를 측정하고 필요한 경우 제한할 수 있다. 클라이언트의 API 키에 연결된 Redis 카운터를 사용하여 특정 기간 동안 액세스 요청의 수를 세고 한도가 초과되는 경우 조치를 취할 수 있다. 속도 제한기는 포럼의 게시물 수를 제한하고, 리소스 사용량을 제한하며, 스패머의 영향을 억제하는 데 주로 사용된다.

 

5. 대기열

Redis List 데이터 구조를 사용하면 간단한 영구 대기열을 손쉽게 구현할 수 있다. Redis List는 자동 작업 및 차단 기능을 제공하므로 신뢰할 수 있는 메시지 브로커 또는 순환 목록이 필요한 다양한 애플리케이션에 적합하다.

 

6. 채팅 및 메시징

Redis에서는 패턴 매칭과 더불어 Pub-Sub 표준을 지원한다. 따라서 Redis를 사용하여 고성능 채팅방, 실시간 코멘트 스트림 및 서버 상호 통신을 지원할 수 있다. 또한 Pub-Sub를 사용하여 게시된 이벤트를 기반으로 작업을 트리거할 수 있다.

 

📍 Expire 기능

redis는 인메모리 데이터베이스인만큼, 메모리에 저장될 수 있는 데이터는 한정적이다. 더이상 메모리에 데이터를 저장할 수 없는 경우 redis에서는 가장 먼저 들어온 데이터를 삭제하거나, 가장 최근에 사용되지 않은 데이터를 삭제하거나, 혹은 더 이상 데이터를 입력받지 못하게 된다.

가장 좋은 방법은 삭제되는 데이터를 redis에게 맡기지 않고, 직접 설정하는 것이다. 해당 데이터를 입력할때 이 데이터의 사용 기한이 언제까지인지를 직접 설정해 줌으로서, 어플리케이션이 직접 데이터의 사용 만료 시간을 정할 수 있다. 간단히 key에 대한 timeout을 설정하는 것이다. 설정된 timeout 시간이 경과하면 key에 대해 DEL 명령어를 호출한 것처럼 key가 자동으로 삭제된다. 몇초 뒤에 삭제되어야 한다고 남은 시간값을 이용하거나, 혹은 유닉스의 timestamp를 사용해서 삭제되어야 하는 시각을 설정할 수도 있다.

 

 

 

 

 

 

 

 

 

 

References :

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

https://aws.amazon.com/ko/elasticache/what-is-redis/

https://aws.amazon.com/ko/redis/

https://redis.io/

https://meetup.nhncloud.com/posts/224

https://sihyung92.oopy.io/database/redis/1

https://www.ibm.com/kr-ko/topics/redis