5

谁能确认是否可以使用带有 ehcache 扩展的 grails 缓存插件来设置 TTL 设置,例如 timeToLiveSeconds?

基本插件的文档明确声明不支持 TTL,但 ehcache 扩展提到了这些值。到目前为止,我还没有成功为我的缓存设置 TTL 值:

grails.cache.config = {
    cache {
        name 'messages'
        maxElementsInMemory 1000
        eternal false
        timeToLiveSeconds 120
        overflowToDisk false
        memoryStoreEvictionPolicy 'LRU'
    }
}

@Cacheable('messages')
def getMessages()

但是,消息会无限期地缓存。我可以使用 @CacheEvict 注释手动刷新缓存,但我希望在使用 ehcache 扩展时支持 TTL。

谢谢

4

3 回答 3

5

是的,该cache-ehcache插件绝对支持 TTL 和 EhCache 原生支持的所有缓存配置属性。如文档中所述,基本缓存插件实现了一个不支持 TTL 的简单内存缓存,但缓存 DSL 将通过任何未知的配置设置传递给底层缓存提供程序。

您可以通过将以下内容添加到Config.groovy或来配置 EhCache 设置CacheConfig.groovy

grails.cache.config = {
    cache {
        name 'mycache'
    }

    //this is not a cache, it's a set of default configs to apply to other caches
    defaults {
        eternal false
        overflowToDisk true
        maxElementsInMemory 10000
        maxElementsOnDisk 10000000
        timeToLiveSeconds 300
        timeToIdleSeconds 0
    }
}

您可以在运行时验证缓存设置,如下所示:

grailsCacheManager.cacheNames.each { 
   def config = grailsCacheManager.getCache(it).nativeCache.cacheConfiguration
   println "timeToLiveSeconds: ${config.timeToLiveSeconds}"
   println "timeToIdleSeconds: ${config.timeToIdleSeconds}"
}

有关其他缓存属性,请参阅CacheConfiguration 的 EhCache javadoc 。您还可以通过 logginggrails.plugin.cachenet.sf.ehcache.

请注意,Grails 缓存插件实现了自己的缓存管理器,它与本机 EhCache 缓存管理器不同且分开。如果您直接配置了 EhCache(使用 ehcache.xml 或其他方式),那么这些缓存将与 Grails 插件管理的缓存分开运行。

注意:在旧版本的 Cache-EhCache 插件中确实存在一个错误,即 TTL 设置未正确设置并且对象将在一年内到期;这已在Grails-Cache-Ehcache 1.1中修复。

于 2013-01-17T21:04:07.860 回答
0

ehcache 核心插件支持 TTL 属性。你是如何安装插件的?对于我的项目,我只有:

compile ":cache-ehcache:1.0.0"

在插件闭包中的 BuildConfig.groovy 中。由于此插件依赖于核心 grails 缓存插件,因此您无需声明它。

于 2012-11-13T19:36:40.327 回答
0

grails-app/conf/BootStrap.groovy我可以在启动时使用脚本覆盖配置来解决此问题。

例如,这是用于覆盖名为“mycache”的缓存的默认生存时间为60 秒的脚本:

class BootStrap {

    def grailsCacheManager

    def init = { servletContext ->
        grailsCacheManager.getCache("mycache").nativeCache
                        .cacheConfiguration.timeToLiveSeconds = 60
    }
    def destroy = {
    }
}
于 2015-10-21T16:05:40.537 回答