J'ai un site où les utilisateurs vont d'abord entrer leurs critères de recherche. La recherche combine des données provenant de 2 sources, dont l'une n'est pas une base de données. Les résultats de la recherche sont généralement assez grands pour être paginés.Mise en cache des données dans les grails
Étant donné que la requête initiale est coûteuse, je souhaite mettre en cache les résultats de la recherche si les critères de recherche ne changent pas pour les pages vues suivantes.
Ma méthode actuelle ressemble à:
def search(criteriaMap, offset, pagesize)
Quelle est la meilleure façon de mettre en cache les résultats de la recherche dans Groovy/Grails? Comment devrais-je expirer les résultats de la recherche? Remarque, je vois qu'il existe un plugin springcache mais je ne suis pas sûr que cela fonctionnera pour les résultats paginés. Je sais aussi que grails est empaqueté avec ehcache mais je n'ai pas vu d'API à laquelle j'ai directement accès, je l'ai seulement vu utilisé pour la mise en cache de 2nd niveau avec GORM.
Mise à jour: J'ai pris part à la solution de @ mfloryan pour résoudre ce problème.
J'ai créé deux méthodes dans le SearchService:
@Cacheable("searchCache")
def searchResults(uid, trimmedParams)
def trimParams(params)
(One est mis en cache et l'autre non.)
Mon code dans le 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]
En conséquence, j'ai invoqué le service de recherche avec une liste rognée de paramètres qui ne comprennent pas Ude paging params. Les résultats de recherche mis en cache peuvent être renvoyés.
searchController prend en charge le paging.
note: Je n'ai pas mis en cache les résultats de mise en veille prolongée parce que je finirais par doubler les données dans le cache. J'ai seulement caché les résultats combinés de searchService.searchResults (qui frappe une API REST et ma base de données locale)
Comment le widget de pagination interagirait-il avec ceci? puis-je vider le cache en fonction de l'heure ou de la commande FIFO? – Tihom
Aller à une page différente modifie la chaîne de requête afin que la réponse différente soit mise en cache et servie. Le cache expire automatiquement, donc pas besoin de vidage explicite en fonction de l'heure. Il suffit de le configurer dans Config.groovy sous sprigcache/caches/[cacheName]/timeToLive = ... – mfloryan
Je voudrais éviter la requery pour différentes pages. Comment je fais ça? – Tihom