Db_query () sonucunu nasıl önbelleğe alabilirim?


9

Kullandığım views_get_view_result()o zamanlarda uygun çünkü bir görünümden sonuçları almak için. Sorgu sonucu nadiren değişir; Ben 6 gün boyunca önbellek görünümlerini kullanabilirsiniz.

Bir çağrıyı dönüştürmek db_query()istersem önbelleğe almayı nasıl etkinleştirebilirim?

Yanıtlar:


9

Views veya db_query () kullanırsanız önbelleğe almak için önemli değildir. Önbellek her zaman aynı şekilde çalışır, önbellek kaçırdığında verilerin nasıl getirildiği tamamen size bağlıdır.

  1. Önbellek girişinizi tanımlamak için bir önbellek kimliği oluşturun. Basit, sabit kodlu bir dize veya bağımsız değişkenlere dayalı karmaşık bir şey olabilir.
  2. Önbellekten yüklenip yüklenemeyeceğini kontrol edin.
  3. Değilse, verileri yeniden oluşturun ve istenen son kullanma süresi ile önbelleğe koyun.

Bazı örnekleri görmek için cache_get () kullanan işlevlere bakabilirsiniz, örneğin variable_initialize () .

İşleviniz birden çok kez çağrılırsa, büyük olasılıkla statik bir önbellekle birleştirmek istersiniz, bkz. Örneğin archiver_get_info () . Ve veri yeniden oluşturma işlemi gerçekten yavaşsa, kilitleme çerçevesini variable_initialize () gibi kullanarak birden çok kez olmasını engelleyebilirsiniz.

Memcache gibi alternatif bir önbellek arka ucu kullanmadığınız sürece, bir cache_get () da bir db sorgusu olduğundan, tek bir sorguyu önbelleğe almanın yalnızca yavaş bir sorgu olması mantıklı olduğunu unutmayın.

Son olarak, Views'da zaten yerleşik olan önbellekleme vardır ve görünümünüzde yapılandırılabilir. Yani bu da bir seçenek olabilir.


Beni yendi;) Cevabımı bir kod örneği olarak bırakacağım ama bu daha yararlı bilgiler
Clive

PDO örneklerinin serileştirilemez olduğunu düşündüm?
mpdonadio

1
Hayır, değiller, ama bu ilgili değil. Pdo sonuç kaynağını önbelleğe almazsınız, bu sorgudan gerçekte aldığınız veri yapılarını önbelleğe alırsınız.
Berdir

Çok alakalı olduğunu söyleyebilirim. @MotoTribe, sonuçları önbelleğe almayı soruyordu db_query()ve değeri önbelleğe almak zorunda $results->fetchAll()kalmayacak $resultsve gerçekten işe yaramasını sağlayacak anahtarlardı.
mpdonadio

7

Ben (yanlış olabilir) DB katmanı herhangi bir yerleşik önbellek mekanizması olduğunu sanmıyorum, ama varsayılan önbellek API kullanabilirsiniz.

Bu, belirli bir türdeki düğümleri almak için bir sorgunun sonuçlarını önbelleğe alacak temel bir örnektir:

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

Drupal'ın sağladığı standart cache_set / cache_get mekanizmasına ek olarak, veritabanınız olarak MySQL kullanıyorsanız , görünümlerin sonuçlarını veya diğer veritabanı sorgularını şeffaf bir şekilde önbelleğe alabilen sorgu önbelleğini etkinleştirebilirsiniz . mysqltuner , önbellek boyutu için iyi değerler bulmaya yardımcı olabilir.

Veritabanına çok fazla yazı yazıyorsanız, önbellek geçersiz kılma stratejisinin çalışma şekli nedeniyle sorgu önbelleğe almanın daha az etkili olduğunu unutmayın (bir tabloya yazma, bu tabloyu SEÇEN veya KATILAN tüm girdileri geçersiz kılar).

PostgreSQL için bir önbellek mekanizması da var , ancak onunla doğrudan deneyimim yok.


3

Kısa süre önce Önbellek İşlemleri modülünü keşfettim . Bu modülle, görünüm önbelleğe almanızı Kurallar tarafından tetiklenen Önbellek olarak ayarlayabilir ve belirli görünümler ve görünüm ekranlarında önbelleği geçersiz kılmak için bir kural oluşturabilirsiniz.

Örneğin, belirli bir içerik türünün düğümlerini listeleyen bir görünümün önbelleği, o içerik türünde yeni bir düğüm oluşturulduğunda boşaltılabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.