안녕하세요 이번 시간에는 기존 좋아요 기능에 대해 문제점을 개선시키는 글입니다.

기존 좋아요 정리

Untitled

유저는 상품마다 좋아요 클릭 시 Redis에 상품 좋아요 개수+ 유저가 좋아요를 한 대상을 관리의 로직으로 이루어져 있습니다. 즉 저는 좋아요를 Redis에 저장하고 있습니다.

문제상황

물품의 좋아요 같은 경우는 Redis에 두는 게 과연 안전할까?라는 의문을 가졌습니다.

Redis는 메모리이기 때문에 언제든 데이터가 사라질 수도 있습니다. 그래서 PRODUCT 테이블에 Likes 컬럼을 추가하여 DB에 좋아요한 개수를 시간마다 스케줄러로 업데이트 시켜줘야 좋을 것 같다고 생각했습니다.

Untitled

그래서 다음과 같이 multi 로직의 순서를 말씀드리면

  1. 상품마다 좋아요한 유저들 저장
  2. 유저가 좋아요한 상품 저장
  3. 좋아요한 상품들 저장
  4. 그리고 스케줄러로 3번 과정에서의 저장된 상품목록(좋아요 클릭된 상품목록)을 스케줄러로 업데이트를 실행합니다.

Untitled

🤣그러나 이렇게 쉽게 마무리되지 않았습니다

Untitled

큰일…

Redis에서 좋아요 클릭된 상품 목록을 가져오지만, 만약 스케줄러가 1시간 간격으로 실행된다면 1시간동안 좋아요한 상품들이 100만 개면 100만 개의 데이터를 가져와야 합니다. get연산 시간 복잡도가 O(1)이라도 한꺼번에 100만 번 요청하는 것은 무리가 생긴다고 생각했습니다.

방법