稍为讲一下三种缓存(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();
}
}
}