Birçok parametrelere dayalı önbelleğe nasıl

4 Cevap php

Ben de 1 (seçilmiş) veya 0 (seçili değil) 16 filtre seçenekleri ile bir form kullanan bir arama uygulaması üzerinde çalışıyorum. JSON sonucu bir GET isteği kullanarak AJAX yoluyla alınır.

Sorgu dizesi sonra bu gibi görünüyor:

filter_1 = 0 & filter_2 = 1 ... atlanmış ... & filter_16 = 1 & page = 20

Her SearchResult kullanıcı tarafından göz edilebilir en az 2 sayfa var.

Benim soru: nasıl girdi parametresi dayalı SearchResults önbelleğe alabilir? Benim ilk fikir requestparameters md5 ve sonra dosya adı olarak hash kullanarak bir önbellek dosyası yazmak oldu.

Yeni bir istek gelir her zaman, ben önbellek dosyası için arama ve eğer varsa, o zaman yerine veritabanı sorgulama ve json sonuç satırları dönüştürme o dosyadaki verileri kullanın.

Ama bu, çünkü birçok arama seçenekleri iyi bir fikir gibi değil gibi görünüyor. Orada oldukça çok önbellek dosyaları (16 * 16?), Ve uygulama sadece birkaç kullanıcılar tarafından kullanılır, çünkü tüm olası kombinasyonları hiç önbelleğe alacak şüphe ederim. Ve her sonuç X sayfaları içeren, böylece her bir sayfa (16 * 16 * X) kendi başına bir önbellek dosyası olacaktır.

Ne böyle bir uygulama için iyi bir önbellek stratejidir olurdu? Bir önbellek uygulamak mümkün acutually mı?

4 Cevap

Arama tüm parametreleri 0 veya 1 olabilen bayrakları olduğundan, bitmasking düşünebilirsiniz.

Filtrelerinizin her 2 güç olan bir değeri temsil eder:

$filter_1 = 1;
$filter_2 = 2;
$filter_3 = 4;
...
$filter_8 = 256;
...
$filter_16 = 65536;

PHP'nin kullanarak bitwise operators, kolayca tek bir tamsayı 16 filtre değerleri saklayabilir. Örneğin, değer "257", sadece filter_1 ve filter_8 bir arada kullanarak ulaşılabilir. Kullanıcı filter_1 ve filter_8 seçtiyseniz, yaparak bit maskesi belirleyebilir:

$bitmask = $filter_1 | $filter_8  //gives 257

Tüm filtreler devleti temsil eden benzersiz bir bit maskesi ile, sadece gerekli pahalı md5 operasyonları ile, hem de önbellek anahtar olarak kullanabiliriz. Yani bu durumda, sizin önbellek içine "257" adlı bir dosyayı kaydetmek istiyorsunuz.

Bu teknik size onlar maç filtreler belirlemek için yeni ve güncelleştirilmiş kayıtları kontrol edebilirsiniz gibi, hem de önbelleği geçersiz ve "bit" adı, yani ayarladığınız olan herhangi bir dosyayı silmek için kolay bir araç verir. if ( ((int)$filename) & $filter == $filter) unlink($filename);. Lütfen tabloları sık sık yazıyor varsa, bu önbelleği taranması için bazı performans sorunlarına neden olabilir, ama okuma-ağır uygulaması için iyi bir tekniktir.

Bu benim bit veya bayrakları ile uğraşırken kullanmayı seviyorum bir yaklaşımdır. Eğer gerçekten ancak böyle önbelleğe gerekirse dikkatlice düşünmelisiniz. Sadece bir kaç sistem kullanıcıları varsa, gerçekten bir kaç arama sorgularına dayanan performans sorunlarınız olacak? Yanı sıra, MySQL yerleşik bir yüksek-okuma uygulaması çok iyi bir performans sergiliyor sorgu önbelleği. Lütfen sonuç sayfası oluşturma rutinleri pahalı ise, çıkış parçaları önbelleğe kesinlikle yararlı olabilir, ancak yalnızca kullanıcı bir avuç için buraya performansı mikrosaniye bahsediyoruz eğer, buna değer olmayabilir.

Neden önbelleğini gerekiyor?

Uygulama sadece birkaç kullanıcılar tarafından kullanılan sonra önbelleğe gerçekten gerekli olmayabilir.

(Kullanıcılar az sayıda) tanımlamak gereksinimleri göz önüne alındığında, tüm kombinasyonları önbelleğe makul görünüyor gibi geliyor bana. Elbette, önbelleğe alma tüm mantıklı, sürece. Tipik bir sorgu ne kadar zaman alır? Eğer uygulama yalnızca birkaç kişi tarafından kullanılan olacağı söylüyorlar bu yana, önbelleğe bile değer mi? Benim çok kaba bir tahmin sorgu, bu durumda birkaç saniye almaz ise, önbelleğe alma hakkında endişelenmeyin olmasıdır. Bir saniyeden daha az olduğunu ve gerçekten uygulama süper duyarlı yapmak istemiyorsanız, hiçbir önbelleğe alma gerekli olmalıdır.

Aksi takdirde, ben bütün kombinasyonları önbelleğe Tamam olduğunu (yine kullanıcıların az sayıda verilen) söyleyebilirim. Bunların çok sayıda kullanılmış olsa bile, orada çoğu 65536 hâlâ, ve birçok modern işletim sistemleri kolayca (eğer dosyaları içine önbelleğe planı) bir dizindeki dosyaların binlerce işleyebilir. Ama her durumda, bu önbellek öğelerin sayısını sınırlamak ve düzenli eski temizlemek için makul olacaktır. Ayrıca, ben bir MD5 kullanmak olmaz, ben sadece önbellek anahtarının (örn. 0101100010010100) için filtreler sıfır ve olanları sıralamak istiyorum.

İlk (Toby önerilen gibi) aslında bir önbellek gerekir doğrulayın.

Eğer eski değerleri temizlemek için ihtiyacı olacak - Bundan sonra, bilgi olması gerekir nasıl taze düşünüyorum. Bu tür memcached gibi, bunun için hazır bir çözüm kullanmak isteyebilirsiniz.

$key = calc_key();

$result = $memcache->get($key);

if (!$result) {
  $result = get_data_from_db();
  /* cache result for 3600 seconds == 1 hour */
  $memcache->set($key, $result, 0, 3600);
}

/* use $result */