我有一个网站,用户将首先输入他们的搜索条件。搜索结合了来自 2 个来源的数据,其中之一不是数据库。搜索结果通常足够大,可以分页。
由于初始查询的开销很大,如果后续页面浏览的搜索条件没有改变,我想缓存搜索结果。
我目前的方法看起来像:
def search(criteriaMap, offset, pagesize)
在 groovy/grails 中缓存搜索结果的最佳方法是什么?我将如何使搜索结果过期?
请注意,我看到有一个 springcache 插件,但我不确定这是否适用于分页结果。我也知道 grails 与 ehcache 一起打包,但我还没有看到我可以直接访问的 API,我只看到它用于 GORM 的二级缓存。
更新 :我参与了@mfloryan 的解决方案来解决这个问题。
我在 中创建了两个方法搜索服务 :
@Cacheable("searchCache")
def searchResults(uid, trimmedParams)
def trimParams(params)
(一个被缓存,另一个没有。)
我在 中的代码搜索 Controller :
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 负责分页。
备注 :我没有缓存休眠结果,因为我最终会得到双倍缓存中的数据。我只缓存了来自 searchService.searchResults 的组合结果(它访问了 REST API 和我的本地数据库)
最佳答案
首先,如果您想缓存查询,那么使用 Hibernate 查询缓存也许是一个好的开始(在 cache:true
中设置 mappings
并将 cache: true
传递给 executeQuery
)
使用 SpringCache plug-in将允许您缓存来自 Controller 的整个响应。您需要做的就是像这样装饰 Controller :@Cacheable("searchMethodCache")
或者只装饰你想要缓存结果的单个方法。缓存将通过查询字符串保存响应,因此它应该适用于分页。@CacheFlush
注释允许设置何时应清除缓存。
EH 缓存本身在 grails-app/conf/spring/resources.groovy
中配置
- 更新 -
在您发表评论之后,我开始怀疑您可能正在考虑稍微不同的解决方案。所以有一个查询返回结果列表,然后该列表被分页并显示。使用标准的 Grails 方法,Hibernate 将为每个页面生成一个查询(从完整列表中返回一个子集,从而为每个页面运行一次可能昂贵的查询)。大概您希望查询运行一次 - 返回缓存的完整结果集,然后从中提供单个页面。
如果是这种情况,据我所知,您将不得不从 Hibernate 缓存手动分页结果或将结果集缓存在其他地方( session 上下文?)
关于groovy - 在 grails 中缓存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4164869/