Redis에 대해 알아보자! - 자료구조편

coding_ticket·2024년 12월 6일

redis

목록 보기
1/2
post-thumbnail

Redis란 무엇인가?

서비스를 운영하다 보면 데이터는 지속적으로 쌓이게 됩니다. RDBMS는 데이터를 디스크에 저장하는 특성상, 데이터가 많아질수록 성능 저하의 한계에 도달할 수 있습니다.
이런 문제를 해결하기 위해, 메모리에 데이터를 저장하여 빠른 성능을 제공하는 Redis와 같은 NoSQL DB를 적용하는 방안을 고민하게 됩니다.


Redis 소개

  • Redis는 Key-Value 구조를 가진 저장소입니다.
  • 데이터를 메모리에 저장하는 In-Memory DB로, 빠른 성능을 제공합니다.
  • 싱글 쓰레드 기반입니다.
  • 다만 RAM 특성상 휘발성 메모리로 데이터 유실 가능성이 있습니다.

그렇다면 휘발성 DB인 Redis를 사용하는 이유는 무엇일까요?

많은 사용자가 동시에 서비스를 이용할 때 매번 하드디스크에 접근하면 속도가 느려지기 때문에, 자주 사용하는 데이터를 Redis에 저장(캐싱)하여 응답 속도를 개선할수 있습니다!


Redis의 특징

Redis가 In-Memory DB임은 위에서 살펴보았습니다. 하지만 In-Memory DB는 Redis외에도 Memcached가 존재합니다.

그렇다면 굳이 왜? Redis를 사용할까요? 그 이유는 다양한 자료구조를 지원하는 Redis만의 특징에 있다고 생각합니다.


1. String

Redis의 기본적인 자료구조로, 문자열 데이터를 저장하며 이진 데이터를 포함한 모든 데이터(JPEG 이미지, HTTP 응답값 등)를 저장할 수 있습니다.

Binary-safe란?
데이터 손실 없이 NULL 바이트를 포함한 모든 바이트 시퀀스를 저장하고 처리할 수 있는 방식입니다.

주요 명령어

SET/GET

SET [KEY] [VALUE]
GET [KEY]

예시

> SET hello world
OK
> GET hello
"world"
  • 이미 존재하는 키의 경우 새로운 값으로 덮어씌워집니다.
  • 이를 방지하려면 NX(존재하지 않을 때만 저장) 또는 XX(존재할 때만 저장) 옵션을 사용할 수 있습니다.

INCR, INCRBY
String 자료구조에 저장된 숫자를 원자적으로 조작할 수 있습니다.

예시

> SET counter 100
OK
> INCR counter
(integer) 101
> INCRBY counter 50
(integer) 151

MSET/MGET
한 번에 여러 키-값을 저장하거나 조회할 수 있어 네트워크 성능을 높일 수 있습니다.

예시

> MSET A 10 B 20 C 30
OK
> MGET A B C
1) "10"
2) "20"
3) "30"

2. List

List는 순서를 가지는 문자열 목록으로, 스택처럼 사용할 수 있습니다.

주요 명령어

LPUSH/RPUSH

  • LPUSH: 왼쪽에 데이터 추가
  • RPUSH: 오른쪽에 데이터 추가

예시

> LPUSH mylist A B C
(integer) 3
> RPUSH mylist D
(integer) 4

LRANGE
리스트의 특정 범위 데이터를 조회할 수 있습니다.

예시

> LRANGE mylist 0 -1
1) "C"
2) "B"
3) "A"
4) "D"

LTRIM
리스트 데이터를 범위만큼 유지하며, 나머지는 삭제합니다.

> LTRIM mylist 0 1
OK

> LRANGE mylist 0 -1
"A"
"D"

LPUSH와 LTRIM을 함께사용하면 고정된 길이의 큐를 쉽게 유지 가능합니다. 따라서 제한된 저장공간을 유지해야하는 경우(EX. 로그데이터) LPUSH와 LTRIM을 이용해 처리하는 것이 효율적입니다.(시간복잡도 O(1))


3. Hash

Hash는 필드-값 쌍을 저장할 수 있어 RDBMS의 테이블 데이터와 유사합니다.

주요 명령어

  1. HSET/HGET/HGETALL
  • HSET: 필드-값 쌍 저장
  • HGET: 특정 필드 값 조회
  • HGETALL: 모든 필드-값 조회

예시

> HSET Product:123 Name "Track Ball" Price 300
(integer) 2
> HGET Product:123 Name
"Track Ball"
> HGETALL Product:123
1) "Name"
2) "Track Ball"
3) "Price"
4) "300"

4. Set

중복 없는 데이터 집합을 저장하며, 집합 연산(교집합, 합집합, 차집합)을 지원합니다.

주요 명령어

  1. SADD: 데이터 추가
> SADD myset A B C
(integer) 3
  1. SUNION/SINTER/SDIFF: 집합 연산
> SUNION set1 set2
"apple", "banana", "cherry"
> SINTER set1 set2
"banana"
> SDIFF set1 set2
"apple"

5. Sorted Set

Sorted Set은 스코어에 따라 정렬된 데이터를 저장합니다.

주요 명령어

  1. ZADD: 스코어-값 쌍 저장
> ZADD leaderboard 100 user1 200 user2
(integer) 2
  1. ZRANGE: 범위 내 데이터를 조회
> ZRANGE leaderboard 0 -1 WITHSCORES
1) "user1"
2) "100"
3) "user2"
4) "200"

점수에 따라 유일한 key값이 정렬된 상태로 저장되기 때문에 랭킹 시스템과 같은 서비스에서 유용하게 사용될수 있다!


주의할 명령어

1. KEYS

모든 키를 조회하는 명령어로, 데이터가 많을 경우 서버가 차단(Block) 될 수 있어 사용에 주의가 필요합니다.

2. SCAN

KEYS 명령어를 대체한 명령어로, 데이터 조회를 범위로 제한할 수 있어 비교적 안전합니다.


Redis 활용 정리

Redis는 캐싱, 세션 저장, 실시간 데이터 처리 등 다양한 목적으로 활용될 수 있습니다. 또한, 지원하는 자료구조가 다양하여 상황에 맞게 유연하게 사용할 수 있다는 점에서 많은 사랑을 받고 있습니다.🚀

참고자료
개발자를 위한 레디스
redis 공식문서

0개의 댓글