【问题标题】:How to setup service method caching in grails如何在 grails 中设置服务方法缓存
【发布时间】:2014-11-17 19:00:04
【问题描述】:

我的应用程序有几个通过 httpClient(GET 和 POST)进行外部调用的服务,这些服务在几个月内不太可能发生变化,但它们很慢;使我的应用程序更慢。 澄清:这不是关于将 GORM/hibernate/查询缓存到我的数据库。

如何在 grails 2.1.0 中缓存这些方法(磁盘上的持久性获得奖励积分...)?

我已经安装了 grails-cache-plugin 但它似乎没有工作,或者我配置错误(很难做到,因为只有 2-5 行要添加,但我已经设法做到了过去)

我也尝试在我的应用程序前面设置一个 nginx 代理缓存,但是当我提交一个稍作更改的表单时,我得到了第一次提交的结果。

任何建议/想法将不胜感激。

编辑:当前解决方案(基于 Marcin 的回答)

我的 config.groovy:(仅缓存部分)

//caching
grails.cache.enabled = true
grails.cache.clearAtStartup = false

grails.cache.config = {
    defaults {
        timeToIdleSeconds 3600
        timeToLiveSeconds 2629740
        maxElementsInMemory 1
        eternal false
        overflowToDisk true
        memoryStoreEvictionPolicy 'LRU'
    }

    diskStore {
        path 'cache'
    }

    cache {
        name 'scoring'
    }
    cache {
        name 'query'
    }
}

重要的部分是:

  • 启动时不清除 (grails.cache.clearAtStartup = false)
  • overflowToDisk=true 将所有结果保留在 maxElementsInMemory 上
  • maxElementsInMemory=1 减少内存中的元素数量
  • 'diskStore' 应该可由运行应用程序的用户写入。

【问题讨论】:

  • 缓存插件应该是要走的路。你做了什么没用?

标签: grails caching http-caching


【解决方案1】:

Grails Cache Plugin 在 Grails 2.3.11 下非常适合我。 Documentation 很简洁,但只是给你看一个草稿......

我在Config.groovy中使用以下设置:

grails.cache.enabled = true
grails.cache.clearAtStartup = true

grails.cache.config = {
    defaults {
        maxElementsInMemory 10000
        overflowToDisk false
        maxElementsOnDisk 0
        eternal true
        timeToLiveSeconds 0
    }
    cache {
        name 'somecache'
    }
}

然后,在服务中我使用类似的东西:

@Cacheable(value = 'somecache', key = '#p0.id.toString().concat(#p1)')
def serviceMethod(Domain d, String s) {
    // ...
}

请注意somecache 部分已被重复使用。此外,在我的案例中使用String 作为键也很重要。这就是我在id 上使用toString() 的原因。

插件也可以设置使用磁盘存储,但我不使用。

如果没有帮助,请提供有关您的问题的更多详细信息。

【讨论】:

  • 感谢您的回答,我就是这样开始的,但我仍然需要持久化缓存数据。您还有用于密钥生成的自定义类还是默认就足够了?
  • 默认就够了。考虑持久化...我将Ehcache Cache Plugin 与缓存一起使用,它实际上提供 持久化。例如,overflowToDiskmaxElementsOnDisk 设置描述为here。我很确定这是要走的路。请让我知道我是否可以以任何方式帮助您。发送!
  • 感谢 Marcin,这让我朝着正确的方向前进。我用当前的解决方案持久地编辑了我的问题,但我可能需要稍后对其进行改进。
  • 发送!很高兴我能帮上忙!
【解决方案2】:

这可能没有帮助,但是如果您将应用程序升级到 Grails 2.4.x,您可以使用 @Memoize 注释。这将根据传入的参数自动缓存每个方法调用的结果。

【讨论】:

  • 最终我的想法是迁移到 2.4,但是在看到我的老板与其他更新 (2.1 -> 2.4) 争吵之后,我决定等我有很多时间的时候再做。不过谢谢你的想法。
【解决方案3】:

为了存储这种“几乎静态”的信息,您可以使用 Memcached 或 Redis 作为缓存系统。 (还有很多)

这两个缓存系统允许您存储键值数据(在您的情况下,类似于 "key_GET": JSON,XML,MAP,String )。

这是一个相关的帖子:Memcached vs. Redis?

问候。

【讨论】:

    猜你喜欢
    • 2016-05-09
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2023-04-08
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多