在grails中缓存数据

Tih*_*hom 6 grails groovy ehcache grails-plugin

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

由于初始查询很昂贵,如果搜索条件没有随后的页面查看更改,我想缓存搜索结果.

我目前的方法如下:

def search(criteriaMap, offset, pagesize)
Run Code Online (Sandbox Code Playgroud)

在groovy/grails中缓存搜索结果的最佳方法是什么?我如何使搜索结果失效?

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

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

我在searchService中创建了两个方法:

@Cacheable("searchCache")
def searchResults(uid, trimmedParams)
def trimParams(params)
Run Code Online (Sandbox Code Playgroud)

(一个是缓存而另一个不是.)

我在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]
Run Code Online (Sandbox Code Playgroud)

结果,我调用了搜索服务,其中包含一个不包含分页参数的修剪参数列表.可以返回缓存的搜索结果.

searchController负责分页.

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

mfl*_*yan 5

首先,如果你想缓存查询,那么也许使用Hibernate查询缓存是一个好的开始(设置cache:truemappings并传递cache: trueexecuteQuery)

使用SpringCache插件将允许您缓存来自控制器的整个响应.你需要做的就是像这样装饰控制器:@Cacheable("searchMethodCache")或者只装饰你想要缓存结果的各个方法.缓存将通过查询字符串保存响应,因此它应该适用于分页.该@CacheFlush注释允许设置当缓存应该被清除.

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

- 更新 -

在你发表评论后,我开始怀疑你可能会想到一个稍微不同的解决方案.因此,有一个查询返回结果列表,然后分页并显示该列表.使用标准的Grails方法,Hibernate将为每个页面生成一个查询(从完整列表返回一个子集,从而为每个页面运行一次可能昂贵的查询).据推测,您希望查询运行一次 - 返回缓存的完整结果集,然后从中提供单个页面.如果是这种情况,据我所知,你必须手动从Hibernate缓存中分页结果或在其他地方缓存结果集(Session context?)