Sıralaması / özellikleri değişebilen sayfalandırılmış sonuçları önbelleğe almak için en iyi uygulamalar nelerdir?


11

Sıralaması / özellikleri değiştirilebilen sayfalandırılmış arama sonuçlarını önbelleğe almak için en iyi uygulama hangisidir?

Diyelim ki başvurumda birisi son 20 tartışma konusunu görmek istiyor (10.000 üzerinden). servletTartışma dizileri tablosundan ilk 20 kaydı XML / JSON olarak almak için veritabanına bir istek gönderilir . Daha sonra gelecek 20'yi görmek istiyorlarsa, sonuçların bir sonraki sayfasına giderler ve bu, bir sonraki partiyi almak için başka bir talep başlatır (limit ve ofset = 20, vb.).

Sunucu yükünü ve istemci beklemeyi azaltmak için önceki sonuç sayfalarını önbelleğe almak istiyorum. Ancak, iki sorum var:

  1. Sonuçların gösterildiği tablo birden fazla özellik tarafından sıralanabilir (ör. İş parçacığı oluşturma tarihi, iş parçacığı yazarı, son yayın tarihi). Bu, 'ilk 20 sonuç' gibi bir ifadenin bağlam olmadan hiçbir anlam ifade etmediği anlamına gelir (yani, ne ile sipariş veririz). Öyleyse, ön uç zaten yüklediklerini arka uçla nasıl iletişim kurar? İlk düşüncem, her sonuç için kimlik kullanmaktı, ancak sonraki isteklerde (ve sonuçlara göre filtreleme sonuçları) sunucuya geri göndermek, her şeyi körü körüne geri göndermek kadar zaman alıcı olurdu. Bunu nasıl yapabilirim?
  2. Önceden döndürülen bir sonucun (yani, en son tarih sonrası) niteliği değiştiyse ne olur? Daha sonra, sayfalandırıldığından beri sunucu tarafında değiştirilip değiştirilmediğini görmek için her bir sonucu kontrol etmenin bir yoluna ihtiyacımız var. Bunu nasıl yapabilirim?

Örneğin biraz kaba. Sadece 100 iş parçacığıysa, tek seferde 100'ün tamamını indirmeniz en iyisi olabilir. 10.000'in 20'sini çekiyorsanız, bu farklı bir hikaye.
Dan Pichelman

@DanPichelman Üzgünüm, biraz belirsizdim. 10.000 gibi olurdu.
goodsquishy

Netlik için düzenlenmiş numara.
goodsquishy

Bu http mi? Öyleyse, neden sadece URL'ye dayalı önbellek değil? URL'de tüm parametreler var. Tarayıcı ise tarayıcı önbelleğini kullanmayı deneyin. Bir uygulamasa, bir önbellek süre sonu ayarlayın. Android Volley oldukça iyi çalışıyor.
frostymarvelous

Yanıtlar:


7

Ne gereken bir sayfayı tanımlayan tüm parametrelerin (diyelim ki, bir sarıcı gibi görünüyor pageNumber, pageSize, sortType, totalCount, vb) ve bu kullanmak DataRequestiçin önbelleğe alma mekanizması için anahtar olarak nesneyi. Bu noktadan sonra önbelleği işlemek için birkaç seçeneğiniz vardır:

  • Önbelleği yenilemek için bir çeşit zaman aşımı mekanizması uygulayın (verilerin ne sıklıkta değiştiğine bağlı olarak).
  • Yukarıdaki parametreleri temel alarak veritabanı değişikliklerini kontrol eden ve önbelleği güncelleyen bir dinleyiciye sahip olun.
  • Değişiklikler aynı işlem tarafından yapılırsa, her değişiklikle önbelleği her zaman eski olarak işaretleyebilir ve bir sayfa istendiğinde bu bayrağı kontrol edebilirsiniz.

İlk ikisi belirli bir aralıkta veya bir olaya bağlı olarak tetiklenecek bir zamanlayıcı mekanizması içerebilir. Tek bir veri erişim noktanız varsa sonuncusu daha basit olabilir.

Son olarak, @DanPichelman'ın belirttiği gibi, faydalardan daha ağır basan aşırı derecede karmaşık bir algoritma haline gelebilir, bu nedenle performans kazancının algoritmanın karmaşıklığını haklı çıkardığından emin olun.


3

Muhtemelen böyle idare ederdim:

  1. Farklı siparişleri hep birlikte farklı diziler olarak ele alın. Her müşterinin sahip olduklarını izlemek (ya da tekrar tekrar göndermek) için ekstra defter tutmaya değmez.
  2. Kullanıcı her sayfa açtığında, önbellekten hemen görüntülerken, aynı zamanda sunucuya karma veya son erişim süresi içeren bir GET gönderir. Sunucu yalnızca bir şey değiştiğinde tam sayfayı geri gönderir.
  3. Sunucudan aynı anda birden fazla UI sayfası alın. Örneğin, kullanıcı arayüzünüz 20 giriş, sorgu 60 görüntülüyorsa. Bunu test etmem gerekiyor, ancak beklentim, en verimli dönüş boyutunun genellikle bir sayfada gösterilen ortalama veri miktarından daha büyük olacağıdır. Bu, kullanıcı arayüzünü bazı sayfa dönüşlerinde çok duyarlı hale getirir.
  4. Bir sınıra yaklaştığınızda önceden getirme yeniden başlar. Bu, hızlı yükleme sürelerinin önbellekten korunmasına yardımcı olur.

2

Sadece bir düşünce - sunucu çağrınızda, olağan parametreleri ve daha önce görüntülenen veri sayfalarını önbelleğe alınmış bir dizi MD5 karma değerini iletin.

Dönüş çağrısı, yeni geçerli sayfanın tüm olağan verilerini ve daha önce görüntülenen eski sayfaların güncellemelerini içerir. Eski karmayı anahtar olarak kullanabilirsiniz.

Öncelikle çok fazla performans ve zamanlama testi öneriyorum - müşteri tarafı kodunuz, her bir veri sayfası için sunucuya vurursanız olduğundan çok daha karmaşık olacaktır. Ekstra karmaşıklığın anlamlı bir iyileşme sağladığından emin olun.


Cevabınız için teşekkürler. Karma hakkında düşünüyordum ama yeniden sipariş senaryosuna yardımcı olup olmayacağından emin değildim (yani, yeterince ayrıntılı değildir ve yalnızca sonuç başına değil, sayfa başına çalışır). Son paragrafınızın iyi bir nokta olduğunu düşünüyorum ve olası herhangi bir çözümün karmaşıklığının performans avantajlarından daha ağır basacağını düşünmeye başlıyorum.
goodsquishy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.