Jak buforować wynik db_query ()?

9

Kiedyś views_get_view_result()uzyskiwałem wyniki z widoku, ponieważ było to wtedy wygodne. Wynik zapytania rzadko się zmienia; Mógłbym używać buforowania widoków przez 6 dni.

Jeśli chciałbym przekonwertować to na wywołanie, w db_query()jaki sposób mogę włączyć buforowanie?

uwe
źródło

Odpowiedzi:

9

Nie ma znaczenia dla buforowania, jeśli używasz widoków lub db_query (). Buforowanie działa zawsze tak samo, w jaki sposób dane są pobierane, gdy brakuje pamięci podręcznej, zależy wyłącznie od Ciebie.

  1. Zbuduj identyfikator pamięci podręcznej, aby zidentyfikować wpis w pamięci podręcznej. Może być prostym, zakodowanym ciągiem lub czymś złożonym na podstawie argumentów i tak dalej.
  2. Sprawdź, czy można załadować z pamięci podręcznej.
  3. Jeśli nie, odbuduj dane i umieść je w pamięci podręcznej z żądanym czasem wygaśnięcia.

Aby zobaczyć kilka przykładów, możesz spojrzeć na funkcje, które używają cache_get () , na przykład zmienna_initialize () .

Jeśli twoja funkcja jest wywoływana wiele razy, prawdopodobnie chcesz połączyć ją ze statyczną pamięcią podręczną, patrz na przykład archiver_get_info () . A jeśli odbudowywanie danych jest naprawdę powolne, możesz zapobiec temu wiele razy, używając struktury blokującej, jak robi to zmienna_initialize ().

Pamiętaj, że buforowanie pojedynczego zapytania ma sens tylko wtedy, gdy jest powolne, ponieważ cache_get () jest również zapytaniem db, chyba że użyjesz alternatywnego zaplecza pamięci podręcznej, takiego jak Memcache.

I wreszcie, widoki mają już wbudowane buforowanie i można je skonfigurować w widoku. To może być również opcja.

Berdir
źródło
Pobij mnie do tego;) Zostawię moją odpowiedź jako przykład kodu, ale jest to o wiele bardziej użyteczna informacja
Clive
Myślałem, że wystąpień PDO nie można serializować?
mpdonadio
1
Nie, nie są, ale to nie ma znaczenia. Nie buforujesz zasobu wyników pdo, buforujesz wszelkie struktury danych, które faktycznie pobierasz z tego zapytania.
Berdir
Powiedziałbym, że to bardzo istotne. @MotoTribe pytał o wyniki buforowania db_query(), a konieczność buforowania wartości od $results->fetchAll()i nie $resultsjest kluczem do jej uruchomienia .
mpdonadio
7

Nie sądzę, że warstwa DB ma wbudowany mechanizm buforowania (choć mogę się mylić), ale możesz skorzystać z domyślnego interfejsu API pamięci podręcznej.

To tylko podstawowy przykład, który zbuforuje wyniki zapytania, aby uzyskać węzły określonego typu:

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
źródło
3

Oprócz standardowego mechanizmu cache_set / cache_get , który zapewnia Drupal, jeśli używasz MySQL jako bazy danych, możesz włączyć pamięć podręczną zapytań , która może buforować wyniki widoków lub dowolne inne zapytania do bazy danych, w sposób przezroczysty. mysqltuner może pomóc w ustaleniu dobrych wartości rozmiaru pamięci podręcznej.

Zauważ, że jeśli dużo piszesz do bazy danych, buforowanie zapytań staje się mniej skuteczne ze względu na sposób działania strategii unieważniania pamięci podręcznej (zapis do tabeli unieważnia wszystkie wpisy WYBIERAJĄCE OD LUB DOŁĄCZ do tej tabeli).

Istnieje również mechanizm buforowania PostgreSQL , ale nie mam z nim bezpośredniego doświadczenia.

mpdonadio
źródło
3

Niedawno odkryłem moduł Akcje pamięci podręcznej . Za pomocą tego modułu możesz ustawić buforowanie widoku na pamięć podręczną uruchamianą przez reguły i utworzyć regułę unieważniania pamięci podręcznej na określonych widokach i ekranach widoków.

Na przykład pamięć podręczną widoku zawierającego listę węzłów określonego typu treści można opróżnić, gdy zostanie utworzony nowy węzeł tego typu treści.

tydzień wcześniej
źródło