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等方法来进行修改。

相关推荐