【问题标题】:Grails cache-ehcache plugin and TTL valuesGrails cache-ehcache 插件和 TTL 值
【发布时间】:2012-09-13 21:25:53
【问题描述】:

任何人都可以确认 TTL 设置,例如可以使用带有 ehcache 扩展的 grails 缓存插件设置 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。

谢谢

【问题讨论】:

标签: grails ehcache


【解决方案1】:

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

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

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}"
}

有关其他缓存属性,请参阅EhCache javadoc for CacheConfiguration。您还可以通过记录grails.plugin.cachenet.sf.ehcache 来启用缓存的详细调试记录。

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

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

【讨论】:

    【解决方案2】:

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

    compile ":cache-ehcache:1.0.0"
    

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

    【讨论】:

      【解决方案3】:

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

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

      class BootStrap {
      
          def grailsCacheManager
      
          def init = { servletContext ->
              grailsCacheManager.getCache("mycache").nativeCache
                              .cacheConfiguration.timeToLiveSeconds = 60
          }
          def destroy = {
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-02-03
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        • 1970-01-01
        相关资源
        最近更新 更多