Bir reddit gibi web sitesinde önbelleğe yapmanın en iyi yolu

2 Cevap php

Biz reddit gibi bir PHP web sitesi var, kullanıcılar hikayeler için oy verebilirsiniz.

Biz web sitesi için APC, memcached vb kullanmaya çalıştı ama vazgeçti. Sorun bir önbelleğe alma mekanizması kullanmak istiyorum, ancak kullanıcılar sitede her zaman oy ve önbelleğe alınan veriler diğer ziyaretçiler için eski ve kafa karıştırıcı olabilir.

Hikayeler derecelendirme değişti yüzden bana bir örnek ile, Biz 100 öyküleri bir dizi var ve 5 dakika boyunca önbellekte saklanır açıklayayım., Bir kullanıcı bazı hikayeler için oy kullandı. Diğer kullanıcı web sitesine girdiğinizde, o / o, bu nedenle eski verileri önbelleğe alınan verileri görürsünüz. (Bu seçmen kullanıcı sayfayı yeniler eğer, o da hikayeleri için eski oy numarasını göreceksiniz aynıdır.)

Biz onu anlamaya olamaz, herhangi bir yardım son derece takdir edilecektir

2 Cevap

Bu düşük gecikmeli güncellemeleri ve genel sistem / ağ yükü (maliyet vs aka, performans) arasında bir denge bulma meselesidir.

  1. Eğer yedek kapasite varsa, basit çözüm bir veritabanındaki oy tutmak için, ve her zaman bir sayfa yükleme sırasında onları aramak. Tabii ki, burada hiçbir önbelleğe alma yok.

  2. Başka bir düşük gecikmeli (ama yüksek maliyetli) çözüm anında diğer tüm önbelleklerini için oy yayınlamak pub-sub tipi sistemine sahip olmaktır. Yüksek maliyet ek olarak, burada uğraşmak gerekir, çeşitli eşitleme sorunları vardır.

  3. Bir sonraki alternatif paylaşılan önbellek (örneğin, memcached, ancak farklı makineler arasında paylaşılan) sahip olmaktır. Veritabanına Güncellemeler her zaman önbelleğini güncelleştirir. Bu veritabanı üzerinde yükü azaltır ve (önbellek aramaları genellikle ilişkisel veritabanı sorgularını daha ucuz olduğu için) size düşük gecikme tepkiler almak istiyorum. Bunu Ama eğer paylaşılan önbellek başarısızlık tek bir noktası olmadığını dikkatlice boyutuna önbellek gerekir ve yeterli fazlalık böyle olacak.

  4. Başka, daha sık kullanılan, alternatif oy sadece ön uç sunucularda her birinde işlemler olarak depolanan arka plan oy toplama, çeşit olması ve sürekli (örneğin, her beş saniye) agrega bir arka plan işlemi var oy ve doldurur tüm önbelleklerini.

AFAIK, reddit canlı düşük gecikmeli oy yayılma yapmaz. Bir şey kadar oy varsa, hemen diğer müşterileri arasında, yansıtılmamıştır. Benim tahminim, onlar (# 4 gibi) toplanması çeşit yapıyoruz, ama bu sadece benim spekülasyon bulunuyor.

Belki de bu zaten kabul ettik bir çözümdür, ama neden sadece her şeyi but derecelendirme önbelleğe değil? Bunun yerine, sadece i inci pozisyonu üstten hikaye inci i için notunu içeren tek dizi, güncelleyin. Bellekte geri kullanıma hazır olarak veritabanına her zaman ve floş derecelendirme bu tutun.

Eğer sadece üst N hikayeler en olma konusunda önem veriyorsanız up-to-date, sonra i sadece muhtemelen gibi çok küçük bir sayıdır ön sayfasında hikayeler, sayısı büyüklükte olmalıdır 50 ya da öylesine.