Come si memorizza nella cache il risultato di db_query ()?


9

Ero abituato views_get_view_result()a ottenere risultati da una vista perché era conveniente in quel momento. Il risultato della query cambia raramente; Potrei usare la cache delle viste per 6 giorni.

Se volessi convertirlo in una chiamata a db_query()come potrei abilitare la memorizzazione nella cache?

Risposte:


9

Non opaca per la memorizzazione nella cache se si utilizzano views o db_query (). La memorizzazione nella cache funziona sempre allo stesso modo, il modo in cui i dati vengono recuperati quando manca la cache dipende completamente da te.

  1. Crea un ID cache per identificare la voce della cache. Può essere una stringa semplice codificata o qualcosa di complesso basato su argomenti e così via.
  2. Controlla se è possibile caricare dalla cache.
  3. In caso contrario, ricostruire i dati e inserirli nella cache con il tempo di scadenza desiderato.

Per vedere alcuni esempi, puoi guardare le funzioni che usano cache_get () , ad esempio variabile_iniziale () .

Se la tua funzione viene chiamata più volte, probabilmente desideri combinarla con una cache statica, vedi ad esempio archiver_get_info () . E se la ricostruzione dei dati è molto lenta, è possibile impedire che si verifichi più volte utilizzando il framework di blocco come variabile_initialize ().

Si noti che la memorizzazione nella cache di una singola query ha senso solo se è lenta, poiché cache_get () è anche una query db a meno che non si usi un backend cache alternativo come Memcache.

Infine, Views ha la cache già integrata e può essere configurata nella vista. Quindi potrebbe essere anche un'opzione.


Sconfiggimi;) Lascerò la mia risposta come esempio di codice, ma questa è un'informazione molto più utile
Clive

Pensavo che le istanze PDO non fossero serializzabili?
mpdonadio

1
No, non lo sono, ma non è rilevante. Non memorizzi nella cache la risorsa del risultato pdo, memorizzi nella cache qualsiasi struttura di dati che effettivamente recuperi da quella query.
Berdir,

Direi che è molto rilevante. @MotoTribe stava chiedendo informazioni sulla memorizzazione nella cache dei risultati db_query()e dover memorizzare nella cache il valore da $results->fetchAll()e non $resultsè la chiave per farlo funzionare davvero.
mpdonadio

7

Non credo che il livello DB abbia alcun meccanismo di memorizzazione nella cache incorporato (anche se potrei sbagliarmi), ma potresti usare l'API cache predefinita.

Questo è solo un esempio di base che memorizzerà nella cache i risultati di una query per ottenere nodi di un certo 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'));
}

3

Oltre al meccanismo cache_set / cache_get standard fornito da Drupal, se si utilizza MySQL come database, è possibile abilitare la cache delle query , che può memorizzare nella cache i risultati delle visualizzazioni o qualsiasi altra query del database, in modo trasparente. mysqltuner può aiutare a capire buoni valori per la dimensione della cache.

Nota che se stai scrivendo molto nel database, la memorizzazione nella cache delle query diventa meno efficace a causa del modo in cui funziona la strategia di invalidazione della cache (una scrittura su una tabella invalida tutte le voci che SELEZIONANO DA o UNISCONO quella tabella).

Esiste anche un meccanismo di memorizzazione nella cache per PostgreSQL , ma non ho esperienza diretta con esso.


3

Di recente ho scoperto il modulo Azioni cache . Con questo modulo, è possibile impostare la memorizzazione nella cache della vista su Cache attivata da regole e creare una regola per invalidare la cache su viste e visualizzazioni di viste specifiche.

Ad esempio, la cache per una vista che elenca i nodi di un tipo di contenuto specifico può essere svuotata quando viene creato un nuovo nodo di quel tipo di contenuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.