데이터베이스 - Redis 타입 살펴보기

2024. 9. 5. 17:38데이터베이스/REDIS

2024/09/05

 

※   Redis의 다양한 데이터타입을 알아보고 각 데이터타입의 사용 사례를 살펴보자.

 

 

출처: https://phoenixnap.com/kb/wp-content/uploads/2021/04/1_redis-data-types-explained-768x385.png

 

 

 

   ▶  Redi에 데이터 넣기

💡 Redis를 설치하고 성공적으로 연결했다면, 이제 데이터를 저장해보자.


       ●  Redis는 앞서 설명한것 처럼 Key - Value 데이터베이스다.
       ●  대부분의 명령이 Key를 바탕으로 동작하게 되며, Value로 사용하고자 하는 자료형에 따라 다른 명령어를 사용하게 된다.
       ●  또한 대부분의 명령이 존재하지 않는 Key를 이용해도 정상적으로 동작하며, 없는 Key에 데이터를 저장하면 Key를 생성한다.
          👉  단, 이미 만든 Key에 해당하는 데이터와 다른 자료형의 명령을 사용하는 경우 오류가 발생할 수 있다.

 

      ✅ String
              가장 기본적인 자료형이며, Redis가 Java의  Map<String, String> 처럼 동작한다고 생각하면서 접근하면 편하다. 
               저장할 수 있는 최대 크기는 512MB다.

        📍 GET, SET
                 ▪   만약 저장된 데이터가 정수 데이터라면 데이터를 바로 증가, 감소가 가능히다.
        📍 INCR, DECR
                 ▪   여러 Key - Value를 한번에 다루고 싶다면  MSET MGET 을 활용할 수 있다.
        📍  MSET, MGET
                 ▪   단순 문자열이지만, 문자열은 결국 바이트 배열이다. 
                 ▪   그래서 이미지, 음성, 영상, 파일, 또는 이메일 본문 등도 보관이 가능하다. 
                 ▪   분산된 구조에서 비교적 큰 사이즈의 데이터를 주고받아야 하는 상황에 Key만 전달해서 데이터는 여기있다 전달하는 방식으로 활용할 수 있다.

 


      ✅  List
               여러 문자열 데이터를 Linked List의 형태로 보관하는 자료형이다. 
               Linked List이기 때문에, 중간의 데이터 보다는 양끝의 데이터, 즉 스택 또는 큐 처럼 사용할 수 있다.
               PUSH 또는 POP을 L 또는 R과 조합하여, 왼쪽 또는 오른쪽에 데이터를 추가 / 제거가 가능하다.

        📍  LPUSH, RPUSH, LPOP, RPOP
                 ▪   Redis는 Key - Value 형태로 저장하는걸 잊지 말자❗
                 ▪   즉  Map<String, List<String>> 의 형태로 사용한다고 생각하면 된다.
                 ▪   리스트를 사용하면서 흔히 사용하는 길이 구하기, 범위 내 원소 반환하기 등의 기능도 제공한다.
        📍  LLEN, LRANGE
                ▪   LLEN은 없는 Key를 대상으로 하면 0이 되지만, 다른 자료형을 저장한 Key를 대상으로 하면 오류가 발생한다. 
                ▪   LRANGE의 경우 (언제나 그렇듯) 시작을 0으로 생각하고,
                    1️⃣  end 가 실제 길이를 벗어나도 오류가 발생하진 않는다.
                    2️⃣  start > end 일 경우 빈 결과가 반환된다.
                    3️⃣ 음수의 경우 리스트의 뒤에서부터 데이터를 가져온다.
                ▪   리스트의 경우 소셜 네트워크에서 많이 사용하는 자료형이다. 
                ▪   대표적으로 X(구 트위터)가 List를 바탕으로 Timeline을 구성했다고 한다.

 

      ✅  Set
               문자열의 집합이다. 집합인 만큼 중복값을 제거하며, 순서가 존재하지 않는다.

        📍  SADD, SREM, SMEMBERS, SISMEMBER, SCARD
                ▪   여기에 복수의 집합이 있다면, 교집합, 합집합 등의 기능을 제공한다. 
                ▪   결과 집합 자체를 반환하기도, 결과 집합의 크기를 반환하기도 한다.
        📍  SINTER, SUNION, SINTERCARD
                ▪   중복을 허용하지 않으며, 어떤 데이터의 존재 여부를 확인하는  SISMEMBER 같은 경우 O(1)의 시간복잡도를 가지고 있다. 
                ▪   그래서 중복 없는 방문 수, 인증 토큰 블랙리스트 등을 구현할때 활용할 수 있다. 

❗단, 매우 높은 방문수를 기록하는 서비스의 경우 실제 데이터가 필요하지 않다면, 근사값을 돌려주는 확률형 자료형을 사용하는게 권장된다.

 


      ✅  Hash
               Field - Value 쌍으로 이뤄진 자료형이다. 
               Hash 데이터를 가져오기 위해 Key를 사용하고, 이후 다시 Key에 저장된 Hash 데이터에 Field - Value 쌍을 넣어주는 형식으로 동작한다. 
               즉, Redis 전체가  Map 이라면 Hash는  Map<String, Map<String, String>> 의 형식이라고 생각할 수 있다.

        📍 HSET, HGET, HMGET, HGETALL, HKEYS, HLEN
                ▪   Hash는 본래 하나의 키에 복잡한 데이터(객체의 데이터 라던지)를 하나의 키에 저장하는 용도로 주로 활용되고, 공식 문서에서도 여러 Key에 걸쳐 객체의 데이터를 표현하기 보단 Hash를 자주 활용할 것을 권장하고 있다.
                ▪   장바구니 같은 기능은 사용자별로, 어떤 물품이 몇개나 담겨있는지와 같은 정보가 포함되어야 한다.
                ▪   사용자 마다 Hash 데이터를 생성하고, 물품 - 갯수 형식으로 데이터를 저장하면 사용자별 장바구니를 쉽게 저장할 수 있다.

 


      ✅  Sorted Set
               이름처럼 정렬된 집합이다. 
               기본적으로 Set과 동일하게, 유일한 값들만 유지하지만 여기에 더해 각 값들에 score라고하는 실수를 함께 보관한다. 
               그리고 데이터를 가져올 때, score를 바탕으로 정렬하여 값들을 가져올 수 있다.

        📍  ZADD, ZINCRBY, ZRANK, ZRANGE, ZREVRANK, ZREVRANGE
                ▪   대표적으로 리더보드나 Rate Limiter, 즉 순위와 관련된 기능을 만드는데 사용된다.

💡 Rate Limiter란, API 등을 제공할 때 짧은 시간에 지나치게 많은 요청을 막기 위한 기능을 의미한다.

 

 

      ✅  그 외 공용 명령
                그 외 자료형과 상관없이 사용할 수 있는 명령들이 있다. 
                이 중 대표적으로 많이 사용하는 건, Key를 제거하기 위한 DEL, 만료시각 설정을 위한 EXPIRE 등이 있다.

        📍   DEL, EXPIRE, EXPIRETIME
                ▪    만약 저장된 모든 Key를 확인하고 싶다면, 

KEYS *

                ▪   을 사용할 수 있습니다. 이는 glob 패턴 형식을 전달하여, 패턴에 일치하는 키를 반환하는 메서드다.

💡 여기서  * 은 Linux 파일시스템 등에서 흔히 사용하는 Glob 패턴이며, *은 임의갯수의 글자를 대체하는 와일드카드다. 지금은 *만 있으므로, 모든 Key와 일치하는 패턴이기 때문에 모든 Key가 반환된다. 그 외 예시들이 공식문서에 있으며, 더 궁금하다면 검색을 해보자❗

    📌  keys 패턴 예시(공식 문서)
h?llo - hello, hallo, hxllo
h*llo - hllo, heeeello
h[ae]llo - hello, hallo (not hillo)
h[^e]llo - hallo, hbllo, ... (not hello)
h[a-b]llo - hallo, hbllo​

                ▪    마지막으로, 모든 Key를 제거하고 싶다면 FLUSHDB를 사용할 수 있다.

FLUSHDB