æè¿ã¯ãä»äºã§Ehcacheã䜿ã£ãŠããããä»ã«ã調ã¹ããããããšããã£ãã®ã§ãã¡ãã£ãšJavaã§äœ¿ãããªãŒãã³ãœãŒã¹ãªãã£ãã·ã¥ã©ã€ãã©ãªã«ã€ããŠãŸãšããŠã¿ãããšã«ããŸããã
ãããããªã«å€§ããå 容ã§ã¯ãªãã®ã§ããæåŸ ãªããã¬ããâŠã
ã§ãŸããæ¹ããŠèª¿ã¹ãŠã¿ãææ³ãšããŠã¯ãEhcacheãçŸç¶ããã¡ã¯ãã«ãªã£ãŠããããšãæ¹ããŠããã£ãæãã§ãããJavaã®ãã£ãã·ã¥ã©ã€ãã©ãªã£ãŠãããããæ°ãèŠã€ãããã§ããã©ãéçºãæ¢ãŸã£ãŠããŸã£ãŠãããã®ãå€ãã£ãããããã¥ã¡ã³ããå šç¶ãªããšãããã®ããã£ããå€ããŠãå²ãšã«ãªã¹âŠã
ãããã軜éã§æ°è»œã«å°å ¥ã§ãããã£ãã·ã¥ã©ã€ãã©ãªã£ãŠãä»ã¯ãªãæãã§ãããGuavaããã£ãã·ã¥ã ãã§ç¬ç«ããŠããã°âŠãEhcacheãšãInfinispanã ãšãæ©èœã§å°ãããšã¯ãªããšæããŸãããã¡ãããšå€§ããã§ãããã
調ã¹ãæã«æ°ã«ãªãã®ã¯ã以äžã®ãããªãšããã§ããããã
åç§° | ã©ã€ã»ã³ã¹ | ææ°å®å®ç | ã¢ã€ãã«æéã«ããæå¹æé(idleTime) | ãšã³ããªèªäœã®æå¹æé(TTL) | ãªãã£ã·ã£ã«ãµã€ãURL |
---|---|---|---|---|---|
Evictionæãã®å Žåã®ã¢ã«ãŽãªãºã | ãã£ã¹ã¯ãªã©ãžã®ä¿å | Maven Centralãžã®ç»é² | ããã¥ã¡ã³ã | JSR-107å¯Ÿå¿ |
---|---|---|---|---|
åã©ã€ãã©ãªã®ããŒãžã§ã³ã¯ã2013/7/23æç¹ã®ãã®ã§ãã
æ§èœã«é¢ããŠã¯ã調ã¹ãŠãŸããããã®ã©ã€ãã©ãªèªèº«ãå ¬éããŠããããã©ãŒãã³ã¹æž¬å®çµæãšãã¯ãã¡ããã¡ããèŠãŠãŸããã
代ããã«ãå人çã«èå³ã®ããã©ã€ãã©ãªã¯ãç°¡åãªãœãŒã¹ãçšæããŸããã
æ
å ±åéã®ãšã£ãããã¯ããã®ãããã«ãªããŸãã
http://stackoverflow.com/questions/230649/lightweight-java-object-cache-api
http://java-source.net/open-source/cache-solutions
ããšãJava EE 7ã§ã¯å°å ¥ã¯èŠéãããŸããããJavaã®ãã£ãã·ã¥ã®æšæºAPIãšããŠãJSR-107ããããŸãã
詳现ã¯ããã¡ãã«ã
https://github.com/jsr107/jsr107spec
Java EE 8ã§ã¯å ¥ããšããã§ããã
äžå¿ãReference ImplementationããããŸãããåçšç°å¢ã§äœ¿ã£ã¡ããã¡ã§ããã
https://github.com/jsr107/RI
ã§ã¯ããã£ãŠã¿ãŸãããã
Ehcache
ãåç¥ãJavaã®ãã£ãã·ã¥ã©ã€ãã©ãªã®ä»£è¡šéžæã
ãã£ãã·ã¥ãšã³ããªã®ãã£ã¹ã¯ãžã®ä¿åãã¬ããªã±ãŒã·ã§ã³ããã©ã³ã¶ã¯ã·ã§ã³ãã€ãã³ããªã¹ããªã©ããªã髿©èœã§ãã ããããããéžãã§ããã°ãééãã¯ãªãããããšâŠããªãã£ã·ã£ã«ãµã€ãã®ããã¥ã¡ã³ãããããªãå å®ããŠããŸãã
Javaã®æšæºãã£ãã·ã³ã°APIãJSR-107ã®å®è£ ã§ããããŸãã
åç§° | ã©ã€ã»ã³ã¹ | ææ°å®å®ç | ã¢ã€ãã«æéã«ããæå¹æé(idleTime) | ãšã³ããªèªäœã®æå¹æé(TTL) | ãªãã£ã·ã£ã«ãµã€ãURL |
---|---|---|---|---|---|
Ehcache | OSSçã¯Apache License 2.0 | 2.7.2 ïŒ2013/7/2ïŒ | â | â | http://ehcache.org/ |
Evictionæãã®å Žåã®ã¢ã«ãŽãªãºã | ãã£ã¹ã¯ãªã©ãžã®ä¿å | Maven Centralãžã®ç»é² | ããã¥ã¡ã³ã | JSR-107å¯Ÿå¿ |
---|---|---|---|---|
LRU, LFU, FIFO | â | â | â | â |
åçšçã¯ãçŸåšBigMemory Maxãšããååã®è£œåãããã§ãã忣ãã£ãã·ã¥ããã£ãã·ã¥ã®å®¹éå¶éãªããoff-heapãªã©ãããã«ãããã髿©èœã«ãªããŸãã
æ®éã«äœ¿ãåã«ã¯ããªãŒãã³ãœãŒã¹çã§å°ãããšã¯ãªããšæããŸãããæ¥æ¬èªã§ã®æ å ±ãããããªãã«èŠã€ãããããšæããŸãã®ã§ã
ã§ã¯ãã³ãŒãäŸãã
Mavenã®èšå®ã
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.7.2</version> </dependency>
èšå®ãã¡ã€ã«ã®ãµã³ãã«ã
<?xml version="1.0" encoding="UTF-8"?> <ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap" /> </defaultCache> <cache name="memoryCache" maxEntriesLocalHeap="100" eternal="false" timeToIdleSeconds="3" timeToLiveSeconds="6" memoryStoreEvictionPolicy="LFU"> <persistence strategy="none" /> </cache> </ehcache>
ã³ãŒãã®ãµã³ãã«ã
package caching.ehcache; import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element; import net.sf.ehcache.config.CacheConfiguration; public class EhcacheExample { public static void main(String[] args) { CacheManager cacheManager = CacheManager.newInstance( EhcacheExample.class.getResourceAsStream("/ehcache.xml")); // èšå®ãã¡ã€ã«ã®ååããehcache.xmlãã§ãã¯ã©ã¹ãã¹äžã«ããå Žåã¯ä»¥äžã§ãOK // CacheManager cacheManager = CacheManager.newInstance(); try { // Ehcacheã®å Žåã¯ãdefaultã®å®çŸ©ãå ã«ãã£ãã·ã¥ãäœæããå Žå㯠// å¥éCacheã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠãCacheManager#addCacheãåŒã³åºãå¿ èŠããã CacheConfiguration defaultCacheConfiguration = cacheManager.getConfiguration().getDefaultCacheConfiguration().clone(); defaultCacheConfiguration.setName("defaultCache"); cacheManager.addCache(new Cache(defaultCacheConfiguration)); Cache defaultCache = cacheManager.getCache("defaultCache"); // åå¥ã«èšå®ããcache Cache cache = cacheManager.getCache("memoryCache"); // ãã£ãã·ã¥ãžã®ãžã®ãšã³ããªã®ç»é² Element putEntry = new Element("key1", "value1"); cache.put(putEntry); cache.put(new Element("key2", "value2")); // ãã£ãã·ã¥ããã®ãšã³ããªã®ååŸ Element getElement = cache.get("key1"); String getValue = (String) getElement.getObjectValue(); System.out.println(getValue); // ãã£ãã·ã¥ããã®ãšã³ããªã®åé€ cache.remove("key1"); // ãã£ãã·ã¥ããã®ãšã³ããªã®å šåé€ cache.removeAll(); // Expireã®ç¢ºèª cache.put(new Element("key3", "value3")); cache.put(new Element("key4", "value4")); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã²ãšã€ã ããã¢ã¯ã»ã¹ System.out.println(cache.get("key3") != null); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã¢ã¯ã»ã¹ãããšã³ããªã®ã¿ããã£ãã·ã¥ã«æ®ã£ããŸãŸ System.out.println(cache.get("key3") != null); System.out.println(cache.get("key4") == null); try { Thread.sleep(7 * 1000L); } catch (InterruptedException e) { } // ããã²ãšã€ã®ãšã³ããªããæå¹æéãåãã System.out.println(cache.get("key3") == null); System.out.println(cache.get("key4") == null); } finally { cacheManager.shutdown(); } } }
Guava Cache
Googleã®ã©ã€ãã©ãªã§ããGuavaã«ããã£ãã·ã¥çšã®ããã±ãŒãžãå«ãŸããŠããŠãã¡ããæ¯èŒç軜éãªãã£ãã·ã¥ã©ã€ãã©ãªãšããŠç޹ä»ãããããã§ãã®ã§ã
ããã¥ã¡ã³ãã¯Wikiã«ãåºæ¬çãªããšãããããæžããŠããæãã§ãããŸããããšã¯è§Šã£ãŠæ £ããã°å°ããªãæ°ãããŸããã
ããšãPDFã§ã®è³æããããŸãã
http://guava-libraries.googlecode.com/files/JavaCachingwithGuava.pdf
åç§° | ã©ã€ã»ã³ã¹ | ææ°å®å®ç | ã¢ã€ãã«æéã«ããæå¹æé(idleTime) | ãšã³ããªèªäœã®æå¹æé(TTL) | ãªãã£ã·ã£ã«ãµã€ãURL |
---|---|---|---|---|---|
Guava | Apache License 2.0 | 14.0.1ïŒ2013/3/15ïŒ | â | â | https://code.google.com/p/guava-libraries/ |
Evictionæãã®å Žåã®ã¢ã«ãŽãªãºã | ãã£ã¹ã¯ãªã©ãžã®ä¿å | Maven Centralãžã®ç»é² | ããã¥ã¡ã³ã | JSR-107å¯Ÿå¿ |
---|---|---|---|---|
ãµã€ãº, æéãéã¿ä»ã | à | â | â | à |
Ehcacheã®ããã«ããšã³ããªã®ãã£ã¹ã¯ãžã®ä¿åã¿ãããªæ©èœã¯ãããŸãããåŸè¿°ã®LoadingCacheã䜿ãã°ãé 匵ãããããããŸãããâŠãèšå®ããAPIã§çµã¿ç«ãŠããæååããŒã¹ã§ããŒã¹ãããããã®2éãã®æ¹æ³ããããŸãããæç€ºçãªèšå®ãã¡ã€ã«ã®æ©æ§ãªã©ã¯ãªãã¿ããã§ãã
ãããããBetaã¢ãããŒã·ã§ã³ãä»ããŠãããšããã®ã¯ã©ã¹ã¯Betaçã ãšããããšãªã®ã§ãããããã ãšã»ãšãã©ã®ã¯ã©ã¹ãBetaçãªãã§ããã©âŠã
ããšããã£ãã·ã¥åäœã®æ©èœãšããŠã¯ãããã·ã³ãã«ã§ããããããæã£ãŠãããšãã®ä»ã®Guavaã®CollectionããFunctionããã®åçš®ã©ã€ãã©ãªãä»ããŠããã®ã§ãçµæãšããŠãããããããã©ã€ãã©ãªãšããŠåã蟌ãããšã«ãªã£ãŠããŸããŸãã
Mavenã®èšå®ã
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>14.0.1</version> </dependency>
ã³ãŒãã®ãµã³ãã«ã
package caching.guava; import java.util.concurrent.TimeUnit; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; public class GuavaCacheExample { public static void main(String[] args) { Cache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(100) .expireAfterAccess(3, TimeUnit.SECONDS) .expireAfterWrite(6, TimeUnit.SECONDS) .build(); // äžèšèšå®ããæååã§æå®ããããšãå¯èœ // String spec = "maximumSize=100,expireAfterAccess=3s,expireAfterWrite=6s"; // Cache<String, String> cache = CacheBuilder.from(spec).build(); // ãã£ãã·ã¥ãžã®ãžã®ãšã³ããªã®ç»é² cache.put("key1", "value1"); cache.put("key2", "value2"); // ãã£ãã·ã¥ããã®ãšã³ããªã®ååŸ String value = cache.getIfPresent("key1"); System.out.println(value); // ãã£ãã·ã¥ããã®ãšã³ããªã®åé€ cache.invalidate("key1"); // ãã£ãã·ã¥ããã®ãšã³ããªã®å šåé€ cache.invalidateAll(); // Expireã®ç¢ºèª cache.put("key3", "value3"); cache.put("key4", "value4"); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã²ãšã€ã ããã¢ã¯ã»ã¹ System.out.println(cache.getIfPresent("key3") != null); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã¢ã¯ã»ã¹ãããšã³ããªã®ã¿ããã£ãã·ã¥ã«æ®ã£ããŸãŸ System.out.println(cache.getIfPresent("key3") != null); System.out.println(cache.getIfPresent("key4") == null); try { Thread.sleep(7 * 1000L); } catch (InterruptedException e) { } // ããã²ãšã€ã®ãšã³ããªããæå¹æéãåãã System.out.println(cache.getIfPresent("key3") == null); System.out.println(cache.getIfPresent("key4") == null); } }
Guavaã®ãã£ãã·ã¥ã§é¢çœãã®ã¯ãLoadingCacheãšããã®ããã£ãŠããã£ãã·ã¥ããgetãè¡ã£ãŠãšã³ããªããªãã£ãæã«ãã£ãã·ã¥åŽã«å¯Ÿè±¡ã®ããŒã¿ãããŒãããæ©èœããããŸãã
ãã®ãµã³ãã«ã§ãã以äžã®ã³ãŒãã¯ã2ã€ã®ããŒã«å¯ŸããŠãããã2ågetããŠããŸããååŸå¯Ÿè±¡ã®ããŒã¿ã¯sleepããããŠããããéãã®ã§ããã1åç®ã®getã§ãã£ãã·ã¥ã«ããŒã¿ãå ¥ãããã2åç®ã®åŒã³åºãã¯é«éã«è¡ãããŸãã
package caching.guava; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import com.google.common.cache.LoadingCache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; public class GuavaLoadingCacheExample { private static String getValue(String k) { try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } return "value" + k.substring(k.length() - 1); } public static void main(String[] args) { LoadingCache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(100) .expireAfterAccess(3, TimeUnit.SECONDS) .expireAfterWrite(6, TimeUnit.SECONDS) .build(new CacheLoader<String, String>() { public String load(String key) throws Exception { System.out.println("Load Key => " + key); return getValue(key); } }); // ãã£ãã·ã¥ãžã®ãšã³ããªã®ããŒããšååŸããåæã«è¡ã try { String value1 = cache.get("key1"); System.out.println(value1); String value2 = cache.get("key2"); System.out.println(value2); value1 = cache.get("key1"); System.out.println(value1); value2 = cache.get("key2"); System.out.println(value2); } catch (ExecutionException e) { e.printStackTrace(); } } }
JCSïŒJava Caching SystemïŒ
Apache Software Foundationã®ãã£ãã·ã¥ã©ã€ãã©ãªã§ããéçºçã¯2.0-SNAPSHOTãªã®ã§ããããããã©ãããç¶æ³ãªãã§ãããã
JCSèªäœã¯ãEhcacheã«èŠå£ãããªã髿©èœãªãã£ãã·ã¥ã©ã€ãã©ãªã§ãã
åç§° | ã©ã€ã»ã³ã¹ | ææ°å®å®ç | ã¢ã€ãã«æéã«ããæå¹æé(idleTime) | ãšã³ããªèªäœã®æå¹æé(TTL) | ãªãã£ã·ã£ã«ãµã€ãURL |
---|---|---|---|---|---|
JCS | Apache License 2.0 | 1.3ïŒ2007/7/7ïŒ | â | â | http://commons.apache.org/proper/commons-jcs/ |
Evictionæãã®å Žåã®ã¢ã«ãŽãªãºã | ãã£ã¹ã¯ãªã©ãžã®ä¿å | Maven Centralãžã®ç»é² | ããã¥ã¡ã³ã | JSR-107å¯Ÿå¿ |
---|---|---|---|---|
FIFO, LRU, MRU | â | â | â | Ã |
ããã¥ã¡ã³ãã¯ãŸããŸããæ€çŽ¢ããŠãããããªãã«æ å ±ã¯èŠã€ããããšãã§ããŸãã
ã§ãããææ°ã®å®å®çã¯2007幎ã®1.3ã§ãããJDK 1.3ã§ã³ã³ãã€ã«ãããŠãããšããçžåœå€ããã®ãªã®ã§ãä»ãããéžã¶çç±ã¯ãªãããã§ããâŠãããã䜿ããªããEhcacheã䜿ãã§ãããã
Mavenã®èšå®ã
<dependency> <groupId>org.apache.jcs</groupId> <artifactId>jcs</artifactId> <version>1.3</version> </dependency>
èšå®ãã¡ã€ã«ã®ãµã³ãã«ããcache.ccfããšããååã§äœããŸãã
ïŒã¢ã€ãã«ç¶æ
ã«ããæå¹æéåã確èªã®ãããShrinkerIntervalSecondsããã£ã¡ãçãããŠãŸã
# DEFAULT CACHE REGION jcs.default= jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes jcs.default.cacheattributes.MaxObjects=10000 jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache jcs.default.cacheattributes.cacheattributes.UseMemoryShrinker=true jcs.default.cacheattributes.UseMemoryShrinker=true jcs.default.cacheattributes.ShrinkerIntervalSeconds=2 jcs.default.elementattributes.IsEternal=false jcs.default.elementattributes.MaxLifeSeconds=120 jcs.region.small= jcs.region.small.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes jcs.region.small.cacheattributes.MaxObjects=10000 jcs.region.small.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache jcs.region.small.cacheattributes.UseMemoryShrinker=true jcs.region.small.cacheattributes.ShrinkerIntervalSeconds=2 jcs.region.small.cacheattributes.MaxMemoryIdleTimeSeconds=3 jcs.region.small.elementattributes.IsEternal=false jcs.region.small.elementattributes.MaxLifeSeconds=6
ã³ãŒãã®ãµã³ãã«ã
package caching.jcs; import org.apache.jcs.JCS; import org.apache.jcs.access.exception.CacheException; public class JcsExample { public static void main(String[] args) { try { // ããã©ã«ãã®å®çŸ©ãå ã«äœæãããJCSã®ã€ã³ã¹ã¿ã³ã¹ JCS defaultJcs = JCS.getInstance("default"); // åå¥ã«èšå®ããJCSã®ã€ã³ã¹ã¿ã³ã¹ JCS smallJcs = JCS.getInstance("small"); // ãã£ãã·ã¥ãžã®ãžã®ãšã³ããªã®ç»é² smallJcs.put("key1", "value1"); smallJcs.put("key2", "value2"); // ãã£ãã·ã¥ããã®ãšã³ããªã®ååŸ String value = (String) smallJcs.get("key1"); System.out.println(value); // ãã£ãã·ã¥ããã®ãšã³ããªã®åé€ smallJcs.remove("key1"); // ãã£ãã·ã¥ããã®ãšã³ããªã®å šåé€ smallJcs.clear(); // Expireã®ç¢ºèª smallJcs.put("key3", "value3"); smallJcs.put("key4", "value4"); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã²ãšã€ã ããã¢ã¯ã»ã¹ System.out.println(smallJcs.get("key3") != null); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã¢ã¯ã»ã¹ãããšã³ããªã®ã¿ããã£ãã·ã¥ã«æ®ã£ããŸãŸ System.out.println(smallJcs.get("key3") != null); System.out.println(smallJcs.get("key4") == null); try { Thread.sleep(7 * 1000L); } catch (InterruptedException e) { } // ããã²ãšã€ã®ãšã³ããªããæå¹æéãåãã System.out.println(smallJcs.get("key3") == null); System.out.println(smallJcs.get("key4") == null); defaultJcs.dispose(); smallJcs.dispose(); } catch (CacheException e) { e.printStackTrace(); } } }
Apache DirectMemory
ASFã«ãããã¡ãã£ãšå€ãã£ããã£ãã·ã¥ã©ã€ãã©ãªã2012/7/7ã«0.1-incubatorããªãªãŒã¹ããããæ¯èŒçæ°ãããã£ãã·ã¥ã©ã€ãã©ãªãããšããšãGithubäžã§äœãããŠãããã®ããASFã«ç§»ã£ãŠãããã®ã¿ããã§ãã
ãã®ã©ã€ãã©ãªãå€ãã£ãŠããã®ã¯ãoff-heapã¡ã¢ãªãåé¢ã«åºããŠãããšããã§ãããNIOã®ByteBuffer.allocateDirectã§ç¢ºä¿ãããJavaVMããŒãå€ã®ã¡ã¢ãªããã£ãã·ã¥ã«äœ¿çšããŸãã
ããŒãå ã®ãã£ãã·ã¥ãšæ¯ã¹ãŠãGCã®åœ±é¿ãåããªãå©ç¹ããããŸãããã·ãªã¢ã©ã€ãºïŒãã·ãªã¢ã©ã€ãºã®ã³ã¹ããããããšãããã¬ãŒããªãã§ããã
è³æãããã¿ããã§ãã
http://www.slideshare.net/benoitperroud/direct-memory-jugl20120308-12607297
ãã£ãã·ã¥ã©ã€ãã©ãªã§off-heapã®æ©èœãæã€ãã®ã¯Terracottaã ã£ãããHazelcastã ã£ãããšã§ãããŸããããã®æ©èœã¯åçšã©ã€ã»ã³ã¹ã ã£ããããã®ã§ããããæ£é¢ã«åºããŠãããšãããšããã¯ã¡ãã£ãšé¢çœãã§ãã
ããããæ®éã®ããŒãäžã§ç®¡çãããã£ãã·ã¥ããããŸããâŠã
åç§° | ã©ã€ã»ã³ã¹ | ææ°å®å®ç | ã¢ã€ãã«æéã«ããæå¹æé(idleTime) | ãšã³ããªèªäœã®æå¹æé(TTL) | ãªãã£ã·ã£ã«ãµã€ãURL |
---|---|---|---|---|---|
Apache DirectMemory | Apache License 2.0 | ãªã(0.1-incubatingã¯2012/7/9 | à | â | http://directmemory.apache.org/ |
Evictionæãã®å Žåã®ã¢ã«ãŽãªãºã | ãã£ã¹ã¯ãªã©ãžã®ä¿å | Maven Centralãžã®ç»é² | ããã¥ã¡ã³ã | JSR-107å¯Ÿå¿ |
---|---|---|---|---|
ãªã | à | â | à | à |
ãªãã£ã·ã£ã«ãµã€ãããã ååšããã ãã§ãããããã¥ã¡ã³ããçç¡ãæ©èœçã«ãã¡ãã£ãšå°ãªéãïŒãšããæããªã®ã§ãã¡ãã£ãšäœ¿ããç¶æ ã§ã¯ãªãããã§ãã
ã¢ãããŒããšããŠã¯ãèå³ããã£ãã®ã§ãä»ååãäžããŠã¿ãŸããã
éçºäžã®0.2ã§ã¯ãèšå®ãã¡ã€ã«ã®å°å ¥ãsun.misc.Unsafeã䜿ã£ãã¡ã¢ãªã¢ãã±ãŒã¿ãSolrãEhcacheãGuavaãšããšé¢é£ããããªããã±ãŒãžãšããå ¥ã£ãŠãŸããããä»åŸã¯ã©ããªãããšããâŠã
ä»åã¯ã0.1-incubatingã䜿ã£ããµã³ãã«ãèŒããŸããä»åŸãããã倿Žãå ¥ããšæãã®ã§ãå šç¶åèã«ãªããªãæ°ãããŸããïŒç¬ïŒã
Mavenã®èšå®ã
<dependency> <groupId>org.apache.directmemory</groupId> <artifactId>directmemory-cache</artifactId> <version>0.1-incubating</version> </dependency>
ã³ãŒãã®ãµã³ãã«ã
package caching.directmemory; import org.apache.directmemory.DirectMemory; import org.apache.directmemory.cache.CacheService; import org.apache.directmemory.measures.Ram; import org.apache.directmemory.memory.Pointer; public class DirectMemoryExample { public static void main(String[] args) { CacheService<String, String> cache = new DirectMemory<String, String>() .setNumberOfBuffers(4) .setInitialCapacity(100) .setSize(Ram.Mb(1)) .setDisposalTime(3) // æå¹æéã®åãããšã³ããªã®ãã§ãã¯éé .newCacheService(); // cache.scheduleDisposalEvery(1000L); // ãã£ãã·ã¥ãžã®ãžã®ãšã³ããªã®ç»é² cache.put("key1", "value1"); cache.put("key2", "value2"); // ãã£ãã·ã¥ããã®ãšã³ããªã®ååŸ String value = cache.retrieve("key1"); System.out.println(value); // ãã£ãã·ã¥ããã®ãšã³ããªã®å šåé€ cache.clear(); // Expireã®ç¢ºèª cache.put("key3", "value3", 3 * 1000); // æå¹æéãèšå®ãããå Žåã¯ã第3åŒæ°ã«æå®ãã cache.put("key4", "value4", 3 * 1000); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã²ãšã€ã ããã¢ã¯ã»ã¹ System.out.println(cache.retrieve("key3") != null); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã¢ã¯ã»ã¹ãããããªãã«é¢ããããäž¡æ¹å ±æå¹æéåãã«ãªããŸã // ïŒã¢ã¯ã»ã¹ã«ãããæå¹æéã®å»¶é·ã¯è¡ãããªã System.out.println(cache.retrieve("key3") == null); System.out.println(cache.retrieve("key4") == null); // æ£ããçµäºã®æ¹æ³ãããããŸãã⊠// 0.2ã§ã¯ãCacheServiceã«closeã¡ãœãããå ¥ã£ãŠããããã§ãã⊠System.exit(0); } }
ãã®ã©ã€ãã©ãªã®ãæ£ããçµäºã®ä»æ¹ãããããŸãããäœãããªããšã¹ã¬ãããæ®ã£ãŠããŸããŸãâŠã0.2ã§ã¯ãã³ã¡ã³ãã«ãããããã«CacheServiceã«closeã¡ãœããã远å ãããŠããã®ã§ããã¡ãã䜿ãã°ããã®ããªïŒ
Infinispan
ãã®ããã°ã§ããã·ãã·æžããŠããã©ã€ãã©ãªã§ãåãªããã£ãã·ã¥ãšããããã¯ãIn Memory Data Gridãšããäœçœ®ä»ããªã®ã§ãããJSR-107ã®å®è£ ã§ãããã®ã§èŒããããšã«ããŸãããJBoss Cacheã®åŸç¶ã§ãã
ãŸããããåºãã¡ãããšHazelcastãšãã©ãŒãªã®ãïŒãšããã話ãããããšæããŸããâŠã
ã§ããã£ãã·ã¥ãšããŠèŠãæã¯ãEhcacheã«è² ããå£ããã®é«æ©èœãªãã£ãã·ã¥ã©ã€ãã©ãªãšãªããŸããããã¥ã¡ã³ããããããå å®ããŠããŸãããæ¥æ¬èªã®æ å ±ã¯å°ãªãã§ãã
åçšçã¯ãInfinispanãã³ã¢ã«ããJBoss Data Gridãšãã補åã§ãããã©ã®èŸºãç°ãªãã®ãã¯ã¡ãã£ãšèª¿ã¹ãŠãªãã§ãâŠã
åç§° | ã©ã€ã»ã³ã¹ | ææ°å®å®ç | ã¢ã€ãã«æéã«ããæå¹æé(idleTime) | ãšã³ããªèªäœã®æå¹æé(TTL) | ãªãã£ã·ã£ã«ãµã€ãURL |
---|---|---|---|---|---|
Infinispan | LGPL 2.1(6.0.0以éã¯ãApache License 2.0) | 5.3.0.Final(2013/6/25) | â | â | http://www.jboss.org/infinispan |
Evictionæãã®å Žåã®ã¢ã«ãŽãªãºã | ãã£ã¹ã¯ãªã©ãžã®ä¿å | Maven Centralãžã®ç»é² | ããã¥ã¡ã³ã | JSR-107å¯Ÿå¿ |
---|---|---|---|---|
LIRS, LRU | â | âïŒ | â | â |
ïŒãã ããJBossã®Mavenãªããžããªãåç §ããå¿ èŠãã
èŠããããã³ãããŒã¯ã§ã¯ãEhcacheãããæžã蟌ã¿ãé ããŠèªã¿èŸŒã¿ãéããšããããšã«ãªã£ãŠããŸãããæ å ±éãšç¥å床ã§ã¯åã°ãªããšæãã®ã§ããã£ãã·ã¥ã©ã€ãã©ãªãšããŠã¯ä»ã®ãšããEhcacheãæããŠInfinispanãèŠããã匷ãçç±ã¯ãªãã§ããâŠã
ä»åã¯ãData Gridã§ã¯ãªããJavaVMå ã§äœ¿çšãããã£ãã·ã¥ã®ãµã³ãã«ãšããŠã³ãŒãäŸãèŒããŸãã
Mavenã®èšå®ã
<!-- èŠãªããžããªè¿œå --> <repositories> <repository> <id>jboss-public-repository-group</id> <name>JBoss Public Maven Repository Group</name> <url>http://repository.jboss.org/nexus/content/groups/public-jboss/</url> </repository> </repositories> <!-- äŸåé¢ä¿ --> <dependency> <groupId>org.infinispan</groupId> <artifactId>infinispan-core</artifactId> <version>5.3.0.Final</version> </dependency>
èšå®ãã¡ã€ã«ã®ãµã³ãã«ã
<?xml version="1.0" encoding="UTF-8"?> <infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:5.3 http://www.infinispan.org/schemas/infinispan-config-5.3.xsd" xmlns="urn:infinispan:config:5.3"> <default> <eviction maxEntries="10000" strategy="LIRS" /> <expiration lifespan="120000" maxIdle="120000" /> </default> <namedCache name="smallCache"> <eviction maxEntries="100" strategy="LIRS" /> <expiration lifespan="6000" maxIdle="3000" /> </namedCache> </infinispan>
ã³ãŒãã®ãµã³ãã«ã
package caching.infinispan; import java.io.IOException; import org.infinispan.Cache; import org.infinispan.manager.DefaultCacheManager; import org.infinispan.manager.EmbeddedCacheManager; public class InfinispanExample { public static void main(String[] args) { EmbeddedCacheManager manager = null; Cache<String, String> defaultCache = null; Cache<String, String> smallCache = null; try { manager = new DefaultCacheManager("infinispan.xml"); // defaultã®å®çŸ©ãå ã«äœæãããCacheã®ã€ã³ã¹ã¿ã³ã¹ defaultCache = manager.getCache(); // åå¥ã«èšå®ããcache smallCache = manager.getCache("smallCache"); // ãã£ãã·ã¥ãžã®ãžã®ãšã³ããªã®ç»é² smallCache.put("key1", "value1"); smallCache.put("key2", "value2"); // ãã£ãã·ã¥ããã®ãšã³ããªã®ååŸ String value = smallCache.get("key1"); System.out.println(value); // ãã£ãã·ã¥ããã®ãšã³ããªã®åé€ smallCache.remove("key1"); // ãã£ãã·ã¥ããã®ãšã³ããªã®å šåé€ smallCache.clear(); // Expireã®ç¢ºèª smallCache.put("key3", "value3"); smallCache.put("key4", "value4"); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã²ãšã€ã ããã¢ã¯ã»ã¹ System.out.println(smallCache.get("key3") != null); try { Thread.sleep(2 * 1000L); } catch (InterruptedException e) { } // ã¢ã¯ã»ã¹ãããšã³ããªã®ã¿ããã£ãã·ã¥ã«æ®ã£ããŸãŸ System.out.println(smallCache.get("key3") != null); System.out.println(smallCache.get("key4") == null); try { Thread.sleep(7 * 1000L); } catch (InterruptedException e) { } // ããã²ãšã€ã®ãšã³ããªããæå¹æéãåãã System.out.println(smallCache.get("key3") == null); System.out.println(smallCache.get("key4") == null); } catch (IOException e) { e.printStackTrace(); } finally { if (defaultCache != null) { defaultCache.stop(); } if (smallCache != null) { smallCache.stop(); } if (manager != null) { manager.stop(); } } } }
ãµã³ãã«ã³ãŒããæžããããå®éã«åããããããã®ã¯ãããŸã§ã§ãããŸããèå³ããã£ãã®ããããŸã§ããšãèšããŸããâŠãããšã®ã©ã€ãã©ãªã¯ãããã£ãšããã¥ã¡ã³ããèŠããããçšåºŠã§ãã
Commons Collection
Commons Collectionå ã®1ã¯ã©ã¹ã§ãããLRUMapããã£ãã·ã¥ãšããŠäœ¿ã£ãŠã¯ã©ãïŒã¿ãããªã®ãåºãŠãã®ã§ããªããšãªãâŠãç»é²ãããšã³ããªã®æå€§æ°ã®æå®ãã§ãããããè¶ããã°LRUã¢ã«ãŽãªãºã ã§æ¶ãããŠããå®è£ ã§ãã
ãã以äžã®ããšã¯ãªãã®ã§ãããã§èŠä»¶ãæžãã®ã§ããã°ã
ãªãã£ã·ã£ã«ãµã€ã
http://commons.apache.org/proper/commons-collections/
NitroCache
ããŒãžã§ã³0.3ã2012幎5æïŒã«åºãã¿ããã§ãããã¥ã¡ã³ãã¯ã»ãšãã©ãªãã®ã«ãããã©ãŒãã³ã¹æ¯èŒã®è³æã ããã¢ãããããŠããäžæè°ãªã©ã€ãã©ãªã
NitroCache / EHCache / Infinispan / JCS / Cach4jã§ã®ããã©ãŒãã³ã¹æ¯èŒ
http://sourceforge.net/p/nitrocache/wiki/Performance/
ãšã«ããéããšããããšã売ãã«ããŠããã¿ããã§ããããããŸã§æ å ±ããªããšããâŠããããšèŠãæããæå¹æéã®èšå®ãšãã¯ã§ããªãããã§ããEvictionã¯ã§ããã¿ããããã£ãã·ã¥ãµã€ãºã®æå®ãšãEvictionã¢ã«ãŽãªãºã ã®æå®ä»¥å€ã¯ãã»ãšãã©æ©èœããªãããã§ããã
ãã®åŸã©ããªããããããããããªãã©ã€ãã©ãªã§ãã
ãªãã£ã·ã£ã«ãµã€ã
http://sourceforge.net/p/nitrocache/wiki/Home/
OSCache
EhcacheãšäžŠãã§æåãªãã£ãã·ã¥ã©ã€ãã©ãªã ã£ãã¿ããã§ãâŠããä»ã¯å ã®ãªãã£ã·ã£ã«ãµã€ãã¯ã¯ããŒãºãããŠjava.netã«ç§»ã£ããããããããã©ã€ãã©ãªãããŠã³ããŒãã§ããªãç¶æ ã«ãªã£ãŠããŸãã
ãŸããããã¥ã¡ã³ãããªããªã£ãŠããã®ã§ãæ©èœã®ç¢ºèªãã§ããŸããâŠããœãŒã¹ã ãã¯ãSubversionã§ç¢ºèªããããšãã§ããŸãããããããã«ããããåããããã調ã¹åã£ããããæ°ã«ã¯ãªããªãã®ã§ããããŸã§ã§ããã
æ§ãªãã£ã·ã£ã«ãµã€ãïŒçŸåšã¯Not FoundïŒ
http://www.opensymphony.com/oscache/
çŸãµã€ã
https://java.net/projects/oscache
cache4j
2006/3/9ã«ãªãªãŒã¹ããã0.4ãæåŸã«ãæŽæ°ãæ¢ãŸã£ãŠãããã£ãã·ã¥ã©ã€ãã©ãªã
ãã£ã¹ã¯çãžã®Evictãã¯ã©ã¹ã¿å¯Ÿå¿ããéçºäºå®ã®æ©èœã«å ¥ã£ãŠããã¿ããã§ããâŠãã¢ã€ãã«æéã«ããExpireãTTLã®èšå®ããšã³ããªã®æå€§ãµã€ãºããã£ãã·ã¥ã®åé€ã¢ã«ãŽãªãºã ã¯LRUãLFUãFIFOãªã©æ®éã«ãã£ãã·ã¥ã©ã€ãã©ãªãšããŠäœ¿ããããªæ©èœã¯æã£ãŠããã¿ããã§ãã
ã©ã€ã»ã³ã¹ã¯BSDã
ãªãã£ã·ã£ã«ãµã€ã
http://cache4j.sourceforge.net/
whirlycache
OSCacheãšåããããªç¶æ ã«ããããã£ãã·ã¥ã©ã€ãã©ãªã§ããé«éã§ããããšã売ãã«ããŠããã¿ããã§ãããããã¥ã¡ã³ããªã©ãå šç¶ãªãã®ã§ãã©ãããã©ã€ãã©ãªã ã£ãããããããŸããã
https://code.google.com/p/whirlycache/
https://java.net/projects/whirlycache
kitty-cache
2011幎12æã«1.2ããªãªãŒã¹ãããŠããŸããããã®åŸãïŒïŒ
ãœãŒã¹ãèŠããªãæããªã®ã§ããããè©³çŽ°äžæãªã©ã€ãã©ãªã§ãããEhcacheãããéããšã¯è¬³ã£ãŠããŸãâŠã
ãªãã£ã·ã£ã«ãµã€ã
http://code.google.com/p/kitty-cache/
ShiftOne
ãã£ãã·ã¥ã®æå¹æéã®æå®ãEvictionã¢ã«ãŽãªãºã ã®æå®ãã¯ã©ã¹ã¿ãªã³ã°ãJMXãªã©ãå²ãšé«æ©èœãªãã£ãã·ã¥ã©ã€ãã©ãªãä»ã®ã©ã€ãã©ãªãShiftOneã®ã€ã³ã¿ãŒãã§ãŒã¹ã§æ±ããã¢ããã¿ãªããŠæ©èœããã£ãã¿ããã§ãã
2004/2ã«2.0ã®BetaãåºãŠãããã§æ¢ãŸã£ãŠããŸããã
ãªãã£ã·ã£ã«ãµã€ã
http://jocache.sourceforge.net/
SwarmCache
ãã¡ãããShiftOneã®ãããªé«æ©èœãªãã£ãã·ã¥ã©ã€ãã©ãªããã®èŸºãã®ææã¯ããã£ãã·ã¥ã©ã€ãã©ãªã§ã¯ã©ã¹ã¿ãªã³ã°ãããããšãã詊ã¿ãæµè¡ã£ãŠãããã§ããããïŒïŒ
2003幎10æã«1.0ã®RC2ãåºãŠãããä»¥éæŽæ°ãããŠããŸããã
ãªãã£ã·ã£ã«ãµã€ã
http://swarmcache.sourceforge.net/
ã ãã¶é·ããªããŸãããããããªãšããã§ããã®ãã¡ãIn Memory Data Gridã§åããããªããšæžãããã§ããã