【问题标题】:Spring cache default sizeSpring缓存默认大小
【发布时间】:2020-08-19 09:05:47
【问题描述】:

spring 缓存的默认大小是多少? 如果另一个可以缓存的条目出现怎么办?它是忽略它还是从缓存中删除一个条目以容纳一个新条目?如果它删除,那么它如何决定删除哪个?

我们如何手动提供缓存大小? 我不是指任何其他缓存,例如 Caffeine、EHCache 等。 我指的是默认的 spring 缓存。

【问题讨论】:

    标签: java spring-boot caching spring-cache


    【解决方案1】:

    Spring 的缓存抽象不处理“管理”缓存内容的特定语义和细节(例如大小、驱逐或过期策略)。所以所有这些设置都必须在缓存提供者级别定义(ehcache、hazelcast、infinispan..)。

    spring缓存的默认实现是一个简单的ConcurrentHashMap

    【讨论】:

    • 我确实做到了。我们可以使用如下定义的值来构建缓存管理器: new ConcurrentMapCacheManager() { @Override protected Cache createConcurrentMapCache(final String name) { return new ConcurrentMapCache(name, CacheBuilder.newBuilder().expireAfterWrite(7200, TimeUnit.SECONDS)。 maximumSize(500L).build().asMap(), false); } };
    • 是的,正如我所说,您应该去详细信息提供商那里定义设置策略
    • 你没有这么说。你说“所以所有这些设置必须在缓存提供者级别定义(ehcache、hazelcast、infinispan ..)。”。我没有使用它们中的任何一个。感谢您的回复
    • 我没有列出所有缓存提供程序 ;-) 这就是为什么我把 ... 放在 infinispan 之后。在这里,您所做的是在缓存提供程序级别设置这些设置(此处使用ConcurrentMapCache,因此缓存提供程序是 spring 核心)。要设置这些设置,您必须直接在缓存实现中定义它们。所以在抽象级别什么都没做;-)
    【解决方案2】:
    We can add our own expiry and max limit as follows :
    
     public CacheManager cacheManager() {
    ConcurrentMapCacheManager cacheManager = new ConcurrentMapCacheManager() {
      @Override
      protected Cache createConcurrentMapCache(final String name) {
        return new ConcurrentMapCache(name, CacheBuilder.newBuilder().expireAfterWrite(7200,
            TimeUnit.SECONDS).maximumSize(500L).build().asMap(), false);
      }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 2012-05-08
      • 1970-01-01
      相关资源
      最近更新 更多