Yanıtlar:
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.
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.
db_query()
ve değeri önbelleğe almak zorunda $results->fetchAll()
kalmayacak $results
ve gerçekten işe yaramasını sağlayacak anahtarlardı.
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'));
}
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.
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.