2015-02-14 6 views
7

मैं CachePut स्रोत कोड के तहत प्रलेखन के नीचे पायावसंत कैशबल बनाम कैशपूट?

CachePut एनोटेशन का कारण नहीं है लक्ष्य विधि को छोड़ दिया करने के लिए किया जा - बल्कि यह हमेशा विधि लागू किया जा करने के लिए कारण बनता है और उसके परिणाम होने के लिए में रखा कैश।

क्या इसका मतलब यह है कि यदि मैं @Cacheable का उपयोग करता हूं, तो अद्यतन ग्राहक विधि केवल एक बार निष्पादित की जाएगी और परिणाम कैश में अपडेट किया जाएगा। बाद में कॉल अपडेट ग्राहक कस्टमर निष्पादित नहीं करेगा ग्राहक, यह केवल कैश अपडेट करेगा।

@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 हमेशा विधि पर अमल कर सकते हैं। आमतौर पर इसका उपयोग आमतौर पर किया जाता है यदि आप विधि कैश के परिणामस्वरूप अपने कैश को अपडेट करना चाहते हैं।
उदाहरण: जब आप पूरी तरह से कैश को उड़ाने के बजाय कैश किए गए एक पुराने डेटा को अपडेट करना चाहते हैं।

@ कैशेबल दिए गए कैशकी के लिए केवल एक बार निष्पादित किया जाएगा और बाद के अनुरोध विधि को निष्पादित नहीं करेंगे, जब तक कि कैश समाप्त हो जाए या फ़्लश न हो जाए।

संबंधित मुद्दे