Asdfasf

Monday, September 17, 2012

Managing cache with Ehcache

IHTIYAC:

 Uretmesi ve elde etmesi maliyetli olan entity'leri olasi sonradan ihtiyaclarda tekrardan uretmek yerine memory'de tutuyoruz, Bunu basitce entity'leri bir ConcurrentHashMap'de tutup, ihtiyac duydugumuz anda da ulasarak sagliyabiliriz. Ancak outOfMemory almamak icin map'de tuttugumuz bu objelerin belli bir sure sonra expire olmalarini saglamali, hatta Map'de tuttugumuz objelerin sayisini da limitli tutmamiz lazim. Bunun icin belli araliklarda calisan bir TimerTask'imiz var, ve Map'deki entity'leri tarayarak, suresi gecmis entity'leri Map'den temizliyoruz.

Butun bu isi kendimiz manage etmek yerine bunu bizim icin belki de daha optimize yapan bir urun var ehcache.

 Ufak bir test kod'u ile kullanimina bakalim. TTL degerimiz 2 sn, yani cach'e koydugumuz obje 2 sn sonra expire olmali ve cache en fazla 100 eleman bulundurmali, eleman sayisi bunu artarsa, first in first out mantigi ile eski elaman'lar cache'den atilip yerine yenileri konmali:

Dependency'lerimiz:

 <dependencies>  
   <dependency>  
    <groupId>junit</groupId>  
    <artifactId>junit</artifactId>  
    <version>4.7</version>  
    <scope>test</scope>  
   </dependency>  
   <dependency>  
       <groupId>net.sf.ehcache</groupId>  
       <artifactId>ehcache</artifactId>  
       <version>2.0.0</version>  
       <type>pom</type>  
      </dependency>  
      <dependency>  
           <groupId>org.slf4j</groupId>  
           <artifactId>slf4j-log4j12</artifactId>  
           <version>1.5.6</version>  
      </dependency>  
 </dependencies>  

Test Code'u:

 import net.sf.ehcache.Cache;  
 import net.sf.ehcache.CacheManager;  
 import net.sf.ehcache.Element;  
 import net.sf.ehcache.config.CacheConfiguration;  
 import org.junit.Before;  
 import org.junit.Test;  
 /**  
  * Unit test for simple App.  
  */  
 public class AppTest  
 {  
   public static final int TTL_IN_SEC = 2;  
   public static final int MAX_ELEMENT_IN_MEMORY = 100;  
   static {  
     CacheManager manager = CacheManager.create();  
     //Create a Cache specifying its configuration.  
     Cache cache = new Cache(new CacheConfiguration("myCache", 1000).timeToLiveSeconds(TTL_IN_SEC).maxElementsInMemory(100));  
     manager.addCache(cache);  
   }  
   @Before  
   public void init() throws Exception {  
     Cache cache = CacheManager.getInstance().getCache("myCache");  
     Element e = new Element(1, "test");  
     cache.put(e);  
   }  
   @Test  
   public void shouldRemoveAfterTTL() throws Exception {  
     Cache cache = CacheManager.getInstance().getCache("myCache");  
     Element e = cache.get(1);  
     org.junit.Assert.assertEquals(e.getValue(), "test");  
     System.out.println("hit value by 1 = " + e);  
     System.out.println("sleep by TTL + 1 sec ");  
     Thread.sleep(TTL_IN_SEC * 1000 + 1000);  
     e = cache.get(1);  
     org.junit.Assert.assertNull(e);  
     System.out.println("hit value by 1 = " + e);  
   }  
   @Test  
   public void shouldRemoveFirstElementWhenCacheFull() throws Exception {  
     Cache cache = CacheManager.getInstance().getCache("myCache");  
     Element e = cache.get(1);  
     System.out.println("hit value by 1 = " + e);  
     org.junit.Assert.assertEquals(e.getValue(), "test");  
     for (int i = 2; i &lt;= 2 * MAX_ELEMENT_IN_MEMORY; i++) {  
       e = new Element(i, "test" + i);  
       cache.put(e);  
     }  
     e = cache.get(1);  
     org.junit.Assert.assertNull(e);  
     System.out.println("xxhit value by 1 = " + e);  
   }  
 }  

Hizli ve optimize yazilimlar dilegiyle.

No comments: