본문 바로가기
Study OR Book/실전 레디스

[실전 레디스] Chaprter 02_자료형과 기능

by Baest 2025. 5. 27.

 

대표 자료형의 특징과 유스케이스, 명령어의 실행 예시를 비교해서 설명하고 있는 챕터이다.

 

 

2.1 자료형 기능 개요

다섯 가지 자료형

- 레디스의 주요 자료형에는 String, List, Hash, Set, Sorted Set이 존재한다.

- 자료형의 특징은 아래 표를 통해 확인 가능하다.

 

보조 자료형

위에서 언급한 다섯 가지 자료형 외 기본 자료형 내부에서 특정 용도에 사용될 목적으로 만들어진 보조 자료형이 있다.

  • 비트맵(비트 배열)
  • 지리적 공간 인덱스

그리고 데이터를 어떻게 활용할 것인가 라는 관점에서는 아래와 같이 데이터를 직접 다루는 기능도 갖추고 있다.

  • Pub/Sub 기능
  • HyperLogLog
  • 레디스 스트림

 

레디스의 폭 넓은 데이터 모델 표현성

레디스는 전역에서 키와 값의 쌍으로 관리하며, RDBMS 테이블 같은 개념은 없다. RDBMS 데이터베이스 설계처럼 테이블 간 관계성 같은 데이터 관리 방식과는 차이가 있다.

 

다만 앞으로는 키 어노테이션이라는 기능을 통해 키 간 관계성도 레디스에서 다룰 수 있게 될 것이다.

키 간 독립성을 원칙으로 하여, 가능하면 이 원칙에 맞춰 데이터를 저장하는게 좋다. 하나의 키에 연관된 값들은 범위 내에서 서로 연관성을 가진 단위로 관리할 수 있다.

 

레디스 자료형과 명령어

레디스는 자료형 마다 명령어가 다르고, 다른 자료형 관련 명령어는 사용할 수 없다.

 

예를 들어 String형인 경우 SET으로 저장하고 GET으로 가져온다.

하지만 Hash형에서는 HSET을 사용해서 USER라는 키에 데이터를 저장해도 GET을 사용할 수 없다.

 

여러 키를 동시에 조작할 수 있는 명령어도 있는데, String형에서는 MSET과 MGET 명령어를 사용할 수 있고, 원자적으로 처리된다.

 

레디스의 유틸리티 명령어

위에서 자료형에 대한 명령어를 이야기했다면, 이번에는 디버그 등의 용도로 많이 사요되는 명령어에 대해 알아보고자 한다.

  • KEYS
    - 키 목록 확인
    - KEYS pattern과 함께 사용하여, 검색 대상 제한이 가능하다.
    - KEYS 명령어는 시간이 오래 걸려서 운용 중인 애플리케이션에서 쉽게 사용해서는 안된다.
    - 운용 환경인 경우 SCAN 계열 명령어를 사용하는 것이 좋다.

  • EXISTS
    - 키 존재 여부 확인
    - 키가 존재하면 1을, 존재하지 않으면 0을 반환한다.

  • TYPE
    - 자료형과 기능 확인

  • DEL
    - 모든 자료형에서 공통적으로 사용 할 수 있는 삭제 명령어
    - 반환되는 값은 삭제한 키의 개수이다.

 

2.2 String형

String 타입은 이미 아는 것과 같이 문자열 데이터를 저장하는 타입이다.

문자열에는 문자, 숫자, 공백, 특수 문자 등 모든 종류의 문자를 포함할 수 있다.

String 타입은 캐싱, 세션 관리, 카운터, 설정 관리 등 다양한 용도로 사용 가능하며 , 빠른 읽기 및 쓰기 성능을 제공한다.

 

주로 사용하는 명령어는 아래와 같다.

 

  • SET key value: 주어진 key에 문자열 값을 저장
  • GET key: 주어진 key에 대한 문자열 값을 반환
  • DEL key [key …]: 하나 이상의 key와 연결된 값을 삭제

 

  • APPEND key value: 주어진 key에 저장된 문자열 끝에 추가 문자열 붙임
  • STRLEN key: 주어진 key에 저장된 문자열 길이를 반환
  • SETEX key seconds value: 주어진 key에 문자열 값을 저장하고 만료 시간(초) 설정 (key와 value가 모두 삭제)
  • GETSET key value: 주어진 key에 저장된 이전 값을 가져오고 새로운 값 설정

 

 

그 외 String형에서 값이 숫자인 경우만 사용할 수 있는 명령어들(INCR, DECR 등)이 있다.

 

  • INCRBY key increment: 주어진 key에 저장된 숫자 값을 주어진 increment 만큼 증가
  • DECRBY key decrement: 주어진 key에 저장된 숫자 값을 주어진 decrement 만큼 감소

 

2.2 List형

List 타입은 순서가 있는 데이터의 컬렉션을 저장하는데 사용한다.

중복값을 허용하고, 양쪽 끝에서 데이터를 추가하거나 제거할 수 있는 유연한 구조를 제공한다.

 

큐(Queue), 스택(Stack), 메세지 큐(Message Queue) 등의 용도로 활용할 수 있는데, List를 사용하면 다음의 작업 수행이 가능하다.

 

  1. 메세지 큐: 메세지 브로커로 활용해서 비동기 작업 및 이벤트 처리
  2. 최신 업데이트 추적: 최신 활동을 추적하고 뉴스 피드, 타임라인, 활동 스트림
  3. 작업 큐: 백그라운드에서 작업을 처리하고 스케줄링하여 시스템 부하 최소화
  4. 순서가 있는 데이터 저장: 주문 목록, 로그, 히스토리 등 순서가 중요한 데이터 저장

 

주요 명령어는 LPOP, RPUSH와 같은 명령어이며, 데이터 추가 및 제거 시 데이터가 순차적으로 관리된다.

List 메모리 내부에서 데이터를 저장하기 때문에 데이터 읽기 쓰기가 빠르고, 여러 클라이언트 데이터를 공유할 유용하다.

 

2.4 Hash형

Hash 타입은 필드-값 쌍을 저장하는 해시 맵 구조를 제공한다. 

필드-값 쌍은 문자열 키를 기반으로 저장된다. 

Hash 타입은 데이터를 구조화하고, 필드 수준에서 읽고 쓰는 작업을 효과적으로 처리할 때 유용하며, 개발 필드를 업데이트하거나 조회할 때 빠른 성능을 제공한다. 

 

Hash 타입이 필드 수준에서 읽고 쓰는 작업이 효과적인 이유는 

1) 복잡한 데이터 구조 표현이 가능하여 데이터를 조직적으로 저장하고 관리할 수 있고 

2) 필드 단위로 값을 수정할 수 있어서 전체 데이터를 업데이트하지 않고 필요한 특정 필드만 수정할 수 있기 때문이다.

 

주로 사용되는 명령어는 아래와 같다.

  • HSET key field value [field value …]: 특정 해시 맵에 하나 이상의 필드와 값을 설정
  • HGET key field: 특정 해시 맵에서 지정한 필드의 값을 반환
  • HDEL key field [field …]: 특정 해시 맵에서 하나 이상의 필드를 제거
  • HEXISTS key field: 특정 해시 맵에서 특정 필드가 존재하는지 여부 확인
  • HGETALL key: 특정 해시 맵의 모든 필드와 값의 쌍을 반환
  • HKEYS key: 특정 해시 맵의 모든 필드를 반환
  • HVLAS key: 특정 해시 맵의 모든 값을 반환
  • HLEN key: 특정 해시 맵의 필드 수를 반환
  • HINCRBY key field increment: 필드의 값을 증가 시킴 (int 타입에서 사용 가능)
  • HMSET key field value [field value…]: 특정 해시 맵에 여러 개의 필드와 값을 한번에 설정
  • HSETNX key field value: 특정 해시 맵에 필드가 존재하지 않을 때만 값 설정

 

2.5 Set형

 

Set은 List와 마찬가지로 복수의 데이터를 관리하는 추상 자료형이다.

이 둘의 차이는 순서 보장 여부 및 중복 허용 여부에 있다.

 

List는 각 요소의 순서가 보장되고, 중복을 허용한다. 특정 위치에 값을 저장하고, 이 위치 정보를 활용하여 리스트의 값들에 접근할 수 있다.

리스트 내 다른 위치에 동일한 값을 중복으로 저장하는 것도 가능하다. 단점은 특정 값의 리스트 존재 여부를 판단할 때 시간이 소요될 수 있다.

 

Set은 순서가 보장되지 않고, 중복을 허용하지 않는다. 기본적으로 Set의 모든 요소를 순회했을 때 어떤 순서로 값들이 조회될지 보장할 수 없다.

