稍为讲一下三种缓存(memcached,ehcache,oscache)的区别:
1、memcached 是老外用C写的一个开源内存缓存,支持跨平台,支持分布式(多台机器同时安装memcached,并开辟用户指定的内存空间,比如,我们在a机器开辟一个512M的内存空间,在B机器开辟一个512M的内存空间.....,那么MEMCACHED为我们提供的内存空间就是它们的总和,如果有10台电脑安装,它会有5G的内存空间为我们提供KEY/VALUE存储使用,当然现在流行的语言基本都提供了API接口,它没有硬盘缓存,所以一旦机器关机,内存中的东西就会清空。它就像一个服务器一样,它会独立的运行,独立的开辟空间)。
它存储的原理是LRU算法进行缓存对象(可以是页面,对象,集合,文件等),所以在缓存在没有空间时,它会将最久未使用的内存给清空,来存放新的内容。
2、oscached 是JAVA开发的一个支持集群的开源缓存软件,它集群的思路主要是通过JGROUPS进行集群,支持硬盘缓存,它可以在JAVA中使用进行缓存,单台机器使用缓存时,性能可能比MEMCACHED快,因为它由JAVA开发,直接与JAVA通信,性能可能会优于MEMCACHED,但是多台机器时,性能是不如MEMCACHED。
3、EHCACHED和OSCACHED基本相同,支持硬盘缓存,内存缓存,单台机器使用缓存时,性能可能比MEMCACHED快,因为它由JAVA开发,直接与JAVA通信,性能可能会优于MEMCACHED.
应用场合:MEMCACHED 一般性的大型网站都在使,EHCACHED与OSCACHED经常与HIBERNATE进行整合,做二级缓存
memcached示例
import java.net.InetSocketAddress; import java.util.concurrent.Future; import net.spy.memcached.AddrUtil; import net.spy.memcached.MemcachedClient; public class MClient { public static void main(String[] args){ try{ //AddrUtil.getAddresses("192.168.0.2:11211")
//以下是使用了多台电脑进行缓存设置 MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.0.2", 11211),new InetSocketAddress("192.168.0.4", 11211)); Future<Boolean> b = null; for(int i = 0 ;i<100000;i++){ b = mc.set("neea:testDaF:ksIdno"+i, 100, "someObject"+i);
//主要是用与等待将值设置到内存,如果返回TRUE表示已经存到内存 if(b.get().booleanValue()==true){ } } if(b.get().booleanValue()==true){ mc.shutdown(); } } catch(Exception ex){ ex.printStackTrace(); } try{ MemcachedClient mc = new MemcachedClient( new InetSocketAddress("192.168.0.2", 11211),new InetSocketAddress("192.168.0.4", 11211)); for(int i = 0 ;i<100000;i++){ Object b = mc.get("neea:testDaF:ksIdno"+i); System.out.println(b +""+mc.getState()); } mc.shutdown(); } catch(Exception ex){ ex.printStackTrace(); } } }
oscached缓存的内容主要为下import java.io.File; import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; import java.util.Properties; import com.opensymphony.oscache.base.NeedsRefreshException; import com.opensymphony.oscache.general.GeneralCacheAdministrator; public class BaseCache extends GeneralCacheAdministrator { private int refreshPeriod; private String keyPrefix; private static final long serialVersionUID = -4397192926052141162L; public BaseCache(int refreshPeriod,String keyPrefix) { super(); this.keyPrefix = keyPrefix; this.refreshPeriod = refreshPeriod;//CacheEntry.INDEFINITE_EXPIRY } public void put(String key, Object value) { this.putInCache(this.keyPrefix + "_" + key, value); } public void remove(String key) { this.flushEntry(this.keyPrefix + "_" + key); } public void removeAll(Date date) { this.flushAll(date); } public void removeAll() { this.flushAll(); } public Object get(String key) throws Exception { try { return this.getFromCache(this.keyPrefix + "_" + key, this.refreshPeriod); } catch (NeedsRefreshException e) { this.cancelUpdate(this.keyPrefix + "_" + key); throw e; } } public static void main(String[] args) { try { BaseCache cache = new BaseCache(100000000,"myCache"); Date date = new Date(); ReadProperties pu = new ReadProperties("my.properties"); System.out.println(pu.getP().size()); Hashtable ht=(Hashtable) pu.getP().clone(); System.out.println(ht.toString()); System.out.println(ht.get("age")); Enumeration e=pu.getP().propertyNames(); while(e.hasMoreElements()){ String name=(String) e.nextElement(); System.out.print(name); System.out.println(ht.get(name)); cache.put(name, ht.get(name)); //System.out.print(pu.getValue((String)e.nextElement())); } Person person = new Person(); person.setName("rgz"); cache.put("person", person); //cache.removeAll(); System.out.println(cache.get("person")); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }