Spring Cacheable vs CachePut?

后端 未结 3 1178
你的背包
你的背包 2020-12-15 04:21
@CachePut or @Cacheable(value = \"CustomerCache\", key = \"#id\")
public Customer updateCustomer(Customer customer) {
   sysout(\"i am inside updateCustomer\");
             


        
相关标签:
3条回答
  • 2020-12-15 05:10

    Yes, you are absolutely correct.

    @Cacheput and @Cacheable are used in conjunction.

    @Cacheable will not update the cache on every call. In order to remove the stale data, there must be a service that uses the @Cacheput that clears the stale data.

    Below answer is for the ones who are using guava caching to build cache. Using guava caching, the time interval that is applied will empty the cache after a certain period of time which is not the case with @Cacheput. @Cacheput will only update the values that are stale and hence it calls the method every time to update the cache.

    I hope my answer clears your question.

    0 讨论(0)
  • 2020-12-15 05:13

    @CachePut always lets the method execute. It is generally used if you want your cache to be updated with the result of the method execution.
    Example: When you want to update a stale data which is cached, instead of blowing the cache completely.

    @Cacheable will be executed only once for the given cachekey and subsequent requests won't execute the method, until the cache expires or gets flushed.

    0 讨论(0)
  • 2020-12-15 05:17

    Yes.

    I even made a test to be sure:

    @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);
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题