개발자를위한레디스 4장 - 레디스 자료구조 활용사례
레디스 자료구조 활용사례
레디스 자료구조 활용사례
Redis는 단순한 캐시 저장소가 아닌, 다양한 자료구조와 고유 명령어를 활용해 고성능, 실시간 처리, 구조적 간결성을 동시에 제공하는 인메모리 데이터베이스입니다. 이 장에서는 레디스의 자료구조를 실제 서비스에 어떻게 적용할 수 있는지를 구체적으로 설명합니다.
sortedset : 실시간 리더보드
- 리더보드: 경쟁자들의 순위와 현재 점수를 보여주는 순위표
- 절대적 리더보드 : 모든 유저를 정렬시켜 상위권만 표시하는 것을 absolute leaderboard 라고 함
- 상대적 리더보드 : 사용자마다 다른 사용자와 비교해 순위를 결정
기본 동작
ZADD
로 유저 점수 저장 → 정렬 상태 유지ZREVRANGE
로 상위 랭커 조회ZINCRBY
로 점수 실시간 업데이트
1
2
ZADD daily-score:220817 400 player:234
ZREVRANGE daily-score:220817 0 3 WITHSCORES
랭킹 합산
ZUNIONSTORE
로 일간 점수 누적 → 주간/월간 통계WEIGHTS
로 가중치 부여 가능. -> 예를 들어서 15,16,17일에 각각 1,2,1을 곱한 값으로 합산된 랭킹을 구할 수 있음1 2
ZUNIONSTORE weekly-score:2208-03 3 daily-score:220815 daily-score:220816 daily-score:220817 ZUNIONSTORE weekly-score:2208-03 3 daily-score:220815 daily-score:220816 daily-score:220817 WEIGHTS 1 2 1
sortedset : 최근 검색 기록
- 쇼핑몰 최근 검색 내역
- 중복 자동 제거
타임스탬프 스코어 활용해 최근 키워드 정렬
ZREVRANGE
를 사용해 가장 최근에 검색한 순서대로 TOP N 개의 데이터 조회 가능1 2
ZADD search-keyword:123 20221106143501 "코듀로이" ZREVRANGE search-keyword:123 0 4 WITHSCORES
set/ sortedset : 태그 기능
- 블로그에 게시물 작성시 “해시태그”
태그 사용은 특정 게시물이 어떤 태그와 연관돼 있는지 확인하는 것 뿐아니라 특정한 태그를 포함한 게시물만 확인하기 위함
SMEMBERS
로 특정 태그를 가지고 있는 포스트 조회SINTER
로 교집합 조회
1
2
SADD tag:DataStore:posts 53
SINTER tag:IT:posts tag:DataStore:posts
randomkey : 랜덤데이터 추출
RANDOMKEY()를 이용하면 O(1)의 시간 복잡도로 랜덤한 데이터 추출 가능
- HRANDFIELD : hash에 저장된 아이템중 랜덤한 아이템 추출
- SRANDMEMBER : set에 저장된 아이템중 랜덤한 아이템 추출
- ZRANDMEMBER : sorted set에 저장된 아이템중 랜덤한 아이템 추출
count 옵션을 음수로 설정하면 중복해서 반환가능
1
2
SRANDMEMBER fruit -2
# 예: "banana", "banana" (중복 가능)
댓글 ID 기준 set : 좋아요 기능
1
2
SADD comment-like:12554 967
SCARD comment-like:12554
- 유저 ID 기준으로 중복 없는 좋아요 저장
- 좋아요 수 즉시 확인 가능
1
2
SADD comment-like:12554 967 # 좋아요 추가
SCARD comment-like:12554 # 확인
hash : 읽지 않은 메시지 수 카운팅
- 유저-채널별 카운트 저장
- 성능 + 직관적 구조
1
2
HINCRBY user:234 channel:4234 1 # 새로운 메시지 수신
HINCRBY user:234 channel:4234 -1 # 메시지 읽으면 갯수 삭제
bitmap : DAU 구하기
📊 DAU
하루동안 방문했던 user id를 set에 저장하는 방법도 있을수 있으나, 하루 1000만명이상의유저가 방문하는 서비스는 하나의 키 안에 너무 많은 아이템이 저장될 수 있으며, 이는 성능 저하로 이어짐.
보통 키 하나당 저장한는 아이템은 초치대 200~300만 개 까지로 조정할 것을 권장.
- 유저 ID를 비트 위치로 표현 → 실시간 DAU 계산
BITOP AND
로 연속 출석 집계
1
2
SETBIT uv:20221106 14 1
BITCOUNT uv:20221106
HyperLogLog : 대용량 미터링
- 메모리 고정(12KB)
- 약간의 오차 허용 시 대규모 유저 카운트 처리 가능
- api 과금모델(월별 api 호출량)
- PFMERGE를 이용하면 여러개의 HyperLogLog를 합칠 수 있어 분기별/반기별/연도별 합산 데이터를 간편하게 계산 가능
1
2
3
PFADD 202211:user:245 49483
PFCOUNT 202211:user:245
PFMERGE 202211:user:245 202212:user:245 202301:user:245
geospatial index : 위치 기반 서비스
- 실시간 위치 저장 + 검색
- 반경 또는 박스 기준 검색 지원
1
2
3
4
GEOADD user 50.071xxx 14.41xxx 142 # 현재 ID가 142인 사용자 위치 저장 or 갱신
GEOADD restaurant 50.071xxx 14.41xxx abc # abc이름(식당)을 restaurant(key)에 저장 or 갱신
GEOPOS restaurant abc # 데이터 조회
GEOSEARCH restaurant FROMLONLAT 50.xxx 14.xxx BYRADIUS 1 km # 반경검색
This post is licensed under CC BY 4.0 by the author.