¿Cuál es la mejor práctica para almacenar en caché los resultados de búsqueda paginados cuyo orden / propiedades se pueden cambiar?
Digamos, en mi solicitud, alguien quiere ver los últimos 20 hilos de discusión (de 10,000). Se enviaría una solicitud a la base de datos, a través de servlet
, para obtener los primeros 20 registros de la tabla de hilos de discusión como XML / JSON. Si luego quieren ver los próximos 20, van a la siguiente página de resultados y esto dispara otra solicitud para obtener el siguiente lote (límite y compensación = 20, etc.).
Para reducir la carga del servidor y la espera del cliente, me gustaría almacenar en caché las páginas de resultados anteriores. Sin embargo, tengo dos preguntas:
- La tabla en la que se muestran los resultados se puede ordenar por más de un atributo (es decir, fecha de creación de subprocesos, autor de subprocesos, última fecha posterior). Esto significa que una declaración como 'primeros 20 resultados' no tiene sentido sin contexto (es decir, por qué estamos ordenando). ¿Cómo comunica el front-end, entonces, al back-end lo que ya ha cargado? Lo primero que pensé fue usar ID para cada resultado, pero enviarlos de vuelta al servidor en solicitudes posteriores (y filtrar los resultados basados en ellos) sería tan lento como enviar todo a ciegas. ¿Cómo puedo hacer esto?
- ¿Qué sucede si un atributo de un resultado devuelto anteriormente (es decir, la fecha posterior más reciente) ha cambiado? Luego necesitamos una forma de verificar cada resultado para ver si se ha modificado del lado del servidor desde que se paginó. ¿Cómo puedo hacer esto?
ajax
caching
pagination
bienes
fuente
fuente
Respuestas:
Parece que lo que necesita es un contenedor para todos los parámetros que definen una página (por ejemplo,
pageNumber
,pageSize
,sortType
,totalCount
, etc.) y utilizar esteDataRequest
objeto como la clave para su mecanismo de almacenamiento en caché. Desde este punto, tiene una serie de opciones para manejar el caché:Los dos primeros pueden involucrar un mecanismo de planificador para disparar en algún intervalo o basado en un evento. El último podría ser el más simple si tiene un único punto de acceso a datos.
Por último, como mencionó @DanPichelman, puede convertirse rápidamente en un algoritmo demasiado complicado que supera los beneficios, así que asegúrese de que la ganancia en el rendimiento justifique la complejidad del algoritmo.
fuente
Probablemente lo manejaría así:
fuente
Solo una idea: en su llamada al servidor, pase los parámetros habituales más una matriz de hash MD5 que representan las páginas de datos vistas en caché actualmente vistas anteriormente.
La llamada de retorno contendría todos los datos habituales para la nueva página actual, más actualizaciones para las páginas desactualizadas vistas anteriormente. Puede usar el viejo hash como clave.
Primero recomendaría muchas pruebas de rendimiento y sincronización: su código del lado del cliente será mucho más complicado de lo que sería si simplemente accediera al servidor para cada página de datos. Asegúrese de que la complejidad adicional resulte en una mejora significativa.
fuente