실시간 리더보드
배경
- 리더보드: 경쟁자들의 순위와 현재 점수를 보여주는 순위표
- 절대적 리더보드
- 모든 유저를 정렬시켜 상위권만 표시하는 것을 absolute leaderboard 라고 함
- 상대적 리더보드
- 사용자마다 다른 데이터를 보여줌
- 구로 직장인 대상 순위
- 사용자마다 다른 데이터를 보여줌
- 절대적 리더보드
필요
- 상대적 리더보드의 경우 다양한 관점에서 데이터 계산하고 통계 내야하기 때문에 여러 가지 수학적 계산이 빠르게 수행되어야 함
- 관계형 데이터베이스 사용할 경우 항상 정렬해서 가져와야 한다.
해결
- Sorted set 은 항상 정렬해서 저장하기 때문에 매번 정렬할 필요가 없다.
- ZUIONSTORE로 스코어 합한할 수 있음
- 특정 SET 에 가중치 줄 수 있음
최근 검색 기록
배경
- 최근 검색 기록
- 유저별로 다른 키워드 노출
- 검색 내역은 중복 제거
- 가장 최근 검색한 5개 키워드만 사용자에게 노출
필요
- 관계형 데이터베이스 사용할 경우 아래와 같은 귀찮음이 있음
- 검색 기록 있는지 확인
- 오래된 기록 삭제
- 최근 순 소팅
해결
- Sorted set 사용해서 해결
- Set이기 때문에 자동으로 중복 해결
- 자동으로 시간 순 정렬 (스코어로 날짜)
- ZREMRANGEBYRANK 로 몇 개 이상 데이터가 남지 않도록 설정
태그 기능
배경
- 태그 검색 구현해야 함
필요
- 관계형 데이터베이스로 하려면?
- 방법
- 태그 문자열 검색
- 태그 테이블 분리해서 검색
- 문제점
- 멀티 태그 검색을 위한 group by -having 절 사용할 경우 데이터베이스 자체에 부하를 발생시킬 수 있다.
SELECT post_id FROM tag_post WHERE tag_id IN (1, 3) GROUP BY post_id HAVING count(tag_id) <= 2;
- 방법
해결
- SADD
- 태그 추가
- SMEMBERS
- 태그 가지고 있는 게시글 검색
- SINTER
- 여러개의 태그에 동시에 속한 게시글 교집합으로 검색
랜덤 데이터 추출
배경
- 게임에서 랜덤 유저 매치, 이벤트 응모 유저 랜덤 추출
- 가챠에서 랜덤 아이템 뽑기 구현
필요
- ORDER BY RAND() 함수는 조건 절에 해당하는 모든 행 읽은 뒤 랜덤 limit 까지 데이터 추출하기 때문에 데이터가 많은 경우 부하가 많이 갈 수 있음
해결
- RANDOMKEY 사용해서 전체 키 중 하나를 무작위로 반환할 수 있으며 O(1) 로 가능하다.
- 아래 커맨드로 자료 구조에서 랜덤 아이템 추출할 수 있다.
- HRANDFIELD: Hash
- SRANDMEMBER: Set
- ZRANDMEMBER: Sorted Set
대규모 카운팅
좋아요
- Set 으로 해결
읽지 않은 메시지 수 카운팅하기
- 해시로 해결
Daily Active User
- 유저 Id 저장하는 방식 적용할 경우 데이터가 너무 많아 성능 저하 발생할 수 있음 -> 비트맵으로 해결 → id로 0이상의 정수값 사용할 때만 가능
- 1첫만명 → 1천만 개 비트, 1.2MB 크기에 해당 (string 최대는 512MB)
-- id가 14인 유저 방문했다고 비트에 표시
SETBIT uv:20221106 14 1
- 응용해서 매일 출석 유저 구할 수 있음
해결
- 매번 요청하지 않고, 카운팅을 레디스에서 몰아서 집계했다가 데이터베이스에 한 번에 업데이트 하도록 개선
위치 기반 애플리케이션
배경
필요
- 관계형 데이터베이스는 데이터 처리를 저장소 외부에서 처리하지만 레디스는 실시간 위치 연산을 직접 수행할 수 있다 → 이게 과연 장점인가?
- 데이터 이동으로 인한 네트워크 트래픽 감소
- 애플리케이션 코드 복잡성 감소
- 빠른 서비스 응답 속도 보장(?)
해결
- 레디스 GEO 자료 구조를 통해 공간 정보 데이터 처리
- geo set + pub/sub 조합하면 맛집에서 이벤트 발생했을 때 근처 사용자에게 알림 보낼 수 있음
'DataOps > Redis' 카테고리의 다른 글
[Redis] 레디스를 메시지 브로커로 사용하기 (0) | 2024.05.27 |
---|---|
[Redis] 5장. 레디스를 캐시, 세션으로 사용하기 (0) | 2024.05.08 |
[Redis] 3장. 레디스 기본 개념 (0) | 2024.05.05 |
[Redis] 1장. 마이크로서비스 아키텍처, NoSQL, 레디스 (1) | 2024.04.17 |
SLASH 23 - 실시간 시세 데이터 안전하고 빠르게 처리하기 (Redis Pub/Sub) (0) | 2023.10.10 |
댓글