java - Spring Cacheable vs CachePut?

标签 java spring caching

@CachePut or @Cacheable(value = "CustomerCache", key = "#id")
public Customer updateCustomer(Customer customer) {
   sysout("i am inside updateCustomer");
    ....
    return customer;
}

我在 CachePut 源代码下找到以下文档

CachePut annotation does not cause the target method to be skipped - rather it always causes the method to be invoked and its result to be placed into the cache.

这是否意味着如果我使用 @Cacheable , updateCustomer 方法将只执行一次,结果将在缓存中更新。后续调用 updateCustomer 不会执行 updateCustomer ,它只会更新缓存。

而在 @CachePut 的情况下,每次调用都会执行 updateCustomer 方法,结果将在缓存中更新。

我的理解正确吗?

最佳答案

是的。

我什至做了一个测试来确定:

@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);
    }

}

关于java - Spring Cacheable vs CachePut?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28516398/

相关文章:

java - 我可以只使用 Spring security 的 CSRF 功能而不使用其 LOGIN 和 LOGOUT 功能吗?

java - 为什么我的哈希集如此耗费内存?

java - 使用 IgnoreCase 进行 Spring Data MongoDB 查询时来自 MongoQueryCreator 的 NullPointerException

java - postman 控制台错误 header 内容包含无效字符

java - Spring Boot - 不支持内容类型 'application/x-www-form-urlencoded;charset=UTF-8'

ios - Service Worker 的 WKWebView 模拟

python - Scrapy 中的项目缓存

java - 无限跨9.1 : Unsupported async cache mode 'REPL_ASYNC' for transactional caches

java - 在 Netbeans 中构建 xml 和 build-impl.xml

java - 使用触摸事件移动 View