CS

[CS] Redis 사용이유, 자료구조 살펴보기

육빔 2024. 8. 24. 21:17
728x90
반응형

왜 요즘 사람들이 nosql을 사용할까? 또 그중에서 Redis를 왜 많이 사용하는 걸까?라는 의문이 들었고 그 이유를 찾아보았다.

 

 

Redis는 "Remote Dictionary Server"의 약자로, 고성능의 오픈 소스 인메모리 데이터 구조 저장소입니다. 주로 캐시, 메시지 브로커, 데이터베이스로 사용되며, 다양한 데이터 구조를 지원합니다. Redis는 데이터를 메모리에 저장하여 매우 빠른 응답 시간을 제공하는 것이 특징

 

사용이유는 아래와 같다.

초고속 성능

  • 메모리 기반: Redis는 데이터를 메모리에 저장하기 때문에 매우 빠른 읽기 및 쓰기 성능을 제공합니다. 대부분의 명령은 밀리초 이하의 응답 시간을 가집니다.
  • 낮은 지연 시간: 애플리케이션의 성능을 크게 향상시킬 수 있어, 실시간 애플리케이션에서 특히 유용합니다.

 

운영체제 메모리 계층

 

레지스터 > 캐시 > 주기억장치 > 보조기억장치 

 

일반적으로 위 순서대로 속도가 빠른 대신 용량이 적어지게 된다. 우리가 사용하는 RDBS(Mysql, Postgresql)같은 경우는 보조기억장치에 해당되고 Redis같은 경우는 주기억장치(RAM)에 해당되게 된다. 좀 더 빠른 메모리를 사용함으로서 시간을 훨씬 단축할 수 있게 된다.

확장성

  • 클러스터링 지원: Redis는 클러스터 모드로 설정하여 수평 확장이 가능합니다. 이는 대규모 트래픽과 데이터를 처리할 수 있도록 합니다.
  • 복제 기능: 데이터의 가용성과 안정성을 높이기 위해 마스터-슬레이브 복제를 지원합니다.

 

요즘같이 MSA 아키텍쳐를 중요시하고 모듈화를 중요시하는 시대에 필요한 DB라고 한다.

캐싱

  • 효율적인 캐시 솔루션: Redis는 자주 사용되는 데이터를 메모리에 캐시하여 데이터베이스 부하를 줄이고 애플리케이션의 성능을 높일 수 있습니다.
  • TTL 지원: 각 키에 TTL(Time to Live)을 설정하여 자동으로 만료시키는 기능이 있어, 캐시 데이터의 자동 관리가 가능합니다.

 

TTL기능은 다른 db에는 없는데 Redis에서는 가능하여 지속적으로 저장할 필요가 없는 데이터를 다룰 때 주로 사용합니다. 캐싱 전략에는 3가지 정도 있는데 다음 포스트에서 작성하겠습니다.

데이터 지속성

  • RDB와 AOF: 메모리 기반 데이터베이스이지만, RDB(snapshot) 및 AOF(Append-Only File) 방식을 통해 데이터를 디스크에 저장하여 데이터의 영속성을 보장할 수 있습니다.
  • 복구 기능: 서버 재시작 시 데이터를 복구할 수 있어 안정성을 높입니다.

실시간 분석 및 처리

  • 실시간 데이터 분석: 빠른 데이터 처리 능력 덕분에 실시간 분석, 로깅, 메시지 큐 등 실시간 데이터 처리 시스템에 적합합니다.
  • 스트림 처리: Redis Streams를 사용하여 실시간 데이터 스트림을 관리하고 처리할 수 있습니다.

이렇게 특징을 알아봤고, Redis를 사용하기 전 공부를 하고자 기본적인 자료구조를 살펴보자. 사실 처음에는 해시 자료형만 존재하는줄 알았는데 다양한 자료구조가 존재했다.

 

1. Strings (문자열)

  • 설명: Redis에서 가장 기본적인 자료구조입니다. 문자열은 최대 512MB 크기의 데이터를 저장할 수 있습니다.
  • 예시: SET key "value", GET key
  • 사용 예: 캐시, 간단한 카운터, 토큰 저장 등

2. Hashes (해시)

  • 설명: 필드-값 쌍으로 구성된 집합입니다. 작은 크기의 데이터, 특히 객체나 구조체와 유사한 데이터를 저장할 때 유용합니다.
  • 예시: HSET user:1000 name "John" age "30", HGETALL user:1000
  • 사용 예: 사용자 프로필 정보, 설정 저장

3. Lists (리스트)

  • 설명: 순서가 있는 문자열의 컬렉션입니다. 리스트는 삽입 및 삭제가 매우 빠르며, 양쪽에서 삽입과 삭제가 가능합니다.
  • 예시: LPUSH mylist "value1", RPUSH mylist "value2", LPOP mylist, LRANGE mylist 0 -1
  • 사용 예: 대기열, 작업 스케줄링, 간단한 메시지 큐

4. Sets (집합)

  • 설명: 중복을 허용하지 않는 유일한 문자열의 집합입니다. 집합 연산(교집합, 합집합, 차집합)을 지원합니다.
  • 예시: SADD myset "value1", SISMEMBER myset "value1", SMEMBERS myset
  • 사용 예: 태그 저장, 팔로워 목록, 유일한 항목 컬렉션

5. Sorted Sets (정렬된 집합)

  • 설명: 값에 점수(score)가 부여되어 자동으로 정렬되는 집합입니다. 점수를 기준으로 데이터가 정렬됩니다.
  • 예시: ZADD myzset 1 "value1", ZADD myzset 2 "value2", ZRANGE myzset 0 -1 WITHSCORES
  • 사용 예: 리더보드, 순위 시스템, 시간 기반 이벤트 저장

6. Bitmaps (비트맵)

  • 설명: 비트를 저장하고 조작할 수 있는 자료구조입니다. 실제로는 문자열로 저장되지만, 비트 단위로 조작할 수 있습니다.
  • 예시: SETBIT mykey 7 1, GETBIT mykey 7
  • 사용 예: 사용자 활동 추적, 플래그 저장

7. HyperLogLog

  • 설명: 고유한 항목의 개수를 매우 적은 메모리로 추정할 수 있는 확률적 데이터 구조입니다.
  • 예시: PFADD myhll "value1", PFCOUNT myhll
  • 사용 예: 대규모의 고유한 IP 주소 수 추적, 웹사이트 방문자 수 추정

8. Geospatial Indexes (지리적 인덱스)

  • 설명: 지리적 좌표를 기반으로 데이터를 저장하고, 거리 계산 및 범위 검색을 지원합니다.
  • 예시: GEOADD locations 13.361389 38.115556 "Palermo", GEORADIUS locations 15 37 200 km
  • 사용 예: 위치 기반 서비스, 근접 검색

 

728x90
반응형