在Grails中缓存昂贵的Web服务调用的最佳策略

arc*_*ree 10 grails caching

我有一个简单的Grails应用程序,需要在用户会话期间(使用界面时)多次定期调用外部Web服务.

我想缓存这个Web服务响应,但是服务的结果每隔几天就会发生变化,所以我想将它缓存一小段时间(也许每天刷新一次).

Grails缓存插件似乎不支持"生存时间"实现,所以我一直在探索一些可能的解决方案.我想知道什么插件或程序解决方案最能解决这个问题.

例:

BuildConfig.groovy

plugins{
    compile ':cache:1.0.0'
}
Run Code Online (Sandbox Code Playgroud)

MyController.groovy

def getItems(){
    def items = MyService.getItems()
    [items: items]
}
Run Code Online (Sandbox Code Playgroud)

MyService.groovy

@Cacheable("itemsCache")
class MyService {
    def getItems() {
        def results

        //expensive external web service call

        return results
    }
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

有很多不错的选择.我决定采用Burt建议的插件方法.我已经包含了一个示例答案,对上面的代码示例进行了微小的更改,以帮助其他人想要做类似的事情.此配置在24小时后使缓存失效.

BuildConfig.groovy

plugins{
    compile ':cache:1.1.7'
    compile ':cache-ehcache:1.0.1'
}
Run Code Online (Sandbox Code Playgroud)

Config.groovy中

grails.cache.config = {
    defaultCache {
        maxElementsInMemory 10000
        eternal false
        timeToIdleSeconds 86400
        timeToLiveSeconds 86400
        overflowToDisk false
        maxElementsOnDisk 0
        diskPersistent false
        diskExpiryThreadIntervalSeconds 120
        memoryStoreEvictionPolicy 'LRU'
     }
 }
Run Code Online (Sandbox Code Playgroud)

Bur*_*ith 12

核心插件不支持TTL,但Ehcache插件支持TTL.请参阅http://grails-plugins.github.com/grails-cache-ehcache/docs/manual/guide/usage.html#dsl

http://grails.org/plugin/cache-ehcache插件依赖于http://grails.org/plugin/cache但使用的Ehcache一个替换缓存管理器(所以你需要同时安装)