[Redis] 05. 고급 자료구조 (Stream, HyperLogLog, Bitmap, Geo)
Redis의 고급 자료구조인 Stream, HyperLogLog, Bitmap, Geospatial을 정리합니다.
Stream
Stream은 Redis 5.0에서 도입된 로그형 자료구조입니다.
Kafka와 유사한 메시지 스트리밍을 지원하며, Consumer Group으로 분산 처리가 가능합니다.
기본 명령어
# 메시지 추가 (* = 자동 ID 생성)
XADD mystream * name "홍길동" action "login"
# "1714900000000-0" (타임스탬프-시퀀스)
XADD mystream * name "김철수" action "purchase" amount 50000
# 길이 확인
XLEN mystream
# 범위 조회
XRANGE mystream - + # 전체 (오래된 순)
XRANGE mystream - + COUNT 10 # 최근 10개
XREVRANGE mystream + - # 전체 (최신 순)
# 특정 ID 이후 조회
XREAD COUNT 5 BLOCK 5000 STREAMS mystream 0
# BLOCK: 새 메시지 대기 (밀리초, 0=무한)
Consumer Group
# 그룹 생성
XGROUP CREATE mystream mygroup $ MKSTREAM
# $: 새 메시지부터, 0: 처음부터
# 그룹으로 읽기
XREADGROUP GROUP mygroup consumer1 COUNT 1 BLOCK 5000 STREAMS mystream >
# 처리 완료 확인 (ACK)
XACK mystream mygroup "1714900000000-0"
# 미확인 메시지 확인 (Pending)
XPENDING mystream mygroup
# 메시지 삭제
XDEL mystream "1714900000000-0"
# 스트림 트리밍 (최대 1000개 유지)
XTRIM mystream MAXLEN ~ 1000
HyperLogLog
HyperLogLog는 고유 원소 수(카디널리티)를 근사적으로 계산하는 확률적 자료구조입니다.
수백만 개의 고유 값을 단 12KB 메모리로 추적할 수 있습니다 (오차율 약 0.81%).
# 원소 추가
PFADD visitors:2026-05-05 "user:1" "user:2" "user:3"
PFADD visitors:2026-05-05 "user:1" "user:4" # 중복은 무시
# 고유 원소 수 (근사값)
PFCOUNT visitors:2026-05-05
# 4
# 여러 HyperLogLog 합치기
PFADD visitors:2026-05-04 "user:1" "user:5" "user:6"
PFMERGE visitors:week visitors:2026-05-04 visitors:2026-05-05
PFCOUNT visitors:week
# 6
활용: 일별 고유 방문자 수 (UV)
# 페이지 방문 시
PFADD uv:page:home:2026-05-05 "user:123"
# 일별 UV 조회
PFCOUNT uv:page:home:2026-05-05
# 주간 UV (합산)
PFMERGE uv:page:home:week uv:page:home:2026-05-01 uv:page:home:2026-05-02 uv:page:home:2026-05-03
PFCOUNT uv:page:home:week
Bitmap
Bitmap은 String을 비트 배열로 활용하는 기법입니다.
각 비트(0/1)로 상태를 표현하여 매우 적은 메모리로 대량의 불리언 데이터를 관리합니다.
# 비트 설정 (offset, value)
SETBIT daily_active:2026-05-05 1001 1 # user:1001 활성
SETBIT daily_active:2026-05-05 1002 1 # user:1002 활성
SETBIT daily_active:2026-05-05 1003 0 # user:1003 비활성
# 비트 조회
GETBIT daily_active:2026-05-05 1001
# 1
# 1인 비트 수 (활성 사용자 수)
BITCOUNT daily_active:2026-05-05
# 비트 연산
BITOP AND both_days daily_active:2026-05-04 daily_active:2026-05-05
# 양일 모두 활성인 사용자
BITOP OR any_day daily_active:2026-05-04 daily_active:2026-05-05
# 어느 날이든 활성인 사용자
# 첫 번째 1(또는 0) 비트 위치
BITPOS daily_active:2026-05-05 1
활용: 출석 체크
# 5월 5일 출석 (user_id를 offset으로)
SETBIT attendance:2026-05-05 123 1
# 이번 달 개근 사용자 (AND 연산)
BITOP AND perfect_may attendance:2026-05-01 attendance:2026-05-02 ... attendance:2026-05-31
BITCOUNT perfect_may
Geospatial
Redis의 Geo 명령어는 위도/경도 기반의 위치 데이터를 저장하고 거리/반경 검색을 지원합니다.
내부적으로 Sorted Set을 사용합니다.
# 위치 추가 (경도, 위도, 멤버)
GEOADD stores 126.9780 37.5665 "서울시청"
GEOADD stores 127.0276 37.4979 "강남역"
GEOADD stores 126.9516 37.5547 "홍대입구"
GEOADD stores 129.0756 35.1796 "부산역"
# 위치 조회
GEOPOS stores "강남역"
# 1) "127.02760" 2) "37.49790"
# 두 지점 간 거리
GEODIST stores "서울시청" "강남역" km
# "8.2345"
GEODIST stores "서울시청" "부산역" km
# "325.1234"
# 반경 검색 (Redis 6.2+: GEOSEARCH)
GEOSEARCH stores FROMMEMBER "강남역" BYRADIUS 10 km ASC COUNT 5 WITHCOORD WITHDIST
# 강남역 기준 10km 이내, 가까운 순 5개
# 좌표 기준 반경 검색
GEOSEARCH stores FROMLONLAT 127.0 37.5 BYRADIUS 15 km ASC WITHCOORD WITHDIST
# 사각형 범위 검색
GEOSEARCH stores FROMLONLAT 127.0 37.5 BYBOX 20 20 km ASC
# Geohash 조회
GEOHASH stores "서울시청"
활용: 주변 매장 검색
# 사용자 현재 위치 기준 3km 이내 매장
GEOSEARCH stores FROMLONLAT 127.0 37.5 BYRADIUS 3 km ASC WITHDIST
- [Redis] 11. 모니터링과 Troubleshooting
- [Redis] 10. 실전 설계 패턴
- [Redis] 09. 메모리 관리와 설정
- [Redis] 08. 복제, Sentinel, Cluster (고가용성)
- [Redis] 07. 영속성 (RDB, AOF)
- [Redis] 06. Pub/Sub, 트랜잭션, Lua 스크립팅
- [Redis] 05. 고급 자료구조 (Stream, HyperLogLog, Bitmap, Geo)
- [Redis] 04. Hash와 Sorted Set
- [Redis] 03. List와 Set
- [Redis] 02. String과 숫자 (기본 자료구조)
- [Redis] 01. Redis 소개 및 설치