2011-03-10 4 views
0

기본적으로 이벤트라고하는 테이블이 있습니다 :MySQL (& php)을 사용하는 라이브 타이머

id | 제목 | 카운트 다운 | 설명 | 활성 | 만료 | created_at | updated_at

MySQL 또는 PHP를 사용하여 "라이브"이벤트를 만드는 방법을 개념적으로 알기 시작했습니다. 그래서 Cron을 참조하는 PHP 나 직선적 인 SQL을 사용하는 이벤트를 사용할 수 있다고 생각했습니다. | ID : 내 테이블에

재구성 :

이벤트는

그래서 내 생각은 다음이었다 제목 | 설명 | created_at | updated_at

event_queue : id | event_id

active_events : event_id | 카운트 다운 | 반복

만료 된 날짜 : event_id | expired_at

그렇다면 초마다 active_events에서 최대 100 행을 업데이트하도록 라이브 타이머를 만들려면 어떻게해야합니까? 다음 안으로 들어갈 active_events하는

데이터 예이다 :

EVENT_ID : 1 카운트 : 20 (20 분), 반복 90

I가 카운트를 감소 할 매초 때 그것을 0을 치면 반복 횟수가 감소하고 20으로 카운트 다운이 시작됩니다. 반복 횟수가 0이고 카운트 다운이 0이면 항목을 완전히 제거한 다음 expired_events에 이벤트를 보관하십시오. 다시 말하지만 active_events 안에는 최대 100 개의 행만있을 것입니다.

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

기본적으로 이것은 사람들이 사무실에서 투표 할 수있는 내부 응용 프로그램이며 투표가 완료되지 않으면 사라집니다. 위의 구조는 내가 원하는 방식이고 작동하는 방식입니다.

의견이 있으십니까? (나는 점심에 가야하고이를 업데이트하거나 나중에 어떤 게시물에 댓글을 남길 것입니다)

편집 :! 점심 먹고 ... 나는 카운트 다운이 조치가 배치 될 때마다 재설정 할 필요가 있습니다 것을 잊었다 그것 (사용자 투표). 내 두뇌와 생각을 위해서 누군가가 이벤트 중 하나를 수락 할 때마다 accept_events에 저장되고 active_events 카운트 다운을 20으로 재설정해야한다고 말하십시오.

여기 내 서버의 최상위 이벤트는 mysql 이벤트 하지 :

는 VM 인스턴스 MACBOOK에서 실행 PRO

이 이벤트없이

최고 - 11시 56분 59초 1시 29분, 1 사용자,로드 평균 최대 : 0.11, 0.06, 0.01 작업 : 총 92 개, 실행 중 2 개, 수면 중 88 개, 중지 2 개, 좀비 CPU : 0.0 % us, 0.0 % sy, 0.0 % ni, 99.7 % id, 0.0 % wa, 0.0 % hi, 0.3 % si, 0.0 % 일 의 Mem : 510552k 총 사용 499364k, 11188k 무료, 74316k 버퍼 스왑 : 0K 사용 1048568k 총, 1048568k 무료, 251872k 캐시

이 예약 된 200 행에서 다음 SQL을 실행하는 이벤트에 있습니다 :

업데이트 테스트 설정 타이머 = 타이머 1

최고 - 12시 0분 8초 1시 32분, 1 사용자,로드 평균 최대 : 0.06, 0.04, 0.00 작업 : 92 총 2 실행, 88 수면 , 2 중지됨, 0 좀비 Cpu : 0.3 % sy, 0.3 % sy, 0.0 % ni, 99.0 % id, 0.0 % wa, 0.3 % 안녕, 0.0 % si, 0.0 % st Mem : 510552k total, 501720k 사용, 8832k 무료, 74996k 버퍼 스왑 : 1048568k 총 사용 0K,

편집 # 2 캐시 1048568k 무료, 253244k : 여기가 무슨 뜻인지의 스케치입니다 - http://oi51.tinypic.com/29c1bp4.jpg

답변

0

매초마다 실행되는 스크립트를 작성하고 작은 테이블을 업데이트했습니다. 내 서버에서 매일 약 250 만 개의 고유 한 조회수가 있으며 성능 저하가 거의 발생하지 않았습니다.

나는 매초마다 값을 감소시키는 200 개의 레코드 테이블을 가지고 있습니다.

timer | location_id | queue_id 

레코드가 0에 도달하면, 나는를 보이지 않아요, 내가 지금이 나중에 작업을 수행하는 다른 방법을 생각할거야 ... 다음 타이머를 재설정 다음 queue_id을 잡아 거기에 삽입 나쁜 성능 모두에서 충돌 ... 내가 필요하다면, 나는 이것에 대해 내 자신의 서버/데이터베이스를 가질 수 있습니다.

0

타이머 저장소에 대한 실제 시간을 저장하지 마십시오가 그것이 끝날 예정이며 항상 현재 시간과 비교할 시간. 필요한 경우 완료 시간을 업데이트하십시오.

+0

까다로운 점은 누군가가 "투표"하거나 이벤트에 대한 작업을 수행 할 때 타이머가 재설정된다는 것입니다 (비슷하게 재설정되는 것과 유사). 나는 아직도 이것을 할 수 있을까? – Jordan

+0

예. 각 리셋에 대해 생각하면 타이머가 끝날 때의 타임 스탬프가 변경됩니다 .. 코드에서 시간을 표시 할 때 현재 시간을 종료 시간과 비교하고 그 차이를 표시합니다. 그래서 당신은 오직 db에서 매우 비실용적 인 실시간으로 변화하지 않는 변화에 대한 끝 시간을 업데이트하고 있습니다. –

+0

나는 현재의 "라이브"이벤트 이후에 진행될 모든 이벤트의 시작 시간을 업데이트하지 않고도 모든 로직을 수행하고 "라이브와 같은"타이머를 만드는 방법을 여전히 볼 수 없습니다. – Jordan

관련 문제