如何在 grails 中设置服务方法缓存



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

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

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

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

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

编辑:当前解决方案(基于马尔钦的答案)

My 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 Cache Plugin 在 Grails 2.3.11 下对我来说效果很好。文档非常整洁,但只是为了向您展示草稿...

我在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().

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

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

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

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

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

这里有一篇相关文章:Memcached vs. Redis?

问候。

最新更新