2010-08-06 29 views
14

Önbelleğe alma stratejileri ve uygulamaları konusunda oldukça yeni. Veritabanı yoğun olacak bir proje üzerinde çalışıyorum ama aynı zamanda düzenli olarak güncellenmekte ve değiştirilmekte.Önbelleğe alma stratejisi, önbelleğe alma ne zaman anlamsız hale gelir?

Genel olarak önbelleğe alma işlevinin nasıl geliştirileceğini bilecek kadar bilgi buldum, ancak emin olmadığınız şey genel stratejidir.

Tüm sorgu sonuçlarını önbelleğe alır ve bunları mantıklı olan şeylerle gruplandırarak mantıklı olanları gruplandırabilirsem, büyük ihtimalle önbelleğimde on binlerce (en az) küçük dosyam olur. Sadece büyük sorgu sonuçlarını önbelleğe almak daha mantıklı olur mu?

Bunun biraz donanımsal bir sorun olduğunu biliyorum, ancak genellikle hangi dosya boyutlarında önbelleğe alma işleminin anlamsız hale geldiğini mi söylüyorsunuz? Anlamı, dosya sistemini bu küçük dosyaların hepsine yüklüyorsanız, bunlara erişme, sonuçta başlayacak bilgileri önbelleğe almamış olabileceğiniz kadar yavaş olur mu?

teşekkürler, sana

DÜZENLEMEYİ sunmak zorunda herhangi görüşleri ilgileniyorum:

: Bu varlık kesinlikle uygulamaya özgü ilişkin yanıtlara dayanarak, sorumu evrensel olmalıdır bu şekilde poz izin

İçinde 1.000.000 ürün bulunan bir uygulamaya bağlı bir uygulama olduğunu varsayalım ...

Bu öğelerden birini doğrudan veritabanından almak veya bu öğelerden birini almak için bir sorgu yapmak daha hızlı olur mu? önbellek dizininden, her biri thos'un ayrıntılarını içeren 1.000.000 dosyadan e ürün?

DÜZENLEME: Görünüşe göre 100.000 geçerli bir cevap almak için yeterli değildi, hadi 1.000.000 yapalım. 1,000,000,000'e gitmek isteyen var mı? Yapabilirim ...

+3

İnsanların fikirlerini sorduğunuz ve hiçbir çözümün diğerinden daha iyi olmadığından (en azından gereksinimlerinizi ve durumunuzu belirtmeden), bunu bir 'topluluk wiki'si' olarak değiştirmeyi düşünebilirsiniz. – mikegreenberg

+0

@Michael - Kullanım durumum veya gereksinimlerim o kadar spesifik değil. Sadece, her küçük dosya parçasını dosyalara önbelleğe almaya başlarım, bir noktada, dosyaların saf hacminin performans kazancını ilk etapta önbelleklemeden düşürdüğünü sorarım. – Chris

+0

Mysql, 100k satır gibi küçük boyutlarda çok hızlı çalışmalı ve çalışabilir. Yani önbellek manyağı olmama için yeterli performans yedeğiniz var. – zerkms

cevap

2

Genel kural: gerekli değilken önbelleğe alma ve yalnızca önbelleğe alınması gereken şeyleri önbelleğe alma.

+4

Bu bir önbellek-y yolu, ilk önce işe almak ve sonra ne kadar hızlı olduğu için endişeleniyor mu? –

+0

Tamam. Bu yüzden bir seçenek yapacağım ve sadece işler yavaşlamaya başladığında onu açacağım. :) Ancak, pek çok şeyi önbelleğe almak ya da performansı yükseltmemesi ya da aslında bozması mümkün mü? – Chris

+4

** ASLA ** önbellek uygulamanız yavaş olduğu için. Bu felaket için bir reçete. Önbellek çok fazla yükünüz var (çok fazla eşzamanlı istek demektir). Tam olarak: Ama size uygulama yavaşsa ..., yavaşlık ... – ircmaxell

10

Kendiniz korumak yerine MySQL'in yerleşik sorgu önbelleğini kullanın. Önbelleğe alınmış sorguları, yazdıklarında tablolara otomatik olarak temizler. Ayrıca, bellekte çalışır bu yüzden çok verimli olması gerekir ...

