2010-03-15 6 views
0

캘린더/일정 웹 응용 프로그램에 대한 캐싱 데이터와 관련하여 질문이 있습니다. 좋은 반응이 있습니다. 그러나, 나는 자바 스크립트에서 데이터를 캐싱하고 내 접근 방식을 변경하기로 결정했다.javascript 및 asp.net 캐싱 문제

$ ('body'). data() 객체의 캘린더 그리드에서 매일 열에 대해 HTML을 직접 캐싱하고있어 매우 빠른 페이지로드 시간 (거의 눈에 띄지 않음)을 제공합니다.

그러나 사용자가 아직 캐시에없는 데이터를 요청할 때 문제가 발생하기 시작합니다. 이 데이터는 서버가 ajax 호출을 사용하여 생성하므로 비동기식이며 주당 약 0.2 초의 데이터가 필요합니다.

현재 사용자가 서버에서 정보를 요청할 때 0.5 초를 차단하고 페이지 당 4 주 또는 페이지 변경 요청 (페이지 변경 요청 당 1 주일 추가)을 캐시하면되지만 이것이 의심 스럽습니다. 최적의 방법.

상황을 개선하는 방법에 대한 제안 사항이 있습니까?

은 요약하면 :

  • 매주 서버에서 검색하는 데 0.2 초 소요, 비동기.
  • 성능은 가능한 한 실시간에 가깝습니다. (그러나 데이터가 완전히 실시간 일 필요는 없습니다. 대부분의 약속은 사용자가 추가하므로 이후에 다시 캐시 할 수 있습니다.)
  • 로드 중 한 주일에 현재 4 주가 캐싱됩니다. 부족한.
  • 캐시에 1 년 ~ 21 초가 소요됩니다. 초기로드에는 너무 느립니다.

+1

이것은 OT 일 수 있으며 어떤 식 으로든 유치하지 않습니다. 서버 측 시간에 대해 할 수있는 일이 있습니까? 나는 당신이 ~ 0.2 초 후에 한 주를 얻는다는 것에 놀랐지 만, 2 주는 ~ 0.4 초가 걸린다. 나는 대부분의 백엔드에서 2 주간에 거의 정확히 1 주일 정도의 시간이 걸릴 것이라고 예상 했었을 것이다. 그 시간의 대부분은 요청을 설정하고, DB 풀이나 기타 등에서 연결을 확인하는 것이 었습니다. 실제 쿼리 그러나 다시 이것은 아마도 구약이고 아마도 당신의 인프라를 모른다는 것을 근거로합니다. :-) –

+0

예, 저는 서버에서 수행중인 작업에 대해 더 많은 정보가 필요하다고 생각합니다. 당신의 감속은 어디입니까? 일반적으로 그것은 DB에 있지만, 물론 그것은 다른 것입니다. – WVDominick

+0

아니요, 공정한 의견입니다. 실제로 전송 시간을 가져 왔습니다. (포함 된 경우 0.5에 가까워졌습니다.) 전송 속도를 고려하지 않았습니다. 이것은 로컬 ASP.net dev 환경에서 실행 중입니다. 디버그)가 필요합니다. 라이브 서버에 연결되면 라이브 설정이로드 균형을 유지하기 때문에 동일하게 유지된다는 보장이 없으므로 라우팅 등으로 인해 성능이 변할 수 있습니다. 1 년 동안 20 %의 수치 포함 된 송금입니다. 1 주일에 데이터 소스에서 HTML로 전환하는 데 ~ 0.2 초가 걸린다는 점을 더 많이 생각할 것입니다. –

답변

2

설명을 읽었을 때 비동기와 캐싱의 두 가지 사항을 생각했습니다.

왜 0.5 초에 대한

먼저

