我的应用程序有几个服务,通过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?
问候。