Ayrıca, sadece sorguları önbelleğe almayın. Uygulamanın tüm segmentlerini oluşturma döngüsünde farklı aşamalarda önbelleğe almaya çalışın. Böylece, MySQL'in sorguları önbelleğe almasına izin verebilir, ardından her bir görüntüyü (işlenmiş), her bir bloğu ve her sayfayı önbelleğe alırsınız. Ardından, isteğe bağlı olarak önbellekten çekilip çekilmeyeceğini seçebilirsiniz. Örneğin, giriş yapmamış bir kullanıcı tam sayfayı önbellekten doğrudan alabilir. Örneğin, oturum açmamış bir kullanıcı tam sayfayı önbellekten alabilir. Örneğin; Ancak giriş yapmış bir kullanıcı (kullanıcı adı, vb. Nedeniyle) mümkün olmayabilir. Onun için, sayfadaki görünümlerinizi 1/2 önbellekten (kullanıcı nesnesine bağlı olmadıkları için) oluşturabiliyor olabilirsiniz. Hala önbelleğe alma avantajını elde edersiniz, ancak ihtiyaca göre sıralanır.

Gerçekten çok fazla trafik bekliyorsanız, kesinlikle Memcached'a bakmaya değer. Düzenlemenizi cevaplamak için:

Düzenleme ... MySQL sizin için sorguları saklamak ve daha sonra memcache tüm kullanıcı arazi önbellek öğeleri saklamak Let tek dizin büyük büyürse

Filesystems yavaş olabilir.Dizine göre "ad-isim" iseniz (her dizinin sadece önbellek dosyalarının küçük bir kısmı vardır), bu açıdan iyi olmalısınız. Tam eşiğe gelince, donanımınıza ve dosya sisteminize her şeyden çok bağlı olacaktır. Tek bir dizinde bir dosya yükü varsa EXT3'ün oldukça yavaş olduğunu biliyorum (tam anlamıyla yüzlerce dosya içeren dizinlerim var) ve bu dosyalardan sadece bir tanesine izin vermek için yarım saniyeye kadar sürebilir. Dizin listesi tür ...)

Ancak, eğer başka bir sunucu eklerseniz, önbellek kopyalamanızın (ki bu iyi bir şey değil) ya da tüm önbelleğinizi yeniden yazmak zorunda kalacaksınız. katmanı. Baştan itibaren Memcached ile gitmemek için bir neden var mı?

Edit 2:

Hala aramak için çok zor: en son düzenlemeyi cevaplamak için. Yaklaşık 1,5 milyar satırlık bir veritabanına sahip bir başvurum var (günde yaklaşık 500 bin civarında büyüyor). Herhangi bir önbelleğe alma kullanmıyoruz çünkü eşzamanlılık sorunlarımız yok. Ve yapsak bile, önbellek eklemek yerine, daha fazla MySQL sunucusu atmaktan daha iyi oluruz, çünkü herhangi bir önbellek, ekleme süresini yükseltmeye değmeyecek kadar düşük bir isabet oranına sahip olacaktır.

İşte bu yüzden hız için önbelleğe alma konusunda çok kararlıyım. Her zaman önbellekte olmayan bir nesne olacaktır. Dolayısıyla, bu nesnelerden biriyle bir sayfaya vurursanız, yine de hızlı olması gerekir. Genel bir kural olarak, önümüzdeki birkaç dakika içinde tekrar erişilebilecek bir şeyi önbelleğe almaya çalışıyorum (yine de diğer uygulamalarda üretimde yaklaşık 5 dakika yaşamaya devam ediyorum). Öyleyse, öğeler bu zaman aralığındaki birkaç isabetten fazlasını almazsa veya isabet oranı çok düşükse (% 90'dan az), bu öğeyi önbelleğe almam rahatsız olmaz ....

+0

Teşekkür ederim. Tam olarak merak ettiğim şey buydu. – Chris

0

Her ikisi de donanım ve uygulamaya bağlı. İşletim sistemi endekslemesinin veri depolama/geri alma süresi (MySQL seviyesinde ve önbelleğe alınmış dosya erişim seviyesinde) daha büyük olduğu eşiği belirlemek için karşılaştırmaları yapmanız gerekir. Ayrıca, bunu kitlenizin kabul edilebilir (çok öznel) eşiğine karşı da karşılaştırmanız gerekir.

İlgili konular