gpt4 book ai didi

java - Spring Cacheable vs CachePut?

转载 作者:IT老高 更新时间:2023-10-28 13:50:52 27 4
gpt4 key购买 nike

@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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com