, 비동기를 차단하는 것? 왜 ajax 호출을 사용하지 않고, 콜백에서 검색된 정보로 페이지를 업데이트하십시오. 설정된 시간 동안 차단이 없으면 비동기 적으로 완료됩니다. 요청이 미처리이지만 여러 번의 클릭을 억제해야하지만 문제는 전혀 발생하지 않아야합니다.

setInterval 이상, setTimeout을 사용하여 백그라운드에서 인 페이지 캐시를 미리로드 할 수도 있습니다. 캘린더를 계산하거나 생성하는 데 드는 비용이 길고 데이터 크기가 상대적으로 작 으면 (특히 사용하지 않더라도 페이지 내 캐시에 월을 저장할 수있을만큼 작은 경우) 특히 유용합니다. 어쨌든이 작업을 수행하고있는 것처럼 들리지만 사용자가 캐시 된 데이터 범위를 벗어날 때만 차단하면됩니다.

내가 콜백 함수 상상하고

지능형 캐싱 - 현재 선택한 날짜가 캐시 된 데이터의 "끝"에 있는지 확인합니다 - - 아약스 호출이 완료 될 때 호출되는 하나를 중 하나 첫 주 또는 마지막 주 (또는 무엇이든). 사용자가 가장자리에 있다면 콜백은 캐시를 최대 4 주까지 또는 80 % 유스 케이스에 맞는 시간대에 낙관적으로 미리로드하는 추가 요청을 보낼 수 있습니다.

사용자 당 기준으로 서버 쪽에 생성 된 달력 데이터를 캐싱하는 것도 고려해 볼 수 있습니다. 이러한 작업을 생성하는 데 CPU 및 시간이 많이 소요되는 경우 한 번 생성하여 서버 측 캐시에 유지하고 사용자가 업데이트를 수행 할 때만 무효화하는 것이 좋습니다. x64 서버와 싼 메모리로 인해 이것은 아마도 실현 가능성이 높습니다. 유스 케이스에 따라 사용자가 응용 프로그램에 연결하는 두 번째 시간 인 훨씬 유용한 상호 작용을 할 수 있습니다. 사용자가 달력을 요청하기 전에 사용자별로 서버 측 캐시를 미리로드하는 것을 고려할 수도 있습니다.

+0

비동기 : 그래, 실제로 캐싱을 다시 호출하는 페이지 메서드의 콜백을 사용하고 있는데, 제대로 작동하는 것 같다. 요청을 게시하는 동안 사용자가 아무 것도 클릭 할 수 없도록하기 위해 UpdatePanel을 사용하는 것을 차단하고 그 주에 대한 빠른 처리를 보장합니다. 지능형 캐싱의 경우, '다음'버튼을 반복적으로 클릭하여 특정 주에 항해하려는 사용자의 상황을 처리하기가 어렵습니다. 점검을 수행하고 데이터를 다시 얻을 수있는 충분한 시간이 없기 때문입니다. –

+0

서버 쪽 캐싱의 경우 그룹 환경에서는 실제로 실행 가능하지 않지만 다른 사용자가 로그 오프하거나 로그온하는 동안 약속을 변경하게하는 것이 가능합니다. 순수한 클라이언트 쪽이라면 페이지를 다시로드 할 때 새로 고쳐지기 때문에 데이터가 항상 새로운 상태로 유지됩니다. –

+0

"충분하지 않은 시간"문제에 대해. . . 지능적으로 처리 할 수있는 방법이 있습니다. 한 가지 방법은 click과 결과로 나오는 ajax 호출 사이에 setTimeout을 통해 지연을 도입하는 것입니다. 지연이 만료되기 전에 추가 클릭이 발생하면 타이머를 재설정하고 더 기다립니다. 여러 개의 다음 클릭이 서로 650ms 이내에 발생한다고 가정 할 수 있습니다 (예 :). 따라서 한 행에 세 번의 클릭이 발생하고 650ms 이상의 지연이 발생하면 "이 week ","next week "및"week week "를 3 개의 개별 ajax 호출로 호출합니다. – Cheeso