2015-02-14 2 views
7

Я нашел ниже документации под CachePut исходного кодаSpring Cacheable vs CachePut?

CachePut аннотаций не вызывает целевой метод, который следует пропустить - , а она всегда приводит к тому, что метод будет вызван и его результат будет помещается в кэш.

Означает ли это, что если я использую @Cacheable, метод updateCustomer будет выполнен только один раз, и результат будет обновлен в кеше. Последующие вызовы updateCustomer не будет выполнять updateCustomer, он просто обновит кеш.

В то время как в случае @CachePut, метод updateCustomer будет выполнен для каждого вызова, и результат будет обновлен в кеше.

Правильно ли я понимаю?

ответ

8

Да.

Я даже сделал тест, чтобы убедиться:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = CacheableTest.CacheConfigurations.class) 
public class CacheableTest { 

    public static class Customer { 

     final private String id; 
     final private String name; 

     public Customer(String id, String name) { 
      this.id = id; 
      this.name = name; 
     } 

     public String getId() { 
      return id; 
     } 

     public String getName() { 
      return name; 
     } 

    } 

    final public static AtomicInteger cacheableCalled = new AtomicInteger(0); 
    final public static AtomicInteger cachePutCalled = new AtomicInteger(0); 

    public static class CustomerCachedService { 


     @Cacheable("CustomerCache") 
     public Customer cacheable(String v) { 
      cacheableCalled.incrementAndGet(); 
      return new Customer(v, "Cacheable " + v); 
     } 

     @CachePut("CustomerCache") 
     public Customer cachePut(String b) { 
      cachePutCalled.incrementAndGet(); 
      return new Customer(b, "Cache put " + b); 
     } 

    } 

    @Configuration 
    @EnableCaching() 
    public static class CacheConfigurations { 

     @Bean 
     public CustomerCachedService customerCachedService() { 
      return new CustomerCachedService(); 
     } 

     @Bean 
     public CacheManager cacheManager() { 
      return new GuavaCacheManager("CustomerCache"); 
     } 

    } 

    @Autowired 
    public CustomerCachedService cachedService; 

    @Test 
    public void testCacheable() { 
     for(int i = 0; i < 1000; i++) { 
      cachedService.cacheable("A"); 
     } 
     Assert.assertEquals(cacheableCalled.get(), 1); 
    } 

    @Test 
    public void testCachePut() { 
     for(int i = 0; i < 1000; i++) { 
      cachedService.cachePut("B"); 
     } 
     Assert.assertEquals(cachePutCalled.get(), 1000); 
    } 

} 
9

@CachePut всегда позволяет метод выполнения. Он обычно используется, если вы хотите, чтобы ваш кеш обновлялся с результатом выполнения метода.
Пример: если вы хотите обновить устаревшие данные, которые кэшируются, вместо полного удаления кеша.

@Cacheable будет выполняться только один раз для данного кеш-ключа, а последующие запросы не будут выполнять этот метод, пока кеш не истечет или не будет сброшен.

Смежные вопросы