PHP memcache tasarım desenleri

5 Cevap php

Biz sonra sadece önbellek sorgu sonuçları için düşünce olarak temelde memcache kullanmak.

Invalidation uygulandığı şeklinden dolayı bir kabus. Biz bu yana anahtarlıklarda grup kaybedilmemesi izin örneğin, hile posta listesi okuma sokmak memcache ile bazı teknikler öğrendim. Bunu bilenler için, bir sonraki paragrafa atlayın ..

Bilmek ve ilgi olmayanlar için, hile tuşları için bir sıra numarası ekleme ve memcache bu sıra numarasını depoluyor. Sonra her zaman sizin "olsun" do önce geçerli sıra numarası kapmak ve etrafında tuşları oluşturmak. Sonra, bütün grup geçersiz sadece bu sıra numarası artırır.

Neyse, ben şu anda bu uygulamaya bizim modelini revize ediyorum.

Benim soru ..

Biz bu model hakkında bilmiyordum, ve ben bilmiyorum diğerleri vardır eminim. Ben aradım ve vb memcache, en iyi uygulamalar, uygulama için web üzerinde herhangi bir tasarım desenleri bulmak mümkün olmamıştır

Birisi bu hatta sadece bir örnek yazmak gibi bir şey için beni işaret edebilir? Ben bizim yeni üstlenmeden bir başlayanlar hata yapmazlar emin olmak istiyorum.

5 Cevap

Nesneler / kompleks yapıların bir önbellek - nesne önbelleğe alma ile hatırlanması gereken bir nokta sadece olmasıdır. Birçok insan veritabanı çok daha hızlı sonuç elde olurdu zaman önbellek çek / kaybet, yükü doğurur basit, verimli sorgular, onların önbelleklerini isabet hata yapar.

Tavsiye Bu parça bana öğretilen beri kalbine atmış biridir; havai algılanan yararları iptal ettiğinde, yani önbelleğe zaman bilmiyorum. Ben burada belirli bir soruya cevap vermez biliyorum, ama genel bir ipucu olarak işaret değer olduğunu düşündüm.

Soymak ne söylediğini iyi bir tavsiyedir. Benzersiz kimlik ve etiket-temelli kimlik: Benim deneyim, etiketleri belirlemek ve geçersiz iki ortak yolu vardır. Bu genellikle tam bir çözelti oluşturmak için birleştirilir:

  1. Bir önbellek kaydı benzersiz bir tanımlayıcı (genellikle önbelleğe verilere bir şekilde bağlıdır) ve isteğe bağlı etiketleri herhangi bir sayı atanır.
  2. Önbellek kayıtlarının benzersiz bir tanımlayıcı tarafından geri çağrılır.
  3. Önbellek kayıtlarının benzersiz tanımlayıcı (bir anda), ya da (muhtemelen aynı anda birden fazla kayıt geçersiz) ile etiketlenmiş herhangi bir etiketi ile geçersiz olabilir.

Bu uygulamak oldukça basit ve genellikle çok iyi çalışıyor. Özel çözümler gerektirir orada bazı kenar durumlarda muhtemelen vardır ama ben daha çok ihtiyaç bir sisteme rastlamak henüz.

Ben Zend Cache bileşeni (siz isterseniz sadece zend önbellek şeyler bütün çerçeveyi kullanmak zorunda değilsiniz) kullanın. O (bu özelliği ben göreli kolaylığı ile 'etiketleri için' kendi destek haddelenmiş ettik memcache arka ucunda desteklenmiyor olsa 'etiketleri' ile gruplama önbelleğini destekler) önbelleğe bazı şeyler soyutlar. Yani ben (benim modelinde genellikle) önbelleği erişmek işlevler için kullanmak desen:

public function getBySlug($ignoreCache = true)
{
	if($ignoreCache || !$result = $this->cache->load('someKeyBasedOnQuery'))
	{
		$select = $this->select()
				->where('slug = ?', $slug);
		$result = $this->fetchRow($select);

		try
		{
			$this->cache->save($result,'someKeyBasedOnQuery');
		}
		catch(Zend_Exception $error)
		{
		  //log exception
		}
	}
	else
	{
		$this->registry->logger->info('someKeyBasedOnQuery came from cache');
	}
	return $result;

}

sorgunun bir karma üzerinde önbellek anahtarını dayandırarak başka bir geliştirici benim modelleri atlar veya başka bir yerde başka bir işlevi kullanıldığında ise hala önbellekten aynı şey çekmiş gelmez demektir. Genellikle bir çift etiket (tablonun adı biridir ve diğer işlevin adıdır) oluşturmak ile önbelleği etiketlemek. Bizim kod uç üzerindeki geçersiz varsayılan Yani, silebilir ve tablo etiketi ile önbelleğe alınmış öğeleri güncelleştirmek. Tüm önbelleğe alma tüm temel kodundan oldukça otomatik ve geliştiriciler yaptığımız projelerde olduğu önbelleğe 'sadece çalışır' güvenli olabilir. (Ayrıca etiketleme yararlanarak büyük yan etkisi biz modeli işlevleri veya tablolar ile önbelleği temizlemek için seçenekleri ile, granül önbellek temizleme / yönetimi sunan bir sayfa olması).

pgmemcache, ben mysql böyle bir şey düşünüyorum birkaç API'leri örneğin (orada vardır - Biz de memcache bizim veritabanı (PostgreSQL) dan sorgu sonuçlarını depolamak ve önbellek geçersiz masalarda tetikleyicileri kullanarak çok ama) emin bilmiyorum. Fayda veritabanı kendini (tetikleyiciler) değişiklikler (update, insert, delete) ilişkin verilerin invalidation işleyebilir olduğunu, sizin "uygulama" içine tüm bu şeyler yazmaya gerek yok.

mysqlnd_qc, veritabanı sorgu sonuçlarına memcaching içlikleri hangi oto önbelleklerini mysql sonuç kümeleri, düzeyi döndürür. Bu fantastik ve otomatik.