이미 Set에 추가된 값을 중복으로 추가하는 경우 아무런 변화가 없다.

이 경우 해당 Set에 특정 값이 존재하는지의 여부를 판단하는 contains 연산의 성능을 높이는 방식으로 구현한다.

 

그래서!

 

레디스에서의 Set도 위와 같은 집합 자료구조로 순서가 보장되지 않는 고유한 문자열들의 컬렉션이다.

이때 이 고유한 문자열 하나를 멤버라고 부른다.

 

레디스 Set을 활용하여, 아래와 같은 작업들이 가능하다.

 

1. 고유한 값들의 관리: IP 목록 등 데이터를 중복 없이 관리

2. 관계 표현: 역할에 따른 사용자들의 목록 분류

3. 일반적인 집합 관계 연산 수행: 교집합, 합집합, 차집합 등

 

  • SADD: 집합에 새로운 멤버 추가. 이미 집합에 존재하는 멤버의 경우 변화 없음
  • SREM: 집합에서 멤버 제거
  • SISMEMBER: 특정 문자열이 집합에 존재하는지 여부 반환
  • SINTER: 교집합 연산
  • SCARD: 카디널리티. 집합의 크기 반환

 

레디스 Set의 최대 크기는 2^32 - 1이며, 최대 4,294,967,295가지 멤버들이 집합에 포함될 수 있다.

대부분의 Set 연산은 O(1)으로 굉장히 효율적인데, 한 가지 주의 사항이 있다.

하나의 응답에 전체 조회를 하는 SMEMBERS의 경우 O(N)이므로 주의해야한다.

모든 멤버 조회가 필요한 경우 개별 멤버를 순회하는 방식인 SSCAN을 고려하는 것이 좋다.

 

만약 정확도를 희생하고 메모리 사용량을 줄이고 싶다면, 레디스 Set 외 Bloom Filter나 Cuckoo Filter를 고려해 보는 것도 좋다.

 

2.6 Sorted Set형

Sorted Set(=ZSET)은 Set과 Hash가 혼합된 타입이다.

하나의 key에 score와 value로 구성되며, Score 기준으로 정렬이 가능한 형태이다.

value는 score로 sort되며 score가 같으면 value로 sort된다.

참고로 score는 부동 소수점 수만 허용된다고 한다.

 

일반적으로 사용되는 명령어는 아래와 같다.

  • ZADD: key에 value, score를 추가
  • ZRANGE: key의 index range를 이용해 ELEMENTS를 반환하며, WITHSCORE 명시할 경우 score 같이 반환
  • ZCARD: key ELEMENT의 개수를 반환
  • ZREM: key의 ELEMENT를 제거
  • ZSCORE: key의 ELEMENT의 score 값을 반환
  • ZRANK: key에서 ELEMENT의 score 순위를 반환
  • ZREVRANK: key에서 ELEMENT의 score 역순위를 반환

 

2.7 대표 기능과 관련 명령어

2.7.1 비트맵

Bitmap은 실제 자료 구조가 아니라 문자열을 비트 벡터처럼 다룰 수 있도록 하는 자료구조이다.

가장 큰 장점 중 하나는 정보를 저장할 때 공간을 매우 크게 절약할 수 있다는 점이다. 예를 들면 사용자가 Auto Increment 되는 ID를 사용할 때 512MB의 메모리를 통해 최대 40억명의 단일 정보를 저장할 수 있다.

 

주요 명령어는 아래와 같다.

  • SETBIT: 주어진 offset(문자열)의 비트를 0 또는 1로 설정
  • GETBIT: 주어진 offset(문자열)의 비트를 반환

활용 예시

1) 웹 사이트에서 사용자의 일일 최장 방문 일수 구하기

- BITCOUNT를 통해 멤버의 총 방문 일 수를 구할 수 있다.

- 이후 클라이언트 측으로 비트맵을 가져와서 연속으로 1이 반복되는 최장 개수를 구하면 된다.

 

 

2.7.2 지리적 공간 인덱스

지리적 공간 인덱스를 사용하면 좌표를 저장하고 검색할 수 있다.

해당 자료구조는 지정된 반경, 경계에서 가까운 지점을 찾는 용도로 유용하다.

 

활용 예시

1) 웹 사이트에서 사용자의 현재 위치를 기반으로 반경 5km 내의 특정 장소를 가까운 순으로 찾기