memcached作为著名的分布式内存对象缓存系统,具有高性能、免费和开源的特点,在互联网应用中大行其道,用于加快web动态应用程序的响应和减轻数据库的负荷。
memcached的实现机制为K-V,类似Map容器机制。
Windows环境下载:
1. memcached的windows版本,地址在http://code.jellycan.com/memcached/,此例用的是memcached-1.2.6-win32-bin.zip。
2. 启动memcached服务
memcached.exe -d install
memcached.exe -d start
3. java客户端:https://github.com/gwhalin/Memcached-Java-Client/downloads
java_memcached-release_2.6.6.zip为java的连接客户端
解压文件,将里面的jar包拷贝到项目的lib目录下。
Linux环境下载:
(1) 安装libevent
(apt-get install的:libevent好像没有被认出来)
下载 http://www.monkey.org/~provos/libevent-2.0.12-stable.tar.gz
libevent-2.0.12-stable$configure
libevent-2.0.12-stable$make
libevent-2.0.12-stable$sudo make install
(2)安装memcached
下载安装memcached1.4.5
http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz
memcached-1.4.5$./configure
memcached-1.4.5$make
memcached-1.4.5$sudo make install
如果启动失败,找不到libevent,则连接一下
/usr/lib$ sudo ln -s /usr/local/lib/libevent-2.0.so.5 libevent-2.0.so.5
(3)启动
$ memcached
/**
* Description 缓存中要保存的对象,必须将对象序列化才能保存
* @author Administrator
* 2012-10-16
*/
class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = -7969334018970422840L;
public String userName;
public String password;
}
public class MemcachedTest {
static{
// 服务器的地址
String[] servers = {"127.0.0.1:11211", "127.0.0.2:11212"};
//创建一个连接池
SockIOPool pool = SockIOPool.getInstance();
//设置缓存服务器
pool.setServers(servers);
//设置初始化连接数,最小连接数,最大连接数以及最大处理时间
pool.setInitConn(50);
pool.setMinConn(50);
pool.setMaxConn(500);
pool.setMaxIdle(1000 * 60 * 60);
//设置主线程睡眠时间,每3秒苏醒一次,维持连接池大小
//maintSleep 千万不要设置成30,访问量一大就出问题,单位是毫秒,推荐30000毫秒。
pool.setMaintSleep(3000);
//关闭套接字缓存
pool.setNagle(false);
//连接建立后的超时时间
pool.setSocketTO(3000);
//连接建立时的超时时间
pool.setSocketConnectTO(0);
//初始化连接池
pool.initialize();
}
public static void main(String[] args) throws IOException {
MemCachedClient c = new MemCachedClient();
//存取一个简单的Integer
// Store a value (async) for one hour
c.set("someKey", new Integer(4), 3600);
// Retrieve a value (synchronously).
Object myObject = c.get("someKey");
Integer result = (Integer) myObject;
System.out.println(result);
//存取一个序列化的对象
System.out.println("存之前的时间:" + System.currentTimeMillis());
User user1 = new User();
user1.userName = "ZhangSan";
user1.password = "alongpasswordhere";
c.set("user1", user1, 3600);
System.out.println("取之前的时间:" + System.currentTimeMillis());
User myUser1 = (User)(c.get("user1"));
System.out.println(myUser1.userName + " " + myUser1.password);
System.out.println("取之后的时间:" + System.currentTimeMillis());
}
}