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)
In che modo il widget di impaginazione interagisce con questo? posso svuotare la cache in base al tempo o all'ordine FIFO? – Tihom
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
Vorrei evitare la richiesta per pagine diverse. Come lo faccio? – Tihom