2010-04-08 53 views
2

나는 사용자 생성 콘텐츠가있는 웹 사이트를 구축 중입니다. 홈 페이지에서 생성 된 모든 항목의 목록을 표시하고보기 카운터로 정렬 할 수 있기를 원합니다. 그건 쉽지는 않지만 여러 카운터가 필요합니다. 마지막 날, 지난 주 또는 지난 달 또는 전반적으로 가장 많이 방문한 항목이 무엇인지 알고 싶습니다.일별, 주간 및 월간 페이지 카운터보기

첫 번째 아이디어는 항목의 DB 테이블에 4 개의 카운터 열을 만드는 것이 었습니다. 일일, 주간, 월간 및 전체에 대해 하나씩, 24 시간마다 매일 카운터를 지우는 크론 작업을 생성하고 7 일마다 매주 카운터 등을 작성합니다.

하지만 내 문제는 주간 카운터가 정리 된 후 가장 많이 본 항목이 무엇인지 알고 싶으면 어떻게 될까요?

내가 필요로하는 것은 지속적인 카운터를 만드는 효율적인 방법입니다.이 카운터는 너무 오래된 모든 페이지보기마다 줄었고 새로운 페이지보기마다 증가했습니다.

지금은 redis server 인 솔루션을 생각하고 있지만 아직 해결 방법이 없습니다.

저는 여기에 일반적인 아이디어를 찾고 있습니다 만, 저는 Ruby on Rails에서이 응용 프로그램을 개발 중입니다.

답변

3

타임 스탬프와 사용자 ID 또는 저장할 수있는 데이터가있는 각 페이지에서 조회수를 추적하는 것이 좋겠다고 생각하는 경우 카운터를 계산하고 나중에 변경할 수 있습니다. 사용하기 쉬운 형식. 엔티티 (페이지) 사용자 ID와 타임 스탬프가있는 테이블이 좋습니다. 페이지가 요청 될 때마다 추가하면됩니다.

삽입 수를 줄이려면 소프트웨어에서 함께 삽입 할 수 있습니다. MySQL 용 here과 같은 다중 행 삽입을 구성하면 오버 헤드가 줄어 듭니다. 설명대로 삽입을 구성하고 삽입까지 저장할 클래스가 필요할 것입니다. 한 가지 아이디어는 시간을내는 것뿐만 아니라 일렬로 행 수를 수정하여 서버가 이동하면 대부분 히트 x 행을 잃어 버릴 수 있다고 말할 수 있습니다.

삽입 트리거의 전체 배치가 완료된 후에 만 ​​실행될 수있는 MySQL 트리거가 있습니다.이 트리거를 사용하면보고 테이블을 업데이트하여 메인 조회 추적 테이블에 지속적으로 도달 할 필요가 없습니다.

또한 실제로 처리량이 높아야 할 경우 자체 샤드로 분리되어 Ajax 호출을 통해 액세스하여 조회 추적을 수행하고 카운트를받습니다.

+0

나는 그것도 생각했다. 그러나 이것은 필자가 큰 쓰기 권한을 가진 여분의 테이블을 필요로한다는 것을 의미한다. 정확히 내가 여기서 피하려고하는 것이다. – jigfox

+0

항상 일괄 처리를 수행하거나이 테이블에 대한 쓰기 작업을 수행하면 매 x 분마다 일괄 적으로 삽입하는 트랙 히트 기능이 호출됩니다. 실시간 결과를 포기하고 있지만 괜찮을 수 있습니다. 일괄 적으로 히트 테이블을 삽입 한 경우 필요에 따라 개수의 보고서 테이블을 채우는 트리거를 만들 수 있습니다. –

+0

본 적이 한번도 보지 못했습니다. MySQL DB를 사용하고 있습니다. 데이터베이스에 일괄 적으로 쓰기위한 예제가있는 사이트에 대한 링크가 있습니까? – jigfox

1

당신이 할 수있는 일은 방문한 날짜와 시간 (타임 스탬프)을 저장하는 것이고 무엇인가 방문 할 때마다 이것을 할 것입니다. 방문한 내용을 검색하려는 경우 날짜 범위 (시간 소인) 내에있는 항목을 선택하여 함께 추가합니다.

