2010-11-12 22 views
6

Ho un sito in cui gli utenti inseriranno per primi i loro criteri di ricerca. La ricerca combina i dati di 2 fonti, una delle quali non è un database. I risultati della ricerca sono generalmente abbastanza grandi da essere cercati.Memorizzazione nella cache dei dati nei graal

Poiché la query iniziale è costosa, desidero memorizzare nella cache i risultati della ricerca se i criteri di ricerca non cambiano per le visualizzazioni di pagina successive.

Il mio metodo attuale si presenta come:

def search(criteriaMap, offset, pagesize) 

Qual è il modo migliore di caching dei risultati di ricerca in Groovy/Grails? Come scadere i risultati della ricerca?

Nota, vedo che esiste un plug-in per springcache ma non sono sicuro che funzioni per risultati paginati. So anche che Grails è confezionato con ehcache ma non ho visto un API a cui ho accesso direttamente, l'ho visto solo per il caching di secondo livello con GORM.

Aggiornamento: Ho preso parte alla soluzione di @ mfloryan per risolvere questo problema.

ho creato due metodi nella searchService:

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

(One viene memorizzato nella cache e l'altra no.)

Il mio codice nel searchController:

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

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

[results: results, searchParams : trimmedParams] 

Come risultato, ho invocato il servizio di ricerca con un elenco di parametri ritagliati che non includono Parametri di cercapersone. I risultati della ricerca memorizzati nella cache possono essere restituiti.

Il searchController si occupa del paging.

nota: Non ho cache i risultati di ibernazione perché vorrei finire con il doppio dei dati nella cache. Ho memorizzato solo i risultati combinati di searchService.searchResults (che raggiunge un'API REST e il mio database locale)

risposta

5

In primo luogo, se si desidera memorizzare nella cache la query, allora forse l'uso della cache di query Hibernate è un buon inizio (Impostare cache:true in il mappings e passare cache: true al executeQuery)

Utilizzando la SpringCache plug-in vi permetterà di memorizzare nella cache l'intera risposta dal controller. Tutto ciò che devi fare è decorare il controller in questo modo: @Cacheable("searchMethodCache") o solo decorare i singoli metodi che desideri ottenere dai risultati della cache. La cache salverà la risposta per stringa di query, quindi dovrebbe funzionare bene con il paging. L'annotazione @CacheFlush consente di impostare quando la cache deve essere cancellata.

L'EH cache stessa è configurato in grails-app/conf/spring/resources.groovy

- AGGIORNAMENTO -

seguito si commento comincio a sospettare il vostro potrebbe pensare di una soluzione leggermente diversa. Quindi c'è una query che restituisce un elenco di risultati e quell'elenco viene quindi visualizzato e visualizzato.Con l'approccio standard di Grails, Hibernate genera una query per ogni pagina (restituendo un sottoinsieme dall'elenco completo, eseguendo quindi la query potenzialmente costosa una volta per ogni pagina). Presumibilmente, si desidera eseguire la query una sola volta, per restituire il set di risultati completo che viene memorizzato nella cache e quindi servire singole pagine da esso. Se è il caso, per quanto ne so, sarà necessario sfogliare manualmente i risultati dalla cache di Hibernate o memorizzare nella cache il set di risultati da un'altra parte (contesto di sessione?)

+0

In che modo il widget di impaginazione interagisce con questo? posso svuotare la cache in base al tempo o all'ordine FIFO? – Tihom

+0

L'accesso a una pagina diversa modifica la stringa di query in modo che la risposta diversa venga memorizzata nella cache e quindi pubblicata. La cache scade automaticamente, quindi non è necessario eseguire lo svuotamento esplicito in base al tempo. Basta impostarlo in Config.groovy sotto sprigcache/cache/[cacheName]/timeToLive = ... – mfloryan

+0

Vorrei evitare la richiesta per pagine diverse. Come lo faccio? – Tihom

Problemi correlati