Post

개발자를위한레디스 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.