Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 자바 ORM 표준 JPA 프로그래밍 7장
- 13460 구슬탈출 2
- Kotlin in action 10장
- Kotlin in action 5장
- 기능개발 python
- 코틀린
- 스프링 컨테이너와 스프링 빈
- Kotlin
- Kotlin In Action
- 코틀린인액션
- 고급매핑
- 스프링 핵심 원리 이해
- 백준 20055 컨베이어 벨트 위의 로봇
- 코틸린인액션
- 스프링 핵심 원리
- Kotlin in action 3장
- Kotlin in action 6장
- KotlinInAction
- 컨베이어 벨트 위의 로봇 Python
- 싱글톤 컨테이너
- Python
- 객체 지향 설계와 스프링
- 7장 고급매핑
- 스프링 핵심 원리 - 기본편
- 20055
- 백준
- spring
- 20055 컨베이어 벨트 위의 로봇
- kotlin in action 정리
- 백준 13460 Python
Archives
- Today
- Total
기록하는 습관
[스마일게이트 인턴] 추천 피드 본문
#1 추천 피드
캐싱을 쓰는 이유는?
-> 유동적인 값을 커서로 사용할 수 없는 페이징 방식 때문이다. 그래서 캐싱된 데이터만 api 호출 시 pull 하는 방식으로 변경
< 생각한 방식들 >
- 10분 단위로 카테고리 별 좋아요 기준으로 내림차순 정렬된 게시글들을 캐싱 // 채택 !!
- 정렬된 데이터를 캐싱 해 놓으면 유저들에게 해당하는 카테고리의 데이터를 바로 줄 수 있으며, Redis에서 Sorted Set 자료구조를 통해 데이터를 효율적으로 관리 가능하기 때문이다.
- 카테고리 별로 전체 content 중 범위를 나누어 n개의 content를 캐싱하고, 캐싱된 contents 범위 안에서 pull(read)할때 마다 유동적으로 바뀐 좋아요 수를 기준으로 정렬해서 read 시켜준다.
* batch vs cache
배치를 선택하지 않고 캐싱을 선택한 이유
- 배치는 10분 단위를 주기로 모든 content node마다 like score값을 update 시켜줘야 한다.
- 캐싱은 ORDER BY 좋아요 하나로 정렬시킨 값으로 캐시메모리에 바로 넣어주면 된다.
따라서 배치보단 캐싱이 부담이 더 적다. 좋아요를 커서 값에 반영할 수 없으므로, 유동적인 좋아요 값을 정렬 기준으로 사용하기 위해서는 캐싱 방식을 사용하는 방법이 있다.
의문: Sorted Set을 사용해서 데이터를 보관하면 정렬이 되어있는 고정 값을 사용하기 때문에 이를 활용해 페이징을 해도 되는 것이 아닌가 의문이 들었음.
(즉, api 호출이 있을 때마다 좋아요를 기준으로 새로 정렬하는 것이 아니기 때문에, 매번 새로운 데이터를 한꺼번에 줄 필요가 없습니다.)
-> 10분마다 캐싱된 데이터가 바뀌기 때문에 페이징을 사용할 수 없음.
결론
- 10분마다 node-schedule을 이용
- score == 0 : "all"을 key 값으로 해서 전체 게시글 중 좋아요가 많은 top 150개를 Redis에 Sorted Set 자료구조로 저장.
- score != 0 : 전체 category를 각각 key 값으로 해서 해당 카테고리의 게시글들 중 좋아요가 많은 top 150개를 Redis에 Sorted Set 자료구조로 저장.
자료구조 :
// key: category
// member: {contentId, photoCount, url}
// score: likeCount
- 추천 게시물 api가 호출되면
- score == 0 : "all" 의 member 전달하기
- score != 0 : 해당 카테고리의 member 전달하기
'스마일게이트 인턴 - Dev Camp' 카테고리의 다른 글
[스마일게이트 인턴] nGrinder를 이용한 성능 테스트 (0) | 2021.02.10 |
---|---|
[실시간 랭킹] 실시간 랭킹 프로세스 정리 및 생각 (0) | 2021.01.26 |
[개념/적용] MQ에 대한 개념 및 적용 (0) | 2021.01.26 |
[Dev Camp] 2주차 개인 프로젝트 - 설계 및 개념 정리 (0) | 2020.12.15 |
MySQL 8.0 - Authentification Error (0) | 2020.12.15 |
Comments