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()); } }