具体过程如下:
Linux 安装和配置memcached
1、 下载libevent,因为memcached用到了libevent的类库来处理socket
2、 Libevent下载地址:http://libevent.org/,选个新的稳定版,如2.0.18
3、 下载Memcached,地址为http://memcached.org,当前最新版为1.4.13
4、 将这两个文件上传到linux上:
5、 登录服务器并安装两个软件:
先安装libevent-2.0.18-stable.tar.gz
安装前检查系统是否已经安装有,如果有的话删除旧版本后再安装:
检查命令:
rpm –qa|grep libevent
删除旧版本:
rpm -e libevent-1.1a-3.2.1 –nodeps,nodeps—忽略依赖删除
再检查后发现没有了
[root@cqt-sw softwares]# tar zxvf libevent-2.0.18-stable.tar.gz [root@cqt-sw softwares]# cd libevent-2.0.18-stable [root@cqt-sw softwares]# ./configure –prefix=/usr/local/libevent // 指定安装路径 …. ….
执行一些配置工作,往后在编译
[root@cqt-sw softwares]#make …… ……
编译往后再安装
[root@cqt-sw libevent-2.0.18-stable]# make install make install-recursive …… make[1]: Leaving directory `/opt/softwares/libevent-2.0.18-stable' [root@cqt-sw libevent-2.0.18-stable]#
说明安装完毕
检查是否安装成功,没有检查出来,呵呵?本人linux不是很熟悉,不知道何故,但是不影响,只要编译和安装过程没有报错就行了!
6、 安装memcached
[root@cqt-sw softwares]# tar zvxf memcachaed-1.4.13.tar.gz …… memcachaed-1.4.13/compile [root@cqt-sw softwares]#
配置:
./configure-prefix=/usr/local/memcached-with-libevent
或者如果出错要制定libevent的路径
./configure-prefix=/usr/local/memcached-with-libevent –with-libevent=/usr/local/libevent
编译和安装
[root@cqt-sw memcached-1.4.13]# make
[root@cqt-sw memcached-1.4.13]# make install
……
7、 运行:
[root@cqt-sw bin]# ./memcached -uroot
如果用root用户运行必须要带-u参数指明运行的用户是谁
8、 测试:
9、 Telnet 172.30.0.1 11211
说明已经连上了,即memcached已经启动了。
在黑屏下输入stats -- 可能看不到输入,不回显,就可以看到当前memcached的运行参数了:
写个java 测试程序:
下载java的客户端lib:https://github.com/gwhalin/Memcached-Java-Client/downloads
Memcached的工具类,还有一些方法没有写出来,可以参考API,将所有的方法都写出来就可以了通用了.
/** * MemcachedUtil.java V1.0 2012-4-25 上午09:54:51 * * Copyright 2011 ************. All rights reserved. * * Modification history(By Time Reason): * * Description: */ package com.kevin.common.util.cache.memcached; import java.util.Date; import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; /** * * <pre><b>功能描述:</b>Memcached的工具类 * * @author :****(Kevin.xie)<br> * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public final class MemcachedUtil { /** * <b>构造函数:工具类,禁止实例化</b> * */ private MemcachedUtil() { } // 创建全局的唯一实例 private static MemCachedClient mcc = new MemCachedClient(); /** * 自身实例 */ private static MemcachedUtil memcachedUtil = new MemcachedUtil(); // 设置与缓存服务器的连接池 static { // 服务器列表和其权重 String[] servers = {"172.30.0.1:11211" };// Ip地址和端口号 // 权重 Integer[] weights = {3 }; // 获取socket连接池的实例对象 SockIOPool pool = 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); mcc.setPrimitiveAsString(true);// 设置序列化 } /** * * <pre><b>功能描述:</b>获取唯一实例. * * @author :****(Kevin.xie) * <b>创建日期 :</b>2012-4-25 上午10:57:41 * * @return * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public static MemcachedUtil getInstance() { return memcachedUtil; } /** * * <pre><b>功能描述:</b>新增一个缓存数据 * * @author :****(Kevin.xie) * <b>创建日期 :</b>2012-4-25 上午10:55:15 * * @param key 缓存的key * @param value 缓存的值 * @return 操作结果 * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public boolean add(String key, Object value) { // 不会存入缓存 return mcc.add(key, value); // return mcc.set(key, value); } /** * * <pre><b>功能描述:</b>新增一个缓存数据 * * @author :****(Kevin.xie) * <b>创建日期 :</b>2012-4-25 上午10:56:15 * * @param key 缓存的key * @param value 缓存的值 * @param expiry 缓存过期的时间 * @return 操作结果 * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public boolean add(String key, Object value, Date expiry) { // 不会存入缓存 return mcc.add(key, value, expiry); // return mcc.set(key, value, expiry); } /** * <pre><b>功能描述:</b>替换已有的缓存数据 * * @author :****(Kevin.xie) * <b>创建日期 :</b>2012-4-25 上午10:55:34 * * @param key 设置对象的key * @return Object 设置对象的值 * @return 是否替换成功 * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public boolean replace(String key, Object value) { return mcc.replace(key, value); } /** * * <pre><b>功能描述:</b>替换已有的缓存数据 * * @author :****(Kevin.xie) * <b>创建日期 :</b>2012-4-25 上午10:43:17 * * @param key 设置对象的key * @return Object 设置对象的值 * @param expiry 过期时间 * @return 是否替换成功 * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public boolean replace(String key, Object value, Date expiry) { return mcc.replace(key, value, expiry); } /** * * <pre><b>功能描述:</b>根据指定的关键字获取对象 * * @author :****(Kevin.xie) * <b>创建日期 :</b>2012-4-25 上午10:42:49 * * @param key 获取对象的key * @return Object 对象值 * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public Object get(String key) { return mcc.get(key); } }
测试的持久化对象,必须要序列化
/** * Employee.java V1.0 2012-4-25 上午09:50:57 * * Copyright 2011 ************. All rights reserved. * * Modification history(By Time Reason): * * Description: */ package com.kevin.memcached.model; import java.io.Serializable; /** * * <pre><b>功能描述:</b>员工类,必须要序列化,否则缓存操作时会报错的 * * @author :****(Kevin.xie)<br> * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public class Employee implements Serializable { /** * serialVersionUID */ private static final long serialVersionUID = -6487397580836471048L; /** * 员工名字 */ private String EmpName; /** * 部门名 */ private String deptName; /** * 公司名 */ private String companyName; /** * * <b>构造函数:</b> * */ public Employee() { } /** * Access method for the empName property * * @return the empName */ public String getEmpName() { return EmpName; } /** * Sets the value of empName the property * * @param empName the empName to set */ public void setEmpName(String empName) { EmpName = empName; } /** * Access method for the deptName property * * @return the deptName */ public String getDeptName() { return deptName; } /** * Sets the value of deptName the property * * @param deptName the deptName to set */ public void setDeptName(String deptName) { this.deptName = deptName; } /** * Access method for the companyName property * * @return the companyName */ public String getCompanyName() { return companyName; } /** * Sets the value of companyName the property * * @param companyName the companyName to set */ public void setCompanyName(String companyName) { this.companyName = companyName; } }
缓存的数据必须要序列化,否则会报错的:
Juni测试类:MemcachedUtilTest
/** * MemcachedUtilTest.java V1.0 2012-4-25 上午11:00:30 * * Copyright 2011 ************. All rights reserved. * * Modification history(By Time Reason): * * Description: */ package com.kevin.memcached; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.kevin.common.util.cache.memcached.MemcachedUtil; import com.kevin.memcached.model.Employee; public class MemcachedUtilTest { private Employee emp; private MemcachedUtil cache; @Before public void setUp() throws Exception { emp = new Employee(); emp.setCompanyName("Kevin's Company"); emp.setDeptName("R&D Dept"); emp.setEmpName("Kevin"); // 缓存对象 cache = MemcachedUtil.getInstance(); cache.add("emp", emp); // 缓存基本数据 cache.add("Your salary", 12345.00); } @After public void tearDown() throws Exception { // cache.remove("emp"); // cache.remove("Your salary"); cache = null; emp = null; } @Test public void testAddCache() { } @Test public void testGetCache() { /** * 缓存基本数据 */ MemcachedUtil cache = MemcachedUtil.getInstance(); System.out.println("Your salary : " + cache.get("Your salary")); Employee tempEmp = (Employee) cache.get("emp"); System.out.println("Company: " + tempEmp.getCompanyName()); System.out.println(" Dept: " + tempEmp.getDeptName()); System.out.println(" Name: " + tempEmp.getEmpName()); Assert.assertEquals(emp.getCompanyName(), tempEmp.getCompanyName()); } }
/// 两个不同的客户端测试:
测试类:MemcachedTest
/** * MemcachedTest.java V1.0 2012-4-24 下午05:50:08 * * Copyright 2011 ************. All rights reserved. * * Modification history(By Time Reason): * * Description: */ package com.kevin.memcached; import com.kevin.common.util.cache.memcached.MemcachedUtil; import com.kevin.memcached.model.Employee; /** * * <pre><b>功能描述:</b>MemcachedTest 测试添加对象缓存,比验证取出的缓存数据是否一致 * * @author :****(Kevin.xie)<br> * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public class MemcachedTest { public static void main(String[] args) { MemcachedUtil cache = MemcachedUtil.getInstance(); Employee emp = new Employee(); emp.setCompanyName("Kevin's Company"); emp.setDeptName("R&D Dept"); emp.setEmpName("Kevin"); cache.add("emp", emp); Employee tempEmp = (Employee) cache.get("emp"); System.out.println("Company: " + tempEmp.getCompanyName()); System.out.println(" Dept: " + tempEmp.getDeptName()); System.out.println(" Name: " + tempEmp.getEmpName()); } }
测试类:MemcachedTest1
/** * MemcachedTest1.java V1.0 2012-4-24 下午11:23:58 * * Copyright 2011 ************. All rights reserved. * * Modification history(By Time Reason): * * Description: */ package com.kevin.memcached; import com.kevin.common.util.cache.memcached.MemcachedUtil; import com.kevin.memcached.model.Employee; /** * * <pre><b>功能描述:</b>测试取出从MemcachedTest存入的数据是否一致 * * @author :****(Kevin.xie)<br> * * <b>修改历史:</b>(修改人,修改时间,修改原因/内容) * * </pre> */ public class MemcachedTest1 { public static void main(String[] args) { MemcachedUtil cache = MemcachedUtil.getInstance(); cache.add("msg", "Say hello to you !"); System.out.println("get value : " + cache.get("msg")); Employee tempEmp = (Employee) cache.get("emp"); System.out.println("Company: " + tempEmp.getCompanyName()); System.out.println(" Dept: " + tempEmp.getDeptName()); System.out.println(" Name: " + tempEmp.getEmpName()); } }
完毕,kevin.xie 2012.04.25