2009-08-21 2 views
2

Google AppEngine 용 애플리케이션을 작성했으며 요청 당 CPU 시간을 줄이기 위해 memcache API를 사용하고 싶습니다. 필자는 응용 프로그램을 프로파일 링하여 CPU 시간의 상당 부분이 데이터 렌더링에 대한 템플릿 렌더링 및 API 호출에 있으며 동료와 채팅 한 후 (아마도 조금 일찍?) 캐싱에 대한 결론에 이르렀습니다. 페이지 렌더링 HTML의 청크 (chunk)는 요청 당 CPU 시간을 상당히 줄입니다. 캐싱 패턴은 꽤 깨끗하지만, 의 질문은 캐싱과 추론의 논리를 내세우는이 내게 약간의 수수께끼입니다.AppEngine 애플리케이션에 캐시를 제거하는 로직을 배치하는 가장 좋은 장소는 어디입니까?

예를 들어, 응용 프로그램의 기본 페이지에 공지 섹션이 있다고 가정합니다.

  • 먼저 새 발표는 추가되는
  • 계정에있는 사람을위한 읽기, 및
  • 오래된 발표가 삭제되는

일부 :이 부분은 후에 다시 렌더링 될 필요가있을 것이다 evict_announcements_section_from_cache() 메서드 호출 위치에 대한 옵션 :

  • 발표 모델의 .delete().put() 방법
  • RequestHandler의 .post() 방법
  • 다른 어느 곳에서든지?

그런 다음 RequestHandler를의 페이지 가져 오기에, 나는 잠재적으로 표준 memcache에 패턴 (미스, 반환 값에 캐시에 추가 캐시를 확인)을 따를 것이다 get_announcements_section()를 호출 할 수 있고 그 덩어리를위한 템플릿에 아래로 그 HTML을 통과 그 페이지.

캐시 - 추론 논리를 Model 또는 Controller/RequestHandler 또는 다른 곳에 두는 것이 일반적인 디자인 패턴입니까? 이상적으로 나는 코드 전체에 촉수가있는 논리를 피하는 것을 피하고 싶습니다.

http://github.com/jamslevy/gae_memoize/tree/master

그것은 함수의 실행을 강제로 같은 일을 가능하게, 깊이있는 조금 더 (당신이 원하는 때

답변

1

나는 오픈 소스에 Github에서 프로젝트를 바로 그러한 장식을 가지고 캐시를 새로 고침) 또는 로컬 캐싱 강제로 ... 내 애플 리케이션에 필요한 것들이 있었고, 그래서 내 memoize 장식으로 그들을 구운.

1

일반 퇴거에 대한 대안의 몇 :

  1. 명백한 하나 퇴거, 대신 타이머를 설정하지 마십시오. 심지어 아주 짧은 시간 (몇 초)이라 할지라도 인기있는 앱에 대한 엄청난 노력을 줄여 줄 수 있습니다. 사용자가 데이터를 알지 못해도 몇 초 오래 될 수 있습니다.
  2. 데이터가 변경 될 때 변경되는 기준에 따라 캐시 키를 생성하는 대신 해지 할 수 있습니다. 예를 들어 가장 최근 발표의 키를 검색하는 것이 저렴한 경우 캐시 된 데이터 키의 일부로이를 사용할 수 있습니다. 새로운 공지 사항이 게시되면 존재하지 않는 키를 찾고 새 키를 만듭니다.
관련 문제