수만개의 요소를 가진 배열 캐시해서 제공한다면 문제가 되나요?
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.2 |
랜덤 게시글을 제공하면서 수만개의 게시글에서 1개를 매번 뽑는다는게 약간은 비효율이 발생할 수 있다고 보고 고민을 해보았습니다.
5만개에서 1개를 뽑는다고 가정하겠습니다.
1.db 에서 5만개를 리스트업 한 후 1개를 뽑아 매번 제공한다.
VS
2.db의 5만개 리스트를 php 의 $data에 캐시로 저장한 후 1개를 rand로 뽑아 제공한다.
db에 부하를 최소화 할 수 는 있을 거라는 생각은 들었습니다. 랜덤글을 읽는 행위를 한다는건 연속적으로 이용한다는 면에서 본다면 캐시된 데이터에서 1개씩 뽑는 과정을 반복한다면 효율이 많이 높아질 것 같구요.
5만개의 요소를 가진 배열을 캐시화 해서 캐시 데이터를 읽고 읽은 데이터에서 1개를 rand() 하는데 새롭게 발생되는 문제가 있는지 궁금합니다.
댓글 4
5만개의 글 제목, 내용, 글쓴이 정보 등을 전부 담는다? 용량이 어마어마하겠지요.
5만개의 글 번호만 배열로 만들어서 담는다? 이건 해볼만할 것 같습니다.
배열에 담았던 데이터를 랜덤으로 뽑는 방식도 중요합니다.
모조리 셔플하고 나서 맨 처음/마지막 것을 뽑는다? 어마어마한 낭비지요.
일단 rand()로 n이라는 숫자를 뽑은 후, 배열에서 n번째 데이터를 콕 찝어 가져온다면 훨씬 낫고요.
해보겠습니다!! 감사합니다.
어차피 지금 db에서 매번 1개를 뽑는거에 비하면 효율이 나빠지지는 않을테니까요.
약간 발상의 전환을 해서, 5만개중 랜덤하게 100개의 글을 벌크로 읽어서 캐시해 놓은 후, 100개 중에서 랜덤하게 (예를들어) 500번 보여주는 식으로 해볼수도 있지 않을까 합니다. 한 사람이 100개를 다 읽지는 않을테고 다른 사람이 읽을테니까 랜덤 효과는 유지되겠죠. 일정시간 지나면 100개 목록을 새로 만들구요...
100개를 뽑아서 100개를 요청 순서에 따라서 순차적으로 보여줘도 되긴 하겠지만 그러면 아예 코드 구성을 새로해야하고 동일 사용자의 요청에 대응해서 순차적으로 다음글을 제시하는 것은 제 능력 밖인 것 같아요.
뭐 그것보다도 지금 대량이긴 하지만 db에서 가져온 목록을 캐시해서 이용하는 것으로도 db가 할일이 줄어서 굉장히 큰 개선이 있을 것으로 예상되어 이정도로 충분하게 개선했다고 생각하고 운영하려고 합니다.
물론 지금 예시의 5만개는 가정이고 실제 제가 운영하는 곳은 아마 많아야 1만개가 조금 넘거나 할 것 같습니다.
- 기존에는 매번 db에서 1개를 뽑았으니.........