또는

각 링크의 그들이 방문하는 모든 일에 대한 자신의 각각의 행이됩니다. 하루에 한 번 이상 방문하면 이미 존재하는 값에 +1이 추가됩니다.

주일이 오늘보다 7 일 이전이 아닌 일요일 토요일 일 경우 두 번째 예를 사용하고 매일 대신 주간 저장을 수행 할 수 있습니다. 그래서 word라는 단어를 week라는 단어로 바꿔 데이터 저장량을 줄입니다.

나는 당신이 거대한 데이터 저장소를 피하기를 원한다는 것을 알지만, 이것이 작동하기를 원하는 범위까지 나는 이것보다 훨씬 더 잘 보이지 않는다.두 번째 예를 사용할 수 있으며 주일이 오늘보다 7 일 이전이 아닌 일요일이면 토요일 대신 일일 저장을 할 수 있습니다.

일부 설명서를 본 후 regis 서버를 사용할 수 있습니다.

SET link_id|date => "visit_count" 

이 당신이 |로 구분 date 또는 무엇 적 문자 사용하려는 함께 호출 무엇이든 link_id 또는 저장합니다. 해당 키 - 값에는 visit_count을 저장합니다.

이 날짜에 해당 링크에 히트를 추가한다고 가정하면 GET link_id|date을 입력 한 다음 +1을 visit_count에 추가 한 다음 위에 표시된 방식으로 다시 저장합니다.

특정 날짜에 대한 조회수를 얻으려면 GET link_id|date으로 다시 방문하십시오.

link_id, datevisit_count을 적절한 값으로 바꾸려면 루비 온 레일을 사용하기 만하면됩니다.

희망이 도움이 될 것입니다.

+0

좋은 생각인데, 모든 페이지 뷰를 데이터베이스에 쓰고 싶지 않기 때문에 redis 서버 또는 이와 비슷한 방식으로이를 수행하는 우아한 방법을 알고 계십니까? – jigfox

+0

불행히도 저는 Redis 서버를 사용하지 않았기 때문에 어떻게하는지 설명 할 수 없었습니다. Al tho 나는 다른 생각을 더했습니다. –

+0

@ Jens Fahnenbruck 몇 가지 조사를 해봤는데 redis 서버에 대한 정보를 찾아 내 대답을 업데이트했습니다. –

0

ViewCounters라는 테이블을 만들면됩니다.

'pageId'열, 'day'열 및 'views'열이 있습니다. pageId는 열람중인 페이지와 일치하고 'day'는 열람 한 날과 일치합니다.

페이지를 볼 때마다 pageId와 현재 날짜가있는 ViewCounters 테이블의 행을 찾습니다 (아직없는 경우). 그런 다음 해당 행에 대한 '보기'열을 증가시킵니다.

이렇게하면 새 카운터를 만들고 기록에 액세스 할 때 유연성이 극대화됩니다. 또한 월간, 주간 및 일일 카운터의 조회수는 모두 매우 저렴합니다.

또 다른 큰 이점은 하루에 페이지 당 행만 표시된다는 점입니다. 그리 좋지 않습니다.

+0

가산 객체의 카운터 열과 같은 문제 . DB에 대한 쓰기 액세스를 대폭 줄이고 싶습니다. – jigfox

+0

잘 모르겠습니다. 문제가 무엇인지 압니까. 페이지 뷰 당 하나의 행 (간단히 말해서 발견되는 행)에 쓰는 것보다 더 좋은 방법이 있습니까? 편집 : 아 - 당신은 일괄 쓰기 캐시 싶습니다. 말이된다. 한 가지 옵션은 페이지 뷰를 파일 ([pageid] .data 또는 이름과 같은 이름)에 저장하는 것입니다. 매일, cron 일괄 처리를 데이터베이스에 쓰고 파일을 삭제하십시오. 그런 다음 하루에 한 번만 DB에 씁니다. – Cam

+0

예, 일괄 쓰기보다 캐시하고 싶지만 파일 쓰기가 훨씬 비쌉니다. DB-Update – jigfox

관련 문제