Qual é a melhor prática para armazenar em cache os resultados da pesquisa paginada cujas ordens / propriedades podem ser alteradas?
Digamos que, no meu aplicativo, alguém queira ver os últimos 20 tópicos de discussão (de 10.000). Uma solicitação seria enviada ao banco de dados, via servlet
, para buscar os 20 primeiros registros da tabela de threads de discussão como XML / JSON. Se eles querem ver os próximos 20, vão para a próxima página de resultados e isso dispara outra solicitação para obter o próximo lote (limite e deslocamento = 20, etc.).
Para reduzir a carga do servidor e a espera do cliente, gostaria de armazenar em cache as páginas anteriores dos resultados. No entanto, tenho duas perguntas:
- A tabela na qual os resultados são mostrados pode ser ordenada por mais de um atributo (por exemplo, data de criação do encadeamento, autor do encadeamento, data do último post). Isso significa que uma declaração como 'primeiros 20 resultados' não faz sentido sem contexto (ou seja, pelo que estamos ordenando). Como o front-end, então, comunica ao back-end o que ele já carregou? Meu primeiro pensamento foi usar IDs para cada resultado, mas enviá-los de volta ao servidor em solicitações subsequentes (e filtrar os resultados com base neles) consumiria tanto tempo quanto enviar tudo de volta às cegas. Como posso fazer isso?
- E se um atributo de um resultado retornado anteriormente (ou seja, a data posterior mais recente) for alterado? Precisamos então de uma maneira de verificar cada resultado para ver se ele foi modificado no lado do servidor desde que foi paginado. Como posso fazer isso?
ajax
caching
pagination
goodsquishy
fonte
fonte
Respostas:
Parece que você precisa é um wrapper para todos os parâmetros que definem uma página (por exemplo,
pageNumber
,pageSize
,sortType
,totalCount
, etc.) e usam esseDataRequest
objeto como a chave para o seu mecanismo de cache. A partir deste ponto, você tem várias opções para lidar com o cache:Os dois primeiros podem envolver um mecanismo do planejador para disparar em algum intervalo ou com base em um evento. O último pode ser o mais simples se você tiver um único ponto de acesso a dados.
Por fim, como o @DanPichelman mencionou, ele pode rapidamente se tornar um algoritmo muito complicado que supera os benefícios, portanto, verifique se o ganho no desempenho justifica a complexidade do algoritmo.
fonte
Eu provavelmente lidaria com isso assim:
fonte
Apenas um pensamento - na chamada do servidor, transmita os parâmetros usuais mais uma matriz de hashes MD5 que representam páginas de dados visualizadas anteriormente em cache no momento.
A chamada de retorno conteria todos os dados habituais para a nova página atual, além de atualizações para quaisquer páginas desatualizadas visualizadas anteriormente. Você pode usar o hash antigo como chave.
Eu recomendaria muitos testes de desempenho e tempo primeiro - o código do lado do cliente será muito mais complicado do que seria se você simplesmente acessasse o servidor para cada página de dados. Verifique se a complexidade extra resulta em uma melhoria significativa.
fonte