memcached java 应用
首先到http://danga.com/memcached/下载memcached的windows版本和java客户端jar包,目前最新版本是memcached-1.2.1-win32.zip和java_memcached-release_1.6.zip,分别解压后即可!首先是安装运行memcached服务器,我们将memcached-1.2.1-win32.zip解压后,进入其目录,然后运行如下命令:
c:>memcached.exe-dinstall
c:>memcached.exe-l127.0.0.1-m32-dstart
第一行是安装memcached成为服务,这样才能正常运行,否则运行失败!第一行是启动memcached的,作为测试我们就简单的只分配32M内存了,然后监听本机端口和以守护进行运行。执行完毕后,我们就可以在任务管理器中见到memcached.exe这个进程了。好了,我们的服务器已经正常运行了,下面我们就来写java的客户端连接程序。
我们将java_memcached-release_1.6.zip解压后的目录中的java_memcached-release_1.6.jar文件复制到java项目的lib目录下,然后我们来编写代码,比如我提供的一个应用类如下:
packageutils.cache;
importjava.util.Date;
importcom.danga.MemCached.MemCachedClient;
importcom.danga.MemCached.SockIOPool;
/**
*使用memcached的缓存实用类.
*
*@author铁木箱子
*
*/
publicclassMemCached
{
//创建全局的唯一实例
protectedstaticMemCachedClientmcc=newMemCachedClient();
protectedstaticMemCachedmemCached=newMemCached();
//设置与缓存服务器的连接池
static{
//服务器列表和其权重
String[]servers={"127.0.0.1:11211"};
Integer[]weights={3};
//获取socke连接池的实例对象
SockIOPoolpool=SockIOPool.getInstance();
//设置服务器信息
pool.setServers(servers);
pool.setWeights(weights);
//设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaxIdle(1000*60*60*6);
//设置主线程的睡眠时间
pool.setMaintSleep(30);
//设置TCP的参数,连接超时等
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setSocketConnectTO(0);
//初始化连接池
pool.initialize();
//压缩设置,超过指定大小(单位为K)的数据都会被压缩
mcc.setCompressEnable(true);
mcc.setCompressThreshold(64*1024);
}
/**
*保护型构造方法,不允许实例化!
*
*/
protectedMemCached()
{
}
/**
*获取唯一实例.
*@return
*/
publicstaticMemCachedgetInstance()
{
returnmemCached;
}
/**
*添加一个指定的值到缓存中.
*@paramkey
*@paramvalue
*@return
*/
publicbooleanadd(Stringkey,Objectvalue)
{
returnmcc.add(key,value);
}
publicbooleanadd(Stringkey,Objectvalue,Dateexpiry)
{
returnmcc.add(key,value,expiry);
}
publicbooleanreplace(Stringkey,Objectvalue)
{
returnmcc.replace(key,value);
}
publicbooleanreplace(Stringkey,Objectvalue,Dateexpiry)
{
returnmcc.replace(key,value,expiry);
}
/**
*根据指定的关键字获取对象.
*@paramkey
*@return
*/
publicObjectget(Stringkey)
{
returnmcc.get(key);
}
publicstaticvoidmain(String[]args)
{
MemCachedcache=MemCached.getInstance();
cache.add("hello",234);
System.out.print("getvalue:"+cache.get("hello"));
}
}
那么我们就可以通过简单的像main方法中操作的一样存入一个变量,然后再取出进行查看,我们可以看到先调用了add,然后再进行get,我们运行一次后,234这个值已经被我们存入了memcached的缓存中的了,我们将main方法中红色的那一行注释掉后,我们再运行还是可以看到get到的value也是234,即缓存中我们已经存在了数据了。
对基本的数据我们可以操作,对于普通的POJO而言,如果要进行存储的话,那么比如让其实现java.io.Serializable接口,因为memcached是一个分布式的缓存服务器,多台服务器间进行数据共享需要将对象序列化的,所以必须实现该接口,否则会报错的。比如我们写一个简单的测试Bean如下:
classTBeanimplementsjava.io.Serializable
{
privatestaticfinallongserialVersionUID=1945562032261336919L;
privateStringname;
publicStringgetName()
{
returnname;
}
publicvoidsetName(Stringname)
{
this.name=name;
}
}
然后我们在main方法中加入如下几行代码:
TBeantb=newTBean();
tb.setName("铁木箱子");
cache.add("bean",tb);
TBeantb1=(TBean)cache.get("bean");
System.out.print("name="+tb1.getName());
tb1.setName("铁木箱子_修改的");
tb1=(TBean)cache.get("bean");
System.out.print("name="+tb1.getName());
我们首先把TBean的一个实例放入缓存中,然后再取出来,并进行名称的修改,然后我们再取这个对象,我们再看其名称,发现修改的对象并不是缓存中的对象,而是通过序列化过来的一个实例对象,这样我们就无须担心对原生类的无意修改导致缓存数据失效了,呵呵~~看来我也是多此一想啊。所以这表明从缓存中获取的对象是存入对象的一个副本,对获取对象的修改并不能真正的修改缓存中的数据,而应该使用其提供的replace等方法来进行修改。