순서 / 속성이 변경 될 수있는 페이지 매김 결과를 캐싱하는 모범 사례는 무엇입니까?


11

순서 / 속성을 변경할 수있는 페이지 매김 검색 결과를 캐싱하는 가장 좋은 방법은 무엇입니까?

내 응용 프로그램에서 누군가가 마지막 20 개의 토론 스레드 (1 만 개 중)를보고 싶어한다고 가정 해보십시오. servlet토론 스레드 테이블에서 처음 20 개의 레코드를 XML / JSON으로 가져 오기 위해을 통해 요청이 데이터베이스에 전송됩니다 . 그런 다음 다음 20 개를 보려면 다음 결과 페이지로 이동하여 다음 로트를 얻기위한 다른 요청을 시작합니다 (한계 및 오프셋 = 20 등).

서버로드와 클라이언트 대기를 줄이기 위해 이전 페이지의 결과를 캐시하고 싶습니다. 그러나 두 가지 질문이 있습니다.

  1. 결과가 표시되는 테이블은 둘 이상의 속성 (예 : 스레드 작성 날짜, 스레드 작성자, 최종 날짜)으로 정렬 될 수 있습니다. 이것은 '처음 20 개의 결과'와 같은 문장이 문맥없이 의미가 없다는 것을 의미합니다 (즉, 우리가 주문한 것). 그러면 프런트 엔드가 이미로드 된 내용을 백엔드와 어떻게 통신합니까? 내 첫 번째 생각은 각 결과에 ID를 사용하는 것이지만 후속 요청에서 서버로 다시 전송하고 결과를 기반으로 결과를 필터링하는 것은 모든 것을 맹목적으로 다시 보내는 것만 큼 시간이 많이 걸립니다. 어떻게해야합니까?
  2. 이전에 반환 된 결과의 속성 (예 : 가장 최근 포스트 날짜)이 변경된 경우 어떻게됩니까? 그런 다음 각 결과를 확인하여 페이징 된 이후 서버 측에서 수정되었는지 확인해야합니다. 어떻게해야합니까?

귀하의 예는 약간 거칠습니다. 100 개의 스레드 만 있다면 한 번에 100 개를 모두 다운로드하는 것이 가장 좋습니다. 10,000의 20을 당기면 다른 이야기입니다.
Dan Pichelman

@DanPichelman 죄송합니다. 조금 불분명했습니다. 10,000 이상이 될 것입니다.
goodsquishy

명확성을 위해 수정 된 번호입니다.
goodsquishy

이것이 http입니까? 그렇다면 URL을 기반으로 캐시하지 않는 이유는 무엇입니까? URL에 모든 매개 변수가 있습니다. 브라우저 인 경우 브라우저 캐시를 활용하십시오. 앱인 경우 캐시 만료를 설정하십시오. 안드로이드 발리는 꽤 잘 작동합니다.
frostymarvelous

답변:


7

당신이 필요로하는 페이지를 정의하는 모든 매개 변수 (예를 들어, 래퍼 것 같다 pageNumber, pageSize, sortType, totalCount, 등)이 사용 DataRequest하여 캐싱 메커니즘의 핵심으로 개체를. 이 시점에서 캐시를 처리하기위한 여러 가지 옵션이 있습니다.

  • 데이터가 얼마나 자주 변경되는지에 따라 캐시를 새로 고치는 일종의 시간 초과 메커니즘을 구현하십시오.
  • 데이터베이스 변경 사항을 확인하고 위의 매개 변수를 기반으로 캐시를 업데이트하는 리스너가 있어야합니다.
  • 동일한 프로세스에 의해 변경이 수행되면, 항상 변경 될 때마다 캐시를 ​​오래된 것으로 표시하고 페이지가 요청 될 때이 플래그를 확인할 수 있습니다.

처음 두 개는 일정 간격으로 또는 이벤트를 기반으로 트리거하는 스케줄러 메커니즘을 포함 할 수 있습니다. 단일 데이터 액세스 포인트가있는 경우 마지막 것이 더 간단 할 수 있습니다.

마지막으로 @DanPichelman이 언급했듯이 이점을 능가하는 지나치게 복잡한 알고리즘이 될 수 있으므로 성능의 향상이 알고리즘의 복잡성을 정당화해야합니다.


3

아마 다음과 같이 처리 할 것입니다.

  1. 서로 다른 순서를 서로 다른 순서로 취급하십시오. 각 고객이 가지고있는 것을 추적하거나 계속해서 다시 보내려면 추가 부기의 가치가 없습니다.
  2. 사용자 페이지가 나타날 때마다 캐시에서 즉시 표시되는 동시에 해시 또는 마지막 액세스 시간을 포함하는 서버로 GET을 보냅니다. 서버는 무언가가 변경된 경우에만 전체 페이지를 다시 보냅니다.
  3. 한 번에 둘 이상의 UI 페이지를 서버에서 검색하십시오. 예를 들어 UI에 20 개의 항목, 쿼리 60이 표시되는 경우이 항목을 테스트해야하지만 가장 효율적인 반환 크기는 일반적으로 한 페이지에 표시된 평균 데이터 양보다 클 것입니다. 또한 일부 페이지 넘김에 대해 UI의 응답 성이 향상됩니다.
  4. 프리 페치는 경계에 가까워지면 다시 시작됩니다. 이는 캐시에서 빠른로드 시간을 유지하는 데 도움이됩니다.

2

서버 호출에서 일반적인 매개 변수와 현재 캐시 된 이전에 본 데이터 페이지를 나타내는 MD5 해시 배열을 전달하십시오.

재 방문 전화에는 새로운 현재 페이지에 대한 모든 일반적인 데이터와 이전에 본 페이지가 오래 된 페이지에 대한 업데이트가 포함됩니다. 이전 해시를 키로 사용할 수 있습니다.

먼저 많은 성능 및 타이밍 테스트를 권장합니다. 클라이언트 측 코드는 각 데이터 페이지마다 서버를 누르는 것보다 훨씬 복잡합니다. 추가 복잡성으로 인해 의미있는 개선이 이루어 지도록하십시오.


답변 주셔서 감사합니다. 해싱에 대해 생각하고 있었지만 재정렬 시나리오에 도움이되는지 확실하지 않습니다 (즉, 충분히 세밀하지 않고 결과가 아닌 페이지 당 작동합니다). 마지막 단락이 좋은 점이라고 생각하며 가능한 솔루션의 복잡성이 성능상의 이점보다 중요하다고 생각하기 시작했습니다.
goodsquishy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.