【问题标题】:Automatic cache invalidation in SpringSpring中的自动缓存失效
【发布时间】:2016-07-26 18:51:18
【问题描述】:

我有一个从服务 XXX 执行一些读取操作的类。这些读取操作最终将执行数据库读取,我想通过缓存类中每个方法的结果为每个方法指定自定义键来优化这些调用。

Class a {

    public Output1 func1(Arguments1 ...) {
    ...
    }

    public Output2 func2(Arguments2 ...) {
    ...
    }

    public Output3 func3(Arguments3 ...) {
    ...
    }

    public Output4 func4(Arguments4 ...) {
    ...
    }
}

我正在考虑使用 Spring caching(@Cacheable annotation) 来缓存每种方法的结果。

但是,我希望通过某种机制(ttl 等)自动发生缓存失效。在 Spring 缓存中这可能吗?我知道我们有一个 @CacheEvict 注释,但我希望自动驱逐。

任何帮助将不胜感激。

【问题讨论】:

    标签: java spring spring-mvc caching invalidation


    【解决方案1】:

    根据Spring documentation(第 36.8 节):

    如何设置 TTL/TTI/Eviction 政策/XXX 功能?

    直接通过您的缓存提供程序。缓存抽象是... 好吧,抽象不是缓存实现。你的解决方案 使用可能支持各种数据策略和不同的拓扑 其他解决方案没有(例如 JDK ConcurrentHashMap) - 在缓存抽象中公开它是 无用只是因为没有后盾支持。这样的 功能应直接通过后备缓存控制, 在配置它时或通过它的原生 API。@

    这意味着 Spring 不直接公开 API 来设置 Time To Live ,而是通过缓存提供程序实现来设置它。这意味着如果缓存提供程序允许动态设置这些属性,则您需要设置 Time 以通过公开的缓存管理器生存。或者,您应该使用 @Cacheable 注释自己配置 Spring 正在使用的缓存区域。

    为了找到@Cacheable 暴露的缓存区域的名称。您可以使用 JMX 控制台浏览应用程序中的可用缓存区域。

    例如,如果您使用EHCache,一旦您知道缓存区域,您就可以像这样提供xml配置:

    <cache name="myCache"
          maxEntriesLocalDisk="10000" eternal="false" timeToIdleSeconds="3600"
          timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU">
    </cache>
    

    再次重申,所有配置都是特定于缓存提供程序的,Spring 在处理它时不会公开接口。

    备注:如果没有定义缓存提供者,Spring 配置的默认缓存提供者是ConcurrentHashMap。它不支持生存时间。为了获得此功能,您必须切换到不同的缓存提供程序(例如 EHCache)。

    【讨论】:

    • 你能指出为基本 Spring 缓存设置 ttl 的配置吗?我在docs.spring.io/spring/docs/current/spring-framework-reference/… 的文档中找不到任何与 ttl 相关的配置
    • 您好@KumarMrinal 很抱歉让您失望了,但 Spring 配置的默认缓存是 ConcurrentHashMap,它不支持 Time Live。这意味着您必须切换到另一个支持 is 的提供商。我上面已经提到的EHCache对于非分布式缓存提供者来说是一个不错的选择。
    • @AlexanderPetrov 不错的答案,最好提供指向缓存提供程序的链接(例如您在答案中提到的 EhCache)以及指向您从中获得的 Spring 参考文档的链接引用。
    • @M.Deinum 链接已添加
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 2022-08-08
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多