랜덤 게시글을 제공하면서 수만개의 게시글에서 1개를 매번 뽑는다는게 약간은 비효율이 발생할 수 있다고 보고 고민을 해보았습니다.

 

5만개에서 1개를 뽑는다고 가정하겠습니다.

 

1.db 에서 5만개를 리스트업 한 후 1개를 뽑아 매번 제공한다.

 

VS

 

2.db의 5만개 리스트를 php 의 $data에 캐시로 저장한 후 1개를 rand로 뽑아 제공한다.

 

 

db에 부하를 최소화 할 수 는 있을 거라는 생각은 들었습니다. 랜덤글을 읽는 행위를 한다는건 연속적으로 이용한다는 면에서 본다면 캐시된 데이터에서 1개씩 뽑는 과정을 반복한다면 효율이 많이 높아질 것 같구요.

 

5만개의 요소를 가진 배열을 캐시화 해서 캐시 데이터를 읽고 읽은 데이터에서 1개를 rand() 하는데 새롭게 발생되는 문제가 있는지 궁금합니다.

  • profile
    5만개의 무엇을 캐시에 담는지에 따라 다르겠습니다.
    5만개의 글 제목, 내용, 글쓴이 정보 등을 전부 담는다? 용량이 어마어마하겠지요.
    5만개의 글 번호만 배열로 만들어서 담는다? 이건 해볼만할 것 같습니다.

    배열에 담았던 데이터를 랜덤으로 뽑는 방식도 중요합니다.
    모조리 셔플하고 나서 맨 처음/마지막 것을 뽑는다? 어마어마한 낭비지요.
    일단 rand()로 n이라는 숫자를 뽑은 후, 배열에서 n번째 데이터를 콕 찝어 가져온다면 훨씬 낫고요.
  • profile profile

    해보겠습니다!! 감사합니다.

     

    어차피 지금 db에서 매번 1개를 뽑는거에 비하면 효율이 나빠지지는 않을테니까요.

  • profile

    약간 발상의 전환을 해서, 5만개중 랜덤하게 100개의 글을 벌크로 읽어서 캐시해 놓은 후, 100개 중에서 랜덤하게 (예를들어) 500번 보여주는 식으로 해볼수도 있지 않을까 합니다. 한 사람이 100개를 다 읽지는 않을테고 다른 사람이 읽을테니까 랜덤 효과는 유지되겠죠. 일정시간 지나면 100개 목록을 새로 만들구요...

  • profile profile

    100개를 뽑아서 100개를 요청 순서에 따라서 순차적으로 보여줘도 되긴 하겠지만 그러면 아예 코드 구성을 새로해야하고 동일 사용자의 요청에 대응해서 순차적으로 다음글을 제시하는 것은 제 능력 밖인 것 같아요.

    뭐 그것보다도 지금 대량이긴 하지만 db에서 가져온 목록을 캐시해서 이용하는 것으로도 db가 할일이 줄어서 굉장히 큰 개선이 있을 것으로 예상되어 이정도로 충분하게 개선했다고 생각하고 운영하려고 합니다.

    물론 지금 예시의 5만개는 가정이고 실제 제가 운영하는 곳은 아마 많아야 1만개가 조금 넘거나 할 것 같습니다.

     - 기존에는 매번 db에서 1개를 뽑았으니.........