本文介绍了Spring Cacheable与CachePut?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
@CachePut or @Cacheable(value = "CustomerCache", key = "#id")
public Customer updateCustomer(Customer customer) {
sysout("i am inside updateCustomer");
....
return customer;
}
我在 CachePut $ c下找到了以下文档$ c>源代码
这是否意味着我使用 @Cacheable
,updateCustomer方法只执行一次,结果将在缓存中更新。对
updateCustomer的后续调用将不会执行updateCustomer,它只会更新缓存。
Does it mean if I use @Cacheable
, updateCustomer method will be executed only once and result will be updated in cache. Subsequent calls toupdateCustomer will not execute updateCustomer , it will just update the cache.
如果是 @CachePut
, updateCustomer
方法将在每次调用时执行,结果将在缓存中更新。
While in case of @CachePut
, updateCustomer
method will be executed on each call and result will be updated in cache.
我的理解是否正确?
推荐答案
是。
我甚至做了一个测试以确定:
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);
}
}
这篇关于Spring Cacheable与CachePut?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!