blog

Redis, 일반적인 스토리지 유형 및 비즈니스에서 선택하는 방법

Redis의 일반적인 저장소 유형 1. 문자열 Redis의 문자열은 문자열 값을 저장하고 검색하는 데 사용되는 기본 데이터 유형입니다. 사용 사례: 사용자 이름, 이메일 주소, 페...

Oct 29, 2025 · 6 min. read
シェア

일반적인 Redis 스토리지 유형

문자열

Redis의 String은 문자열 값을 저장하고 검색하는 데 사용되는 기본 데이터 유형입니다.

  • 사용 사례: 사용자 이름, 이메일 주소, 페이지 카운터와 같은 텍스트나 숫자를 저장하는 데 적합합니다. 문자열 유형은 바이너리 데이터도 저장할 수 있으므로 이미지나 직렬화된 객체를 저장하는 데 사용할 수 있습니다.

  • 장점: 조작이 간단하고 증분과 같은 원자 연산을 수행할 수 있습니다.

    // 문자열 저장
    let _: () = conn.set("username", "alice").await.unwrap();
    // 문자열 가져오기
    let username: String = conn.get("username").await.unwrap();
    

List

Redis 목록은 삽입 순서대로 정렬된 문자열 모음입니다.

  • 사용 사례: 메시지 대기열, 활동 로그, 최근에 방문한 항목 목록 등을 구현하는 데 적합합니다. 목록은 양쪽 끝에서 요소를 추가하거나 제거할 수 있으며 스택 또는 대기열로 사용할 수 있습니다.

  • 장점: 빠른 삽입 및 삭제 작업을 제공합니다. FIFO 큐 또는 LIFO 스택으로 사용할 수 있습니다.

    // 목록 헤더에 요소 추가하기
    let _: () = conn.lpush("events", "login").await.unwrap();
    let _: () = conn.lpush("events", "logout").await.unwrap();
    // 목록 요소 가져오기
    let events: Vec<String> = conn.lrange("events", 0, -1).await.unwrap();
    

컬렉션

세트는 고유한 문자열의 정렬되지 않은 모음입니다.

  • 사용 사례: 태그, 방문한 IP 주소 또는 소셜 네트워크의 친구 목록과 같은 고유한 요소를 특별한 순서 없이 저장하는 경우.

  • 장점: 요소를 빠르게 추가, 삭제, 확인할 수 있을 뿐만 아니라 연결, 교차, 차이와 같은 세트 간 연산을 수행할 수 있습니다.

    // 컬렉션에 요소 추가하기
    let _: () = conn.sadd("tags", "redis").await.unwrap();
    let _: () = conn.sadd("tags", "database").await.unwrap();
    // 모든 컬렉션 멤버 가져오기
    let tags: Vec<String> = conn.smembers("tags").await.unwrap();
    

정렬된 컬렉션

정렬된 집합은 컬렉션과 비슷하지만 각 멤버에는 점수가 연관되어 있습니다.

  • 사용 사례: 순위표, 우선순위 대기열 또는 정렬 가중치가 있는 데이터 저장과 같이 점수별로 정렬해야 하는 데이터에 적합합니다.

  • 장점: 컬렉션의 기본 작업 외에도 점수 또는 사전 순서에 따라 요소를 검색할 수 있을 뿐만 아니라 특정 범위 내의 요소를 가져올 수 있습니다.

    // 정렬된 컬렉션에 요소 추가하기
    let _: () = conn.zadd("leaderboard", "alice", 100).await.unwrap();
    let _: () = conn.zadd("leaderboard", "bob", 200).await.unwrap();
    // 정렬된 컬렉션 요소 가져오기
    let leaderboard: Vec<(String, f64)> = conn.zrange_withscores("leaderboard", 0, -1).await.unwrap();
    

Hash

