【问题标题】:Caching data in grails在 grails 中缓存数据
【发布时间】:2011-05-09 01:40:40
【问题描述】:

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

由于初始查询的开销很大,如果后续页面查看的搜索条件没有改变,我想缓存搜索结果。

我目前的方法是这样的:

def search(criteriaMap, offset, pagesize)

在 groovy/grails 中缓存搜索结果的最佳方式是什么?我将如何使搜索结果过期?

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

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

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

@Cacheable("searchCache")
def searchResults(uid, trimmedParams)
def trimParams(params)

(一个被缓存,另一个没有。)

我在 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]

结果,我使用不包括分页参数的精简参数列表调用了搜索服务。可以返回缓存的搜索结果。

searchController 负责分页。

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

【问题讨论】:

    标签: groovy ehcache grails-plugin grails


    【解决方案1】:

    首先,如果你想缓存查询,那么也许使用 Hibernate 查询缓存是一个好的开始(在mappings 中设置cache:true 并将cache: true 传递给executeQuery

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

    EH Cache 本身配置在grails-app/conf/spring/resources.groovy

    -- 更新--

    在您发表评论后,我开始怀疑您可能正在考虑稍微不同的解决方案。所以有一个查询返回一个结果列表,然后该列表被分页并显示。使用标准的 Grails 方法,Hibernate 将为每一页生成一个查询(从完整列表中返回一个子集,从而为每一页运行一次可能代价高昂的查询)。大概您希望查询运行一次 - 返回被缓存的完整结果集,然后从中提供各个页面。 如果是这种情况,据我所知,您将不得不从 Hibernate 缓存中手动分页结果,或者将结果集缓存到其他地方(会话上下文?)

    【讨论】:

    • 分页小部件如何与之交互?我可以根据时间或 FIFO 顺序刷新缓存吗?
    • 转到不同的页面会更改查询字符串,因此会缓存不同的响应然后提供服务。缓存会自动过期,因此无需根据时间显式刷新。只需在 sprigcache/caches/[cacheName]/timeToLive = ... 下的 Config.groovy 中设置它
    • 我想避免重新查询不同的页面。我该怎么做?
    • 查看更新 - 我认为没有现成的解决方案。另一方面 - 您可能能够在数据库端做一些事情,以便对后续页面的查询更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 2011-09-18
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多