inflearn logo
강의

Course

Instructor

Intermediate/Practical Redis for Non-Majors

[Practice] Build a 'Popular Search Terms' feature that shows the Top 10 most searched keywords - 2

선생님 질문있습니다!

84

0S

26 asked

0

선생님이 설명해주신 코드를 의사코드로 짜봤는데..

search(keyword){
   db <- `UPSERT list SET count = count+1 WHERE keyword={keyword}`
}

getTop10(){
   return db <- `SELECT * FROM list ORDER BY DESC LIMIT 10`
}

대충 이렇게 되면 DB 속도때문에 느리니까

search(keyword){
	redis <- `ZINCREBY ranking_list 1 {keyword}`
}

getTop100(){
	redis <- `ZRANGE ranking_list 0 9 REV`
}

이렇게 처리하자는 느낌인거 같아서요!

우려스러운건 그럼 DB에는 어떻게 언제 저장해야하나요?

redis nosql query-tuning performance-tuning

Answer 2

0

jscode

안녕하세요 ! 질문 잘 해주셨어요~

질문해주신 내용에 대해 답변드려볼게요!

"우려스러운건 그럼 DB에는 어떻게 언제 저장해야하나요?"

-> 우선 정리해주신 의사코드가 정확합니다!

검색할 때마다 DB에 UPSERT하고 매번 정렬해서 조회하던 걸, Redis의 Sorted Set으로 옮겨서 처리하는 게 핵심이에요 !

강의에서는 Sorted Set 활용에 집중하기 위해 Redis에만 저장하도록 구현했는데요,

DB에도 데이터를 남겨야 한다면 앞에서 배운 '좋아요 수 폭증' 실습의 Write Back 전략을 응용하시면 돼요 ~

검색 요청이 들어오면 Redis의 Sorted Set에만 score를 올려두고, 스케줄러가 주기적으로 Redis에서 키워드와 score를 조회(ZRANGE … WITHSCORES)해서 DB에 한꺼번에 반영하는 방식이에요 !

이렇게 하면 검색할 때마다 DB에 쓰기 작업이 발생하지 않으면서도, Redis에 문제가 생겼을 때를 대비해 데이터를 DB에 남겨둘 수 있어요 ! 참고로 인기 검색어처럼 실시간성이 중요하고 일부 유실돼도 치명적이지 않은 데이터라면, DB에 저장하지 않고 Redis만으로 운영하는 경우도 많죠 !

그래서 검색 기록을 통계 등으로 계속 활용해야 하는지에 따라 DB 저장 여부를 결정하시면 좋을 것 같아요 :)

추가로 궁금하신 점 있으시면 또 질문 남겨주세요~~

0

0S

  • 개선전 코드
    search(keyword){

db <- UPSERT list SET count = count+1 WHERE keyword={keyword}

}

getTop10(){

return db <- SELECT * FROM list ORDER BY DESC LIMIT 10

}

  • 개선후 코드
    search(keyword){


    redis <- ZINCREBY ranking_list 1 {keyword}

    }

    getTop100(){


    redis <- ZRANGE ranking_list 0 9 REV
    }

Fanout on Read 의 학습 코드에서 질문 있어요

0

8

0

트러블슈팅 케이스 스터디 - P 대형 커머스

0

15

2

강의 내용 질문 `[실습] MDC·UTM·세션ID로 "돈 버는 로거" 만들기`

0

16

1

강의 소스코드는 어디서 다운받을 수 있나요?

1

55

2

팔로워수,팔로잉수 조회 설계

1

41

1

TTL 산정 기준

0

54

1

ttl 산정 기준

0

50

1

강의 관련 질문드립니다.

1

74

2

Redis 비동기 I/O 멀티플렉싱이 아니라 논블로킹 I/O 멀티플렉싱이 아닌가요?

0

59

2

Jib 빌드가 83%에서 멈추는 문제 해결(windows 사용자)

1

61

1

미션 제출 방식 건의

0

52

0

트랜잭션 내 Redis I/O 에 대한 궁금한점

1

54

1

미션 진행 방식에 대한 질문입니다.

0

69

1

파킹 페이지와 대기열 큐 질문입니다.

1

58

1

낙관적락 질문있습니다.

0

59

1

댓글순서부여방식

0

61

1

movablePageCount와 pageSize 상수

0

48

1

JPA와 네이티브 쿼리

0

63

1

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

122

2

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

85

2

구현 방법에 대한 문의

0

104

2

MSA 통신방식에 대해서 질문 있습니다.

0

69

1

Request Failed 가 뜹니다.

0

115

2

mysql 의 bitmap

0

92

1