해시는 프로그래밍 언어의 사전이나 객체와 유사한 키-값 쌍의 모음입니다.

  • 사용 사례: 객체 또는 사용자의 여러 속성과 같은 여러 관련 데이터 포인트를 저장하는 데 사용됩니다.

  • 장점: 한 번에 여러 필드를 읽거나 쓸 수 있어 객체를 표현하거나 여러 데이터 포인트를 집계하는 데 매우 효과적입니다.

    // 해시에 키-값 쌍 추가하기
    let _: () = conn.hset("user:100", email", "[alice@example.com]()").await.unwrap();
    // 해시의 모든 키-값 쌍 가져오기
    let user_info: HashMap<String, String> =conn.hgetall("user:100").await.unwrap();
    

비트맵

비트맵은 비트의 배열로, 각 비트는 독립적으로 설정하거나 쿼리할 수 있습니다.

  • 사용 사례: 사용자 체크인, 특정 기능의 켜짐/꺼짐 상태와 같이 유무에 대한 라벨링이 필요한 시나리오에 적합합니다.

  • 장점: 매우 공간 효율적이며 많은 수의 부울 값으로 작업하는 데 적합합니다.

    // 비트맵에서 비트 설정하기
    let _: () = conn.setbit("features", 0, true).await.unwrap(); // 함수 0 활성화
    // 비트맵에서 비트값 가져오기
    let feature_enabled: bool = conn.getbit("features", 0).await.unwrap();
    

SuperLog

HyperLogLog는 집합의 기저를 효율적으로 추정하기 위한 확률적 데이터 구조입니다.

  • 사용 사례: 웹사이트의 순 방문자 수와 같이 대량의 데이터에서 고유 요소의 수를 추정해야 하는 시나리오에 적합합니다.

  • 장점: HyperLogLog는 특히 대용량 데이터 세트를 처리할 때 기존 카운팅 방식에 비해 메모리 사용 측면에서 매우 효율적입니다.

    // HyperLogLog에 요소 추가하기
    let _: () = conn.pfadd("pageviews", "user1").await.unwrap();
    let _: () = conn.pfadd("pageviews", "user2").await.unwrap();
    // 대략적인 기준값 가져오기
    let unique_pageviews: i64 = conn.pfcount("pageviews").await.unwrap();
    

백엔드 비즈니스에서 최적의 저장 및 검색 효율성을 위해 적합한 Redis 데이터 유형을 선택하려면 데이터 구조와 사용 시나리오를 이해하는 것이 중요합니다. 다음은 몇 가지 일반적인 백엔드 시나리오와 권장되는 Redis 데이터 유형입니다:

유형 선택

사용자 세션

  • 권장 유형: 해시

  • 이유: 해시는 사용자 세션 객체의 여러 속성을 저장하고 특정 필드를 개별적으로 업데이트하거나 검색할 수 있습니다.

    let _: () = conn.hset("session:userid", "token", "abc123").await.unwrap();
    let _: () = conn.hset("session:userid", "last_access", "2023-01-01").await.unwrap();
    

실시간 메시지 또는 이벤트 대기열

  • 권장 유형: 목록

  • 이유: 목록은 FIFO 대기열의 특성을 제공하며 실시간 메시징 또는 작업 대기열에 적합합니다.

    let _: () = conn.rpush("events_queue", "event1").await.unwrap();
    let event: String = conn.lpop("events_queue").await.unwrap();
    

액세스 카운터 또는 횟수 제한

  • 권장 유형: 문자열

  • 이유: 문자열 유형은 원자 증분 연산을 지원하며 카운터로 사용하기에 적합합니다.

    let _: () = conn.incr("page_view_count", 1).await.unwrap();
    let count: i64 = conn.get("page_view_count").await.unwrap();
    

랭킹 또는 점수 순서

  • 권장 유형: 주문 세트

  • 이유: 정렬된 컬렉션은 점수에 따라 자동으로 정렬되며 순위표와 같이 정렬이 필요한 데이터에 적합합니다.

  • 녹 예시:

    let _: () = conn.zadd("leaderboard", "user123", 2500).await.unwrap();
    let leaderboard: Vec<(String, f64)> = conn.zrange_withscores("leaderboard", 0, -1).await.unwrap();
    

고유 값 모음

  • 권장 유형: 컬렉션

  • 이유: 컬렉션은 고유한 가치 저장소를 제공하며 중복 제거가 필요한 시나리오에 적합합니다.

  • 녹 예시:

    let _: () = conn.sadd("tags", "redis").await.unwrap();
    let tags: Vec<String> = conn.smembers("tags").await.unwrap();
    

다중 속성 개체 스토리지

  • 권장 유형: 해시

  • 이유: 해시는 객체의 여러 필드를 저장할 수 있으며 이러한 필드를 독립적으로 가져오거나 업데이트할 수 있습니다.

    let _: () = conn.hset("user:100", "name", "Alice").await.unwrap();
    let user: HashMap<String, String> = conn.hgetall("user:100").await.unwrap();
    

기능 표시 또는 전환

  • 권장 유형: 비트맵

  • 이유: 비트맵은 함수의 켜기/끄기 상태와 같은 부울 값을 저장하는 데 적합합니다.

  • 녹 예시:

    let _: () = conn.setbit("features", 1, true).await.unwrap();
    let feature_on: bool = conn.getbit("features", 1).await.unwrap();
    

올바른 유형을 선택하는 것은 특정 요구 사항에 따라 다릅니다. 단순한 데이터 구조라면 문자열로 충분할 수 있습니다. 사용자 프로필이나 세션 정보와 같이 보다 복잡한 데이터 구조의 경우 해시가 더 적합할 수 있습니다. 애플리케이션에 리더보드나 정렬이 필요한 데이터가 포함된 경우 원본 링크를 다시 인쇄하세요. 감사합니다!

Read next

제품 통합 계획 템플릿

_

Oct 29, 2025 · 1 min read

Typora 소책자 테마

Oct 29, 2025 · 1 min read

9. 에코 수

Oct 29, 2025 · 2 min read

CSS에서 플로팅

Oct 29, 2025 · 3 min read