Community Patterns
Redis 커뮤니티에서 개발한 일반적인 사용 사례 패턴입니다.
Bitmap Patterns
수백만 개의 불린 플래그를 최소 메모리로 저장
개념
Redis Bitmap은 1비트로 각 불린 값을 저장합니다. 1개 플래그당 1비트로 O(1) 액세스와 전체 데이터셋에 대한 빠른 집계 연산을 제공합니다.
기본 명령어
# 비트 설정
SETBIT user:activity:2024-01-30 123 1
# 비트 조회
GETBIT user:activity:2024-01-30 123
# 설정된 비트 수
BITCOUNT user:activity:2024-01-30
# 비트 연산
BITOP AND result key1 key2
BITOP OR result key1 key2
BITOP XOR result key1 key2
일일 활성 사용자 (DAU) 추적
# 사용자 ID 12345가 2024-01-30에 로그인
SETBIT dau:2024-01-30 12345 1
# DAU 수
BITCOUNT dau:2024-01-30
# 주간 활성 사용자 (7일 OR 연산)
BITOP OR wau:2024-week1 dau:2024-01-24 dau:2024-01-25 ... dau:2024-01-30
BITCOUNT wau:2024-week1
기능 플래그
# 사용자별 기능 활성화
SETBIT feature:beta_access 12345 1
# 기능 활성화 확인
GETBIT feature:beta_access 12345
연속 활동 추적
# 30일 연속 로그인 체크
BITOP AND streak:check dau:day1 dau:day2 ... dau:day30
GETBIT streak:check 12345 # 1이면 30일 연속
장점
- 메모리 효율: 1억 사용자 = 약 12.5MB
- 빠른 집계: BITCOUNT, BITOP가 O(N)이지만 매우 최적화됨
- 단순성: 직관적인 사용법
주의사항
- 사용자 ID가 연속적이지 않으면 메모리 낭비
- Sparse bitmap은 메모리 비효율적일 수 있음
Geospatial Patterns
위치 기반 쿼리
개념
Redis는 GEOADD, GEOSEARCH, GEODIST 명령어를 사용하여 위치 저장 및 반경/거리/경계 상자 쿼리를 지원합니다. 내부적으로 geohash 인코딩된 Sorted Set을 사용합니다.
기본 명령어
# 위치 추가
GEOADD locations -122.4194 37.7749 "San Francisco"
GEOADD locations -118.2437 34.0522 "Los Angeles"
# 반경 검색
GEOSEARCH locations FROMMEMBER "San Francisco" BYRADIUS 100 km
# 거리 계산
GEODIST locations "San Francisco" "Los Angeles" km
주변 가맹점 찾기
# 가맹점 위치 저장
GEOADD stores -127.0 37.0 "store:1"
GEOADD stores -127.1 37.1 "store:2"
# 사용자 위치(127.05, 37.05)에서 5km 내 가맹점
GEOSEARCH stores FROMLONLAT -127.05 37.05 BYRADIUS 5 km WITHDIST
배차 시스템
# 드라이버 위치 업데이트
GEOADD drivers:active -127.0 37.0 "driver:123"
# 승객 위치에서 3km 내 드라이버 검색
GEOSEARCH drivers:active FROMLONLAT -127.05 37.05 BYRADIUS 3 km ASC COUNT 5
경로 추적
# 위치 기록은 Sorted Set과 Geo 조합
# 현재 위치 (Geo)
GEOADD drivers:active -127.0 37.0 "driver:123"
# 위치 히스토리 (Sorted Set: score = timestamp)
ZADD tracking:driver:123 1706648400 "-127.0,37.0"
ZADD tracking:driver:123 1706648460 "-127.01,37.01"
# 시간 범위로 위치 조회
ZRANGE tracking:driver:123 1706648400 1706648500 BYSCORE
Leaderboard Patterns
실시간 랭킹 시스템
개념
Sorted Set을 사용하여 O(log N) 점수 업데이트, O(log N) 순위 조회, 효율적인 범위 쿼리를 제공합니다.
기본 명령어
# 점수 추가/업데이트
ZADD leaderboard 100 "player:123"
# 순위 조회 (0부터 시작, 낮은 순위가 높은 점수)
ZREVRANK leaderboard "player:123"
# 점수와 함께 순위 조회
ZREVRANK leaderboard "player:123" WITHSCORE
# Top N 조회
ZREVRANGE leaderboard 0 9 WITHSCORES
# 점수 증가
ZINCRBY leaderboard 10 "player:123"
게임 리더보드
# 점수 업데이트
ZINCRBY game:scores 50 "player:456"
# 전체 순위
ZREVRANK game:scores "player:456" WITHSCORE
# 주간 리더보드
ZADD leaderboard:week:2024-05 1000 "player:123"
사용자 주변 순위
# 123등 사용자 주변 ±5명
ZREVRANGE leaderboard 118 128 WITHSCORES
페이지네이션
# 1페이지 (Top 10)
ZREVRANGE leaderboard 0 9 WITHSCORES
# 2페이지 (11-20등)
ZREVRANGE leaderboard 10 19 WITHSCORES
다중 리더보드 병합
# 일일 리더보드를 주간으로 병합
ZUNIONSTORE leaderboard:week:2024-05 7 \
leaderboard:day:2024-01-29 leaderboard:day:2024-01-30 ...
Pub/Sub Patterns
실시간 이벤트 브로드캐스트
개념
Fire-and-forget 메시징으로 여러 구독자에게 실시간 이벤트를 브로드캐스트합니다. 메시지 유실이 허용되는 경우에 적합합니다.
기본 명령어
# 채널 구독
SUBSCRIBE channel1 channel2
# 패턴 구독
PSUBSCRIBE news:*
# 메시지 발행
PUBLISH channel1 "Hello World"
# 구독 취소
UNSUBSCRIBE channel1
채팅 시스템
# 채팅방 구독
SUBSCRIBE chat:room:123
# 메시지 발행
PUBLISH chat:room:123 '{"user":"alice","message":"Hello!"}'
알림 시스템
# 사용자별 알림 채널
SUBSCRIBE notifications:user:123
# 알림 발행
PUBLISH notifications:user:123 '{"type":"new_message","data":...}'
이벤트 브로드캐스트
# 시스템 이벤트
PUBLISH system:events '{"type":"config_changed","key":"rate_limit"}'
# 캐시 무효화
PUBLISH cache:invalidate "user:123"
주의사항
- 메시지 유실: 구독자가 연결되지 않으면 메시지 손실
- 지속성 없음: 메시지가 저장되지 않음
- 신뢰성 필요 시: Streams 사용
Session Management Patterns
세션 저장소
개념
Redis에 TTL과 함께 사용자 세션을 저장합니다. 접근 패턴에 따라 Hashes, Strings, JSON 중 선택합니다.
Hash를 이용한 세션
# 세션 생성
HSET session:abc123 user_id 123 created_at 1706648400 last_access 1706648400
EXPIRE session:abc123 1800 # 30분
# 세션 필드 액세스
HGET session:abc123 user_id
# 마지막 접근 업데이트
HSET session:abc123 last_access 1706648460
String (직렬화) 세션
# JSON 세션 저장
SET session:abc123 '{"user_id":123,"created_at":1706648400}'
EXPIRE session:abc123 1800
# 세션 조회
GET session:abc123
세션 스토어 선택 가이드
| 방식 | 장점 | 단점 |
|---|---|---|
| Hash | 필드별 액세스, 부분 업데이트 | 중첩 데이터 불가 |
| String | 간단, 중첩 데이터 가능 | 전체 읽기/쓰기 |
| JSON | 중첩 데이터, 쿼리 가능 | Redis Stack 필요 |
세션 인덱스
# 사용자 ID → 세션 ID 매핑
SET user:123:session session:abc123
# 세션 무효화 시 함께 삭제
DEL session:abc123
DEL user:123:session
Vector Search and AI Patterns
AI/ML 인프라를 위한 벡터 검색
개념
Redis Vector Sets를 사용하여 시맨틱 검색, RAG 파이프라인, 추천 시스템, AI 에이전트 인프라를 구축합니다.
RAG (Retrieval-Augmented Generation)
# 문서 벡터 저장
VADD documents <embedding_vector> VALUES ... METADATA {"title":"Redis Guide"}
# 쿼리 벡터로 유사 문서 검색
VSEARCH documents <query_embedding> K 5
추천 시스템
# 상품 벡터 저장
VADD products <product_embedding> VALUES ... METADATA {"category":"electronics"}
# 사용자 선호 벡터로 추천
VSEARCH products <user_preference_vector> K 10 FILTER "category == 'electronics'"
AI 에이전트 메모리
# 대화 컨텍스트 벡터 저장
VADD conversations <context_embedding> VALUES ... METADATA {"session_id":"abc123"}
# 관련 컨텍스트 검색
VSEARCH conversations <query_embedding> K 3
성능 특성
- HNSW 기반: 서브 밀리초 지연 시간
- 필터링 지원: 메타데이터 기반 필터링
- 확장성: 수백만 벡터 처리