Redis 데이터 유형 설명: 사용 시기와 사용법
Daniel Hayes
Full-Stack Engineer · Leapcell

일반적인 Redis 데이터 유형
문자열
Redis의 문자열은 문자열 값을 저장하고 검색하는 데 사용되는 기본 데이터 유형입니다.
- 사용 사례: 사용자 이름, 이메일 주소 또는 페이지 카운터와 같은 텍스트 또는 숫자를 저장하는 데 적합합니다. 문자열은 또한 이진 데이터를 저장할 수 있어 이미지 또는 직렬화된 객체를 저장하는 데 이상적입니다.
- 장점: 증가(INCR)와 같은 원자적 작업을 통한 간단한 작업.
// 문자열 저장 let _: () = conn.set("username", "alice").await.unwrap(); // 문자열 검색 let username: String = conn.get("username").await.unwrap();
목록
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();
해시
해시는 프로그래밍 언어의 사전 또는 객체와 유사한 키-값 쌍의 모음입니다.
- 사용 사례: 사용자 속성(이름, 나이, 이메일 등)과 같은 객체 또는 여러 관련 데이터 포인트를 저장하는 데 이상적입니다.
- 장점: 여러 필드를 한 번에 읽거나 쓰는 데 효율적이므로 객체를 나타내거나 데이터 포인트를 집계하는 데 적합합니다.
// 해시에 키-값 쌍 추가 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();
HyperLogLogs
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 데이터 유형을 사용하는 일반적인 백엔드 시나리오입니다.
사용자 세션
- 권장 유형: 해시
- 이유: 해시는 사용자 세션 객체의 여러 속성(예: 사용자 ID, 토큰, 마지막 액세스 시간)을 저장할 수 있으며 개별 업데이트 또는 검색을 허용합니다.
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();
결론
올바른 유형을 선택하는 것은 특정 요구 사항에 따라 다릅니다. 데이터 구조가 단순한 경우(예: 단일 키-값 쌍) 문자열이면 충분할 수 있습니다. 사용자 프로필 또는 세션 정보와 같은 더 복잡한 구조의 경우 해시가 더 나을 수 있습니다. 애플리케이션에 순위표 또는 정렬된 데이터가 포함된 경우 정렬된 집합을 적절히 사용하십시오.
Leapcell은 기본 제공된 서버리스 Redis로 백엔드 프로젝트 호스팅을 위한 최고의 선택입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하십시오. 요청도 없고 요금도 없습니다.
탁월한 비용 효율성
- 유휴 요금 없이 사용한 만큼 지불하십시오.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
간편한 확장성 및 고성능
- 쉬운 동시성 처리를 위한 자동 확장.
- 운영 오버헤드가 전혀 없습니다. 빌드에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