[Redis]레디스 자료 구조 활용 사례

Jeongyeon Kim·2024년 1월 2일
1

Redis

목록 보기
3/7
post-thumbnail

레디스 자료 구조에 내장된 함수를 이용해 원하는 기능을 사용하면 데이터를 애플리케이션의 메모리 영역으로 가져간 뒤 가공하는 데에 걸리는 시간을 줄일 수 있기 때문에 애플리케이션에서는 매우 짧은 대기 시간으로 엄청난 양의 작업을 처리할 수 있음

레디스 자료 구조 활용 사례


sorted set을 이용한 실시간 리더보드

  • 리더보드는 사용자의 스코어를 기반으로 데이터를 정렬하는 서비스이기 때문에 사용자의 증가에 따라 가공 데이터 증가
  • 리더보드는 실시간으로 반영되어야 하는 데이터
  • 레디스의 sorted set에서 데이터는 저장될 때부터 정렬되어 들어감
  • 유저의 스코어를 sorted set의 가중치로 설정한다면 스코어를 기준으로 유저가 정렬됨 ➡️ 리더보드 데이터를 읽어오기 위해 매번 데이터 정렬할 필요 X
  • sorted set은 기본적으로 set이기 때문에 데이터가 중복 저장되지 않으며, 같은 아이템을 저장하고자 할 때 스코어가 다르면 기존 데이터의 스코어만 신규 입력한 스코어로 업데이트 됨

sorted set을 이용한 최근 검색 기록

  • RDBMS에서 최근 검색 기록을 가져올 때 검색한 시점을 기준으로 소팅(sorting)을 해야하기 때문에 사용자와 검색 기록이 늘어날 수록 많은 데이터를 테이블에서 관리해야 한다는 문제점 있음
  • sorted set은 중복을 허용하지 않으며, 유저가 검색한 시간을 스코어로 사용하면 검색 기록으로 정렬될 수 있음
  • sorted set의 음수 인덱스를 사용해서 매번 데이터를 저장할 때 아이템의 개수를 확인하고 삭제해야 하는 번거로움을 줄일 수 있음

sorted set을 이용한 태그 기능

  • 포스트 id를 기준으로 하는 set에 태그를 데이터로 넣어 특정 게시물이 어떤 태그와 연관되어 있는지 확인
  • 태그를 기준으로 하는 set에 포스트 id를 데이터로 넣어 특정 태그를 포함한 게시물 확인

랜덤 데이터 추출

  • RDBMS에서 랜덤 데이터 추출을 사용할 때 ORDER BY RAND() 함수를 사용
  • ORDER BY RAND()는 쿼리의 결과값을 랜덤하게 정렬하지만, 조건 절에 맞는 모든 행을 읽은 뒤, 임시 테이블에 넣어 정렬한 다음 랜덤으로 limit에 해당할 때까지 데이터 추출 ➡️ 데이터가 1만건 이상일 경우 부하 매우 많아짐
  • 레디스를 사용하면 O(1)의 시간 복잡도를 이용해 랜덤한 데이터 추출 가능
  • HRANDFIELD(hash), SRANDMEMBER(set), ZRANDMEMBER(sorted set)

레디스에서의 다양한 카운팅 방법

좋아요 처리하기

  • 좋아요를 누를 때마다 RDBMS의 테이블의 특정 행에서 좋아요 개수 데이터를 증가시키는 것은 데이터베이스에 직접적인 영향을 끼침
  • 또한 하나의 유저는 같은 댓글에 한 번씩만 좋아요를 누를 수 있음
  • 댓글 id을 기준으로 set을 생성한 뒤, 좋아요를 누른 유저의 id를 set에 저장하면 중복 없이 데이터 저장 가능

읽지 않은 메시지 수 카운팅하기

  • 채팅 메시지가 도착할 때마다 RDBMS에 업데이트 하는 대신 인메모리 데이터베이스에 일시적으로 저장한 뒤 필요한 시점에 한꺼번에 업데이트하면 부하를 줄이고 성능 향상됨
  • 사용자의 id를 키로 하고, 채널의 id를 아이템의 키로 활용해 숫자 형태의 메시지 카운트를 관리

DAU(Daily Active User) 구하기

  • DAU는 하루 동안 서비스에 방문한 사용자의 수를 의미하며, 하루에 여러번 방문했다 하더라도 한 번으로 카운팅 됨
  • 레디스의 비트맵을 이용해 사용자의 id를 하나의 비트로 표현
  • 날짜를 키로 하고 사용자가 방문했으면 해당 사용자의 id에 해당하는 비트를 1로 설정

hyperloglog를 이용한 애플리케이션 미터링

  • 클라우드 컴퓨팅의 미터링 솔루션은 사용자의 서비스 사용 내역을 이용하기 때문에 대용량 데이터를 처리할 수 있어야 함
  • 미터링 솔루션은 높은 처리량과 낮은 대기 시간을 가져야 함
  • 다음 조건을 만족한다면 레디스의 hyperloglog를 사용하는 것을 고려해볼 수 있음
    • 집합 내의 유일한 데이터의 개수를 카운팅해야 함
    • 1% 미만의 오차는 허용 가능함
    • 카운팅할 때 사용한 정확한 데이터를 다시 확인하지 않아도 됨
  • 로그 수집, 검색, 조회 서비스에서 각 유저를 구분하는 id를 키로 사용하고 API를 호출할 때마다 저장되는 로그의 식별자를 hyperloglog에 저장

Geospatial Index를 이용한 위치 기반 애플리케이션 개발

위치 데이터란

  • 모바일 기기의 확산으로 위치 데이터와 같은 공간 데이터 처리가 점점 중요해지고 있음
  • 위치 데이터는 경도와 위도(x, y) 좌표 쌍으로 표현
  • 데이터 저장소의 역할
    • 사용자의 현재 위치 파악
    • 사용자의 이동에 따른 실시간 변동 위치 업데이트
    • 사용자의 위치를 기준으로 근처의 장소 검색

레디스에서의 위치 데이터

  • geo set
    • 위치 공간 관리에 특화된 데이터 구조로, 각 위치 데이터는 경도와 위도의 쌍으로 저장됨
    • 데이터는 내부적으로 sorted set 구조로 저장됨
profile
Backend Developer👩🏻‍💻

0개의 댓글