Groovy 在grails中缓存数据

Groovy 在grails中缓存数据,groovy,ehcache,grails-plugin,grails,Groovy,Ehcache,Grails Plugin,Grails,我有一个网站,用户将首先输入他们的搜索条件。搜索将来自两个来源的数据合并,其中一个不是数据库。搜索结果通常足够大,可以分页 由于初始查询的开销很大,如果后续页面视图的搜索条件不变,我希望缓存搜索结果 我当前的方法如下所示: def search(criteriaMap, offset, pagesize) 在groovy/grails中缓存搜索结果的最佳方式是什么?如何使搜索结果过期 注意,我看到有一个springcache插件,但我不确定这是否适用于分页结果。我还知道grails是用ehca

我有一个网站,用户将首先输入他们的搜索条件。搜索将来自两个来源的数据合并,其中一个不是数据库。搜索结果通常足够大,可以分页

由于初始查询的开销很大,如果后续页面视图的搜索条件不变,我希望缓存搜索结果

我当前的方法如下所示:

def search(criteriaMap, offset, pagesize)
在groovy/grails中缓存搜索结果的最佳方式是什么?如何使搜索结果过期

注意,我看到有一个springcache插件,但我不确定这是否适用于分页结果。我还知道grails是用ehcache打包的,但我还没有看到我可以直接访问的API,我只看到它用于GORM的二级缓存

更新:我参与了@mfloryan的解决方案来解决这个问题

我在搜索服务中创建了两个方法:

@Cacheable("searchCache")
def searchResults(uid, trimmedParams)
def trimParams(params)
def trimmedParams = searchService.trimParams(params)
def results = searchService.searchResults(trimmedParams)

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

[results: results, searchParams : trimmedParams]
(一个缓存,另一个不缓存。)

搜索控制器中的我的代码

@Cacheable("searchCache")
def searchResults(uid, trimmedParams)
def trimParams(params)
def trimmedParams = searchService.trimParams(params)
def results = searchService.searchResults(trimmedParams)

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

[results: results, searchParams : trimmedParams]
结果,我调用了搜索服务,其中包含一个经过修剪的参数列表,其中不包括分页参数。可以返回缓存的搜索结果

searchController负责分页


注意:我没有缓存hibernate结果,因为缓存中的数据会加倍。我只缓存了searchService.searchResults的组合结果(它会访问REST API和我的本地数据库)

首先,如果您想缓存查询,那么使用Hibernate查询缓存可能是一个好的开始(在
映射中设置
缓存:true
,并将
缓存:true
传递给
执行程序

使用将允许缓存来自控制器的整个响应。您需要做的就是像这样装饰控制器:
@Cacheable(“searchMethodCache”)
或者只装饰您想要缓存结果的单个方法。缓存将按查询字符串保存响应,因此它应该可以很好地处理分页。
@CacheFlush
注释允许设置何时清除缓存

EH缓存本身在grails-app/conf/spring/resources.groovy中配置

--更新--

在你发表评论之后,我开始怀疑你可能正在考虑一个稍微不同的解决方案。因此,有一个查询返回一个结果列表,然后分页并显示该列表。使用标准的Grails方法,Hibernate将为每个页面生成一个查询(从完整列表中返回一个子集,从而为每个页面运行一次潜在的昂贵查询)。您可能希望查询只运行一次—返回缓存的完整结果集,然后从it服务单个页面。
如果是这种情况,据我所知,您必须手动从Hibernate缓存或在其他地方缓存结果集(会话上下文?)

分页小部件将如何与此交互?我可以根据时间或FIFO顺序刷新缓存吗?转到不同的页面会更改查询字符串,以便缓存不同的响应,然后提供服务。缓存将自动过期,因此无需根据时间显式刷新。只需在Config.groovy的sprigcache/caches/[cacheName]/timeToLive=…下设置它,我希望避免对不同的页面进行重新查询。我该怎么做?请看更新-我不认为有现成的解决方案。另一方面,您可以在数据库端执行一些操作,以便查询后续页面的速度更快。