Skip to content

[KP-110] 인기 공지 조회수 동시성 이슈 해결 #195

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Hyeri1ee opened this issue Mar 25, 2025 · 7 comments
Closed

[KP-110] 인기 공지 조회수 동시성 이슈 해결 #195

Hyeri1ee opened this issue Mar 25, 2025 · 7 comments
Assignees

Comments

@Hyeri1ee
Copy link
Contributor

Hyeri1ee commented Mar 25, 2025

🔨 Describe

조회수 기반 인기 공지를 mysql에서 직접 조회수를 업데이트하는 것 보다
redis에서 조회수를 관리하는 게 I/O 성능에서 낫다고 생각했고,
redis 조회수 갱신시
동시성 이슈를 해결하려 합니다.

✅ Tasks

[동시성 이슈로 인해 발생한 레디스 캐시 정합성 이슈] 참고
-> 해당 블로그의 watch를 이용하려 했는데, 기본적으로 락을 구현하는 방식이 아니라 동시성 문제를 해결하기 어렵다고 생각해
[Redis Transaction을 이용한 분산락(Distributed Lock)으로 동시성 해결하기]
-> 비관적락인 Redisson을 적용해보려고 합니다

🙋🏻 More

화이팅

Copy link

github-actions bot commented Mar 25, 2025

Jira Issue Created: KP-110
Branch Name:

@github-actions github-actions bot changed the title 최근 검색어 캐싱 및 동시성 이슈 해결 [KP-110] 최근 검색어 캐싱 및 동시성 이슈 해결 Mar 25, 2025
@Hyeri1ee Hyeri1ee self-assigned this Mar 25, 2025
@Hyeri1ee Hyeri1ee changed the title [KP-110] 최근 검색어 캐싱 및 동시성 이슈 해결 [KP-110] 인기 검색어 동시성 이슈 해결 Mar 26, 2025
@buzz0331
Copy link
Contributor

Redis에서 조회수를 관리한다는게 모든 공지사항에 대한 조회수를 Redis에 매핑해두고 그 조회수들을 업데이트 한다는건가요?
아니면 어떤 공지사항이 조회될 때 Redis에 일시적으로 조회수를 업데이트하고 최종적으로 MySQL에 있는 Notice 테이블에 조회수를 업데이트 한다는건가요..?

@Hyeri1ee
Copy link
Contributor Author

Hyeri1ee commented Mar 26, 2025

Redis에서 조회수를 관리한다는게 모든 공지사항에 대한 조회수를 Redis에 매핑해두고 그 조회수들을 업데이트 한다는건가요? 아니면 어떤 공지사항이 조회될 때 Redis에 일시적으로 조회수를 업데이트하고 최종적으로 MySQL에 있는 Notice 테이블에 조회수를 업데이트 한다는건가요..?

@buzz0331 후자로 생각하고 있습니다!

@Hyeri1ee Hyeri1ee changed the title [KP-110] 인기 검색어 동시성 이슈 해결 [KP-110] 인기 공지 조회수 동시성 이슈 해결 Mar 26, 2025
@buzz0331
Copy link
Contributor

음.. 후자로 했을 경우에 궁금한 점이 있습니다.

  1. Redis에서 MySQL로 업데이트 하는 주기는 어느정도로 생각하고 있나요? 너무 짧다면 공지사항 조회마다 조회 API -> Redis -> MySQL 과정을 거치기 때문에 오버헤드가 크고, 너무 길다면 인기 공지의 최신화가 늦어질 것 같아서욥.
  2. Redis에서 조회수를 관리하면 I/O 성능이 나아질 것 같다고 하셨는데, 혹시 어떤 부분에서 성능이 좋아지는 건지 알려주실 수 있을까요..?

@kmw10693
Copy link
Contributor

사실 저도 다른 분이 Redisson으로 분산락을 걸어서 조회수의 동시성과 정합성을 맞추는 것을 본 적이 있습니다.
그때 나온 얘기가 Redisson으로 락을 걸어서 조회수를 맞춰야할 정도로, 조회수가 중요한 데이터인가에 대해 얘기를 나눠본적이 있습니당
혹시 이것에 대해 어떻게 생각하시나용?

@Hyeri1ee
Copy link
Contributor Author

Hyeri1ee commented Mar 26, 2025

음.. 후자로 했을 경우에 궁금한 점이 있습니다.

  1. Redis에서 MySQL로 업데이트 하는 주기는 어느정도로 생각하고 있나요? 너무 짧다면 공지사항 조회마다 조회 API -> Redis -> MySQL 과정을 거치기 때문에 오버헤드가 크고, 너무 길다면 인기 공지의 최신화가 늦어질 것 같아서욥.
  2. Redis에서 조회수를 관리하면 I/O 성능이 나아질 것 같다고 하셨는데, 혹시 어떤 부분에서 성능이 좋아지는 건지 알려주실 수 있을까요..?

@buzz0331

  • Redis는 메모리 기반 저장소라 여기서 조회수를 관리하면, mysql (하드디스크에 저장) 에서 조회수 업데이트 해서 인기공지 조회수를 매번 가져오는 것보다 읽기 쓰기 작업을 빠르게 할 수 있을 것이라 생각했습니다!
  • 업데이트하는 주기는 사용자가 공지사항을 조회하는 빈도(트래픽)과 redis 메모리 사용량에 따라 달라질 것 같은데, 우선 초기 구현 시점에서는 이 정보를 알 수 없기 때문에 임의로 1시간으로 생각 중입니다~ 후에 추가적으로 조정해나가야할 부분이라고 생각합니다!
    구체화하는데 도움됐습니다 업데이트 주기나 Redis사용에 대해서 의견있으면 공유해주세용

@Hyeri1ee
Copy link
Contributor Author

사실 저도 다른 분이 Redisson으로 분산락을 걸어서 조회수의 동시성과 정합성을 맞추는 것을 본 적이 있습니다. 그때 나온 얘기가 Redisson으로 락을 걸어서 조회수를 맞춰야할 정도로, 조회수가 중요한 데이터인가에 대해 얘기를 나눠본적이 있습니당 혹시 이것에 대해 어떻게 생각하시나용?

@kmw10693
저는 필요하다고 생각합니다~! redis를 조회수에 사용하려는 주된 이유는 조회수 업데이트를 mysql 에서 하게 될 경우의 빈번한 I/O작업을 줄이는 것입니다. 특히 저희 서비스 이용자가 많아진다면, 인기 공지는 조회수를 기반으로 측정하기 때문에 이 부분에서 락을 적용해 조회수 업데이트 충돌을 막는것이 중요하다고 생각합니다. 제가 생각한 흐름은 이런데, 좋은 다른 방법이 있으면 공유해주세용

Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Mar 30, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Apr 2, 2025
Hyeri1ee added a commit to Hyeri1ee/backend that referenced this issue Apr 2, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants