¿Cómo guardo en caché el resultado de db_query ()?

9

Solía views_get_view_result()obtener resultados de una vista porque era conveniente en ese momento. El resultado de la consulta rara vez cambia; Podría usar el almacenamiento en caché de vistas durante 6 días.

Si quisiera convertirlo en una llamada, db_query()¿cómo podría habilitar el almacenamiento en caché?

uwe
fuente

Respuestas:

9

No importa para el almacenamiento en caché si usa vistas o db_query (). El almacenamiento en caché funciona de la misma manera, la forma en que se obtienen los datos cuando se pierde el caché depende completamente de usted.

  1. Cree una ID de caché para identificar su entrada de caché. Puede ser una cadena simple y codificada o algo complejo basado en argumentos, etc.
  2. Verifique si se puede cargar desde el caché.
  3. De lo contrario, reconstruya los datos y póngalos en la caché con el tiempo de vencimiento deseado.

Para ver algunos ejemplos, puede ver las funciones que usan cache_get () , por ejemplo variable_initialize () .

Si su función se llama varias veces, entonces probablemente desee combinarla con un caché estático, consulte, por ejemplo, archiver_get_info () . Y si la reconstrucción de datos es realmente lenta, puede evitar que ocurra varias veces utilizando el marco de bloqueo como lo hace variable_initialize ().

Tenga en cuenta que el almacenamiento en caché de una sola consulta solo tiene sentido si es lento, porque cache_get () también es una consulta de base de datos a menos que use un backend de caché alternativo como Memcache.

Y, por último, Vistas tiene el almacenamiento en caché ya incorporado y se puede configurar en su vista. Entonces esa podría ser una opción también.

Berdir
fuente
Golpéame;) Dejaré mi respuesta como un ejemplo de código, pero esta es una información mucho más útil
Clive
¿Pensé que las instancias de PDO no eran serializables?
mpdonadio
1
No, no lo son, pero eso no es relevante. No almacena en caché el recurso de resultado pdo, almacena en caché las estructuras de datos que realmente obtiene de esa consulta.
Berdir
Yo diría que es muy relevante. @MotoTribe estaba preguntando sobre el almacenamiento en caché de resultados db_query(), y tener que almacenar en caché el valor $results->fetchAll()y no $resultses clave para que realmente funcione.
mpdonadio
7

No creo que la capa de base de datos tenga ningún mecanismo de almacenamiento en caché incorporado (aunque podría estar equivocado), pero podría hacer uso de la API de caché predeterminada.

Este es solo un ejemplo básico que almacenará en caché los resultados de una consulta para obtener nodos de cierto tipo:

function MYMODULE_get_nodes_by_type($type) {
  // Setup a cache ID
  $cid = 'MYMODULE:node_types:' . $type;

  // If a cached entry exists, return it
  if ($cached = cache_get($cid)) {
    return $cached->data;
  }

  // Otherwise load the data
  $data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();

  // And cache it
  cache_set($cid, $data, 'cache', strtotime('+6 days'));
}
Clive
fuente
3

Además del mecanismo estándar cache_set / cache_get que proporciona Drupal, si está utilizando MySQL como su base de datos, puede habilitar el caché de consultas , que puede almacenar en caché los resultados de las vistas, o cualquier otra consulta de la base de datos, de forma transparente. mysqltuner puede ayudar a encontrar buenos valores para el tamaño del caché.

Solo tenga en cuenta que si está escribiendo mucho en la base de datos, el almacenamiento en caché de consultas se vuelve menos efectivo debido a la forma en que funciona la estrategia de invalidación de caché (una escritura en una tabla invalida todas las entradas que SELECCIONAN o SE UNEN a esa tabla).

También hay un mecanismo de almacenamiento en caché para PostgreSQL , pero no tengo experiencia directa con él.

mpdonadio
fuente
3

Recientemente descubrí el módulo de acciones de caché . Con este módulo, puede configurar el almacenamiento en caché de su vista en Caché activada por reglas y crear una regla para invalidar el caché en vistas específicas y pantallas de vistas.

Por ejemplo, la memoria caché para una vista que enumera nodos de un tipo de contenido específico se puede vaciar cuando se crea un nuevo nodo de ese tipo de contenido.

semana anterior
fuente