반응형
SMALL
레디스가 제공하는 다양한 자료 구조를 적절히 활용한다면 애플리케이션에서는 매우 짧은 대기 시간으로 엄청난 양의 작업을 처리할 수 있다.
sorted set을 이용한 실시간 리더보드
- 사용자의 증가에 따라 가공해야 할 데이터가 몇 배로 증가한다.
- 데이터가 실시간으로 반영되어야 한다.
- 여러 가지 수학적 계산이 빠르게 수행되어야 한다.
- sorted set에서 데이터는 저장될 때부터 정렬되어 들어간다.
데이터 저장 및 조회
- ZADD 커맨드를 활용해서 데이터(스코어, 플레이어 번호)를 저장한다.
- ZRANGE를 활용해서 스코어 낮은 순서로 데이터를 조회할 수 있다.
- ZREVRANGE를 활용해서 상위 스코어 N개 데이터를 조회할 수 있다.
- ZADD를 활용해서 기존 플레이어의 점수 데이터 업데이트가 가능하다.
- set 자료구조는 기본적으로 데이터의 중복을 허용하지 않는다.
- ZINCRBY를 활용해서 스코어 데이터의 증감도 가능하다. (증감 후 데이터 재정렬)
랭킹 합산
- 주간 리더보드는 매주 월요일마다 초기화된다고 가정한다. 기준 날짜를 24.10.02(화)라고 하면, 24.09.30(월)~24.10.02(화)까지의 합산 결과가 필요하다.
- ZUINONSTORE를 활용하여 합산 가능하다.
- 실제로 커맨드를 활용하여 데이터를 합산하는 과정이다.
- weekly-score:2410-1을 확인해보면 합산된 데이터 순서로 정렬되어 있다.
- weights를 활용하여 특정한 날(키)에 가중치를 줄 수도 있다.
sorted set을 이용한 최근 검색 기록
검색 기록의 요구사항은 다음과 같다.
- 유저별로 다른 키워드 노출
- 검색 내역은 중복 제거
- 가장 최근 검색한 5개의 키워드만 사용자에게 노출
- 쇼핑몰에서의 최근 검색 내역이다.
- 스코어로 시간을 활용해서 검색 기록으로 정렬할 수 있다.
- 실제 데이터를 저장하고, 최근 5개 데이터를 조회할 수 있다.
- 같은 키워드로 검색해도 중복되지 않는다. (set 자료구조 특징)
- 데이터를 저장(ZADD)할 때마다 음수 인덱스 -6번째를 삭제하는 로직을 추가하면 실시간으로 데이터 5개를 유지하며 삭제할 수 있다.
sorted set을 이용한 태그 기능
게시글 기준으로 태그를 추가할 수 있다.
태그를 기준으로 게시글을 추가할 수 있다.
랜덤 데이터 추출
- 레디스를 사용하면 O(1)의 시간 복잡도를 이용해 랜덤한 데이터를 추출할 수 있다. (RANDOMKEY 커맨드 활용)
- hash: HRANDFIELD 커맨드 활용
- set: SRANDMEMBER 커맨드 활용
- sorted set: ZRANDMEMBER 커맨드 활용
레디스에서의 다양한 카운팅 방법
좋아요 처리하기
- 댓글 id를 기준으로 set을 생성한 뒤, 좋아요를 누른 유저의 id를 set에 저장하면 중복 없이 데이터를 저장할 수 있다.
- 각 댓글별로 좋아요를 누른 수는 SCARD 커맨드로 확인할 수 있다.
읽지 않은 메시지 수 카운팅하기
- 채팅 메시지가 도착할 때마다 데이터를 인메모리 데이터베이스(레디스)에 일시적으로 저장한 뒤 필요한 시점에 한번에 DB를 업데이트 하는 방식을 사용하면 부하를 최소화할 수 있다.
- hash 구조를 활용하여 카운트를 효과적으로 관리할 수 있다.
- 사용자의 ID를 키로 사용하고, 채널의 ID를 아이템의 키로 활용해 숫자 형태 메시지 카운트로 관리할 수 있다.
- ID가 234인 사용자가 4234 채널에서 새로운 메시지를 수신했다면 아래 명령어를 사용할 수 있다.
- HINCRBY user:234 channel:4243 1
- 이미 전송한 메시지를 삭제했다면 아래 명령어를 사용할 수 있다.
- HINCBY user:123 channel:3135 -1
DAU 구하기
- 비트맵을 활용하여 메모리를 효율적으로 줄이고, 실시간으로 서비스의 DAU를 확인할 수 있다.
- SETBIT를 통해 방문한 유저 수를 업데이트 한다.
- 2024년 10월 6일, id가 14인 유저가 접근했을 때 오프셋 14를 1로 설정한다.
- BITCOUNT를 통해 해당 일자에 접근한 유저 수를 확인할 수 있다.
- BITOP AND를 통해 조건에 따라 연속 출석한 유저의 정보도 구할 수 있다. 해당 정보는 새로운 비트맵 자료 구조에 저장할 수 있고, 리스트로 변환하여 정보를 확인할 수 있다.
hyperloglog를 이용한 애플리케이션 미터링
- 미터링 솔루션은 사용자의 서비스 사용 내역을 이용하기 때문에 대용량 데이터를 처리할 수 있어야 한다.
- 다음 조건을 만족한다면 hyperloglog 사용을 고려해볼 수 있다.
- 집합 내의 유일한 데이터의 개수를 카운팅해야 한다.
- 1% 미만의 오차는 허용 가능하다.
- 카운팅할 때 사용한 정확한 데이터를 다시 확인하지 않아도 된다.
- 예를 들어, 2024년 10월에 ID가 245인 유저의 API 호출 횟수를 계산하려면 API를 호출할 때마다 해당 키에 PFADD 커맨드를 사용해 로그 식별자를 저장한다.
- PFCOUNT를 통해 중복되지 않은 데이터의 개수를 조회할 수 있다.
- hyperloglog는 set과 비슷하지만 저장되는 용량은 12KB로 고정되기 때문에 공간을 효율적으로 사용할 수 있다.
- PFMERGE를 통해 여러 개의 hyperloglog를 합칠 수도 있다.
- PFMERGE 2024:user:245 202410:user:245 202411:user:245 202412:user:245
Geospatial Index를 이용한 위치 기반 애플리케이션 개발
위치 데이터란
- 사용자의 현재 위치 파악
- 사용자의 이동에 따른 실시간 변동 위치 업데이트
- 사용자의 위치를 기준으로 근처의 장소 검색
레디스에서의 위치 데이터
- geo 자료 구조를 통해 공간 정보 데이터를 처리할 수 있다.
- 메모리에서 빠르게 계산할 수 있어 다른 저장소보다 위치 데이터를 효율적으로 처리할 수 있다.
- geo set
- 위치 공간 관리에 특화된 데이터 구조로, 각 위치 데이터는 경도와 위도의 쌍으로 저장된다.
- GEOADD 커맨드를 사용해서 데이터(사용자의 현재 위치)를 추가할 수 있다. (위치 변경 시에도 활용)
- GEOPOS 커맨드로 저장한 데이터를 조회할 수 있다.
- GEOSEARCH 커맨드로 특정 거리 내에 있는 위치를 찾을 수 있다.
- BYRADIUS 옵션을 활용하면 원 모양의 반경으로 찾을 수 있다.
- BYBOX 옵션을 사용하면 가로/세로 값을 지정하여 직사각형 모양의 반경으로 찾을 수 있다.
References
개발자를 위한 레디스
반응형
LIST
'독서 > 개발자를 위한 레디스' 카테고리의 다른 글
[개발자를 위한 레디스] 6장 레디스를 메시지 브로커로 사용하기 (0) | 2024.10.29 |
---|---|
[개발자를 위한 레디스] 5장 레디스를 캐시로 사용하기 (0) | 2024.10.19 |
[개발자를 위한 레디스] 3장 레디스 기본 개념 (13) | 2024.09.14 |
[개발자를 위한 레디스] 2장 레디스 시작하기 (0) | 2024.08.25 |
[개발자를 위한 레디스] 1장 마이크로서비스 아키텍처와 레디스 (0) | 2024.08.25 |