【问题标题】:Config Spring cache using Guava使用 Guava 配置 Spring 缓存
【发布时间】:2015-04-02 12:38:07
【问题描述】:

按照spring documentation about cache,我可以在我的项目中使用缓存,但是如何配置 guava 来定义每个缓存名称的过期时间或大小?

applicationConfig.xml

<bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager"/>

Foo.java

@Cacheable(value="courses", key="#user.id")
public List<Course> getCoursesByUser(User user) {
    ...
}

【问题讨论】:

    标签: java spring caching guava


    【解决方案1】:

    您可以在 Spring 配置中为 GuavaCacheManager 指定 CacheBuilder

    1. 如果是 Java 配置,它可能如下所示:
    @Bean
    public CacheManager cacheManager() {
        GuavaCacheManager cacheManager = new GuavaCacheManager();
        cacheManager.setCacheBuilder(
            CacheBuilder.
            newBuilder().
            expireAfterWrite(2, TimeUnit.SECONDS).
            maximumSize(100));
        return cacheManager;
    }
    
    1. 如果是XML配置,可以在guava中使用CacheBuilderSpec
    <bean id="legendaryCacheBuilder"
          class="com.google.common.cache.CacheBuilder"
          factory-method="from">
        <constructor-arg value="maximumSize=42,expireAfterAccess=10m,expireAfterWrite=1h" />
    </bean>
    

    更多信息请看:

    http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/CacheBuilderSpec.html

    Injecting Google guava cache builder into bean via Spring

    【讨论】:

    • 这是全局配置,是否可以通过缓存名设置?
    • 我不确定您所说的全局配置是什么意思,您可以根据需要将它们设置为本地 :)
    • 例如缓存值courses在10分钟过期,而foo在5小时过期
    • 如果你想基于密钥过期,我不知道番石榴中有这样的功能。如果你想在运行的系统中使用很少的 Guava 缓存,那就另当别论了——看看java.dzone.com/articles/spring-caching-abstraction-and
    • 您可以使用具有不同配置的不同 cacheBuilder 创建单独的 cacheManager。然后指定@Cacheable(value="courses", cacheManager="shortTTLCacheManager")@Cacheable(value="foo", cacheManager="longTTLCacheManager")
    【解决方案2】:

    您可以单独配置缓存。见Spring Guava cache

    @Bean
    public CacheManager cacheManager() {
        SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
        GuavaCache bookCache = new GuavaCache("book", CacheBuilder.newBuilder().build());
        GuavaCache booksExpirableCache = new GuavaCache("books", CacheBuilder.newBuilder()
                .expireAfterAccess(30, TimeUnit.MINUTES)
                .build());
        simpleCacheManager.setCaches(Arrays.asList(bookCache, booksExpirableCache));
        return simpleCacheManager;
    }
    

    【讨论】:

      【解决方案3】:

      换一种方式

      XML

         <bean id="cacheManager" class="org.springframework.cache.guava.GuavaCacheManager">
              <property name="cacheBuilderSpec">
                  <bean class="com.google.common.cache.CacheBuilderSpec" factory-method="parse">
                      <constructor-arg name="cacheBuilderSpecification" value="expireAfterWrite=55m"/>
                  </bean>
              </property>
          </bean>
      

      Java

      @Cacheable(value = "tokenValue", cacheManager = "cacheManager")
      

      【讨论】:

        【解决方案4】:

        我认为@mavarazy 的答案是最好的。我只添加如果您需要自己的自动丢失缓存配置,您可以通过以下方式进行。

        首先定义你自己的缓存管理器,如果你需要它会自动创建缓存:

        public class MyCacheManager extends SimpleCacheManager {
        
            @Override
            protected Cache getMissingCache(String name) {
                // or different cache config if you need
                return new GuavaCache(name, CacheBuilder.newBuilder().maximumSize(250).expireAfterWrite(10, TimeUnit.MINUTES).build());
            }
        }
        

        现在您可以定义缓存管理器配置:

        @Bean
        public CacheManager cacheManager() {
            SimpleCacheManager simpleCacheManager = new MyCacheManager();
            GuavaCache specificCacheConfig = new GuavaCache("specificCacheConfigName",
                CacheBuilder.newBuilder().expireAfterAccess(60, TimeUnit.MINUTES).build());
            simpleCacheManager.setCaches(Collections.singletonList(specificCacheConfig));
            return simpleCacheManager;
        }
        

        【讨论】:

          【解决方案5】:

          通过扩展“CachingConfigurerSupport”类,您可以提供自定义缓存定义。

          例如,

          @Configuration
          @EnableCaching
          public class CacheConfig extends CachingConfigurerSupport {
              @Bean
              @Override
              public CacheManager cacheManager() {
              
                  SimpleCacheManager cacheManager = new SimpleCacheManager();
                  GuavaCache myOrgCache = new GuavaCache("myOrgCache", CacheBuilder.newBuilder().build());
                  GuavaCache myEmployeeCache = new GuavaCache("myEmployeeCache",
                          CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build());
                  cacheManager.setCaches(Arrays.asList(myOrgCache, myEmployeeCache));
                  return cacheManager;
              }
          
              @Override
              public KeyGenerator keyGenerator() {
                  return new CacheKeyGenerator();
              }
          }
          

          参考link

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-31
            • 1970-01-01
            • 1970-01-01
            • 2012-10-22
            • 1970-01-01
            相关资源
            最近更新 更多