2010-11-12 23 views
6

Kullanıcıların arama ölçütlerini ilk gireceği bir sitem var. Arama, bir veri tabanı olmayan 2 kaynaktan gelen verileri birleştirir. Arama sonuçları genellikle disk belleği için yeterince büyüktür.Gravürlerde veri önbellekleme

İlk sorgu pahalı olduğundan, arama kriterleri sonraki sayfa görünümleri için değişmezse, arama sonuçlarını önbelleğe almak istiyorum.

def search(criteriaMap, offset, pagesize) 

harika/grails arama sonuçlarını önbelleğe en iyi yolu nedir:

Benim şu anki yöntem benziyor? Arama sonuçlarını nasıl sona erdirebilirim?

Not: Bir springcache eklentisi olduğunu görüyorum, ancak bunun paged sonuçları için işe yarayıp yaramayacağından emin değilim. Ayrıca, derelerin ehcache ile paketlendiğini biliyorum, ancak doğrudan erişebildiğim bir API görmedim, sadece GORM ile ikinci seviye önbellekleme için kullandığımı gördüm.

Güncelleştirme: Bu sorunu çözmek için @ mfloryan çözümünün bir kısmını aldım.

@Cacheable("searchCache") 
def searchResults(uid, trimmedParams) 
def trimParams(params) 

(Bir önbelleğe ve diğer değildir.)

searchController My kod:

def trimmedParams = searchService.trimParams(params) 
def results = searchService.searchResults(trimmedParams) 

//Page results 
results = HelperService.pageResults(results, params.offset, params.max) 

[results: results, searchParams : trimmedParams] 

Ben searchService içinde iki yöntem yarattı

Sonuç olarak, arama servisini dahil olmayan kesilmiş bir parametre listesiyle çağırdım. ude çağrı paramları. Önbelleğe alınmış arama sonuçları iade edilebilir.

searchController çağrıyı hallediyor.

not: Hazırda bekletme sonuçlarını önbelleğe almadım çünkü önbellekteki verileri iki katına çıkarırdım. SearchService.searchResults (bir REST API'sini ve yerel veritabanımın ismini) birleştirilmiş sonuçları yalnızca önbelleğe aldım.

cevap

5

İlk olarak, sorguyu önbelleğe almak istiyorsanız, daha sonra Hazırda Bekletme sorgusu önbelleğini kullanmak iyi bir başlangıçtır (Set cache:true). mappings ve kumandadan tüm yanıtı önbelleğe sağlayacak SpringCache plug-in kullanma executeQuery için cache: true)

geçmektedir. Tek yapmanız gereken denetleyiciyi şu şekilde dekore etmektir: @Cacheable("searchMethodCache") veya yalnızca önbelleğe alınmış sonuçların istediğiniz bireysel yöntemleri süsleyin. Önbellek sorgu dizesiyle yanıt kaydedecek, bu yüzden sayfalama ile iyi çalışmalıdır. @CacheFlush ek açıklaması, önbellek temizlendiğinde ayarlanmasına izin verir. Eğer ben senin biraz farklı çözümün düşünce olabilir şüphelenmeye başlar açıklama sonrasında

- GÜNCELLEME -

EH Önbellek kendisi grails-app/conf/spring/resources.groovy

yapılandırılır. Yani sonuçların bir listesini döndüren bir sorgu var ve bu liste daha sonra çağrı ve görüntüleniyor.Standart Grails yaklaşımı ile Hazırda Beklet, her sayfa için bir sorgu oluşturacaktır (tam listeden bir altkümeyi döndürerek, potansiyel olarak pahalı sorguyu her sayfa için bir kez çalıştırır). Muhtemelen sorgunun bir kez çalıştırılmasını istersiniz - önbelleğe alınan tam sonuç kümesini döndürmek ve ardından tek tek sayfalara sunmak. Bu durumda, bildiğim kadarıyla, sonuçları hazırda bekletme önbelleğinden el ile veya başka bir yerde kümeyi önbelleğe almanız gerekir (Oturum bağlamı?)

+0

Sayfalandırma aracı nasıl etkileşime girer? Önbelleği zamana veya FIFO siparişine göre temizleyebilir miyim? – Tihom

+0

Farklı bir sayfaya gitmek, sorgu dizesini değiştirir, böylece farklı yanıt önbelleğe alınır ve daha sonra sunulur. Önbellek otomatik olarak sona eriyor, bu nedenle zamana bağlı olarak açık bir şekilde temizlenmeye gerek yok. Sprigcache/caches/[cacheName]/timeToLive = ... – mfloryan

+0

altında Config.groovy içinde ayarlayın. Farklı sayfalar için istekleri önlemek istiyorum. Bunu nasıl yaparım? – Tihom

İlgili konular