首页 > 代码库 > centos安装memcached和java操作实例

centos安装memcached和java操作实例

准备搭建memcached缓存集群。这里简单的记录一下搭建过程

由于memcached安装时,需要使用libevent类库,所以先安装libevent 下载地址http://www.monkey.org/~provos/libevent/

(一)我下载的是libevent-1.4.14b-stable.tar.gz

1|解压 tar zxvf libevent-1.4.14b-stable.tar.gz 
2|进入文件
cd libevent-1.4.14b-stable
3.编译安装(默认安装到/usr/local/lib/目录
./configure 
make 
make install

(二)安装memcached

安装memcached
memcached下载网址:http://www.danga.com/memcached/download.bml


1. 解压缩
 tar xzfv memcached-1.2.6.tar.gz
 
2. 进入到 memcached-1.2.6目录
 cd memcached-1.2.6
    
3. 编译,安装
    ./configure --prefix=/local/memcached
    make
    make install

这里可能会在安装的时候提示权限问题,那么就先
chmod +x configure

安装完成后,会在 /local/memcached 出现 bin和share目录

进行 bin目录,启动 memcache
方法如下: 
./memcached -d -u nobody -m 512 127.0.0.1 -p 11211
此时,会报一个异常
 error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

原因是找不到libevent-1.4.so.2类库,解决办法如下:


使用LD_DEBUG=help ./memcached -v来确定 加载的类库路径,方法如下:
LD_DEBUG=libs ./memcached -v 2>&1 > /dev/null | less

则系统会显示:

linux:/local/memcached/bin # LD_DEBUG=libs ./memcached -v 2>&1 > /dev/null | less
     20421:     find library=libevent-1.4.so.2; searching
     20421:      search cache=/etc/ld.so.cache
     20421:      search path=/lib/tls/i686/sse2:/lib/tls/i686:/lib/tls/sse2:/lib/tls:/lib/i686/sse2:/lib/i686:/lib/sse2:/lib:/usr/lib/tls/i686
/sse2:/usr/lib/tls/i686:/usr/lib/tls/sse2:/usr/lib/tls:/usr/lib/i686/sse2:/usr/lib/i686:/usr/lib/sse2:/usr/lib          (system search path)
     20421:       trying file=/lib/tls/i686/sse2/libevent-1.4.so.2
     20421:       trying file=/lib/tls/i686/libevent-1.4.so.2
     20421:       trying file=/lib/tls/sse2/libevent-1.4.so.2
     20421:       trying file=/lib/tls/libevent-1.4.so.2
     20421:       trying file=/lib/i686/sse2/libevent-1.4.so.2
     20421:       trying file=/lib/i686/libevent-1.4.so.2
     20421:       trying file=/lib/sse2/libevent-1.4.so.2
     20421:       trying file=/lib/libevent-1.4.so.2
     20421:       trying file=/usr/lib/tls/i686/sse2/libevent-1.4.so.2
     20421:       trying file=/usr/lib/tls/i686/libevent-1.4.so.2
     20421:       trying file=/usr/lib/tls/sse2/libevent-1.4.so.2
     20421:       trying file=/usr/lib/tls/libevent-1.4.so.2
     20421:       trying file=/usr/lib/i686/sse2/libevent-1.4.so.2
     20421:       trying file=/usr/lib/i686/libevent-1.4.so.2
     20421:       trying file=/usr/lib/sse2/libevent-1.4.so.2
     20421:       trying file=/usr/lib/libevent-1.4.so.2
     20421:    
./memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

我们看到,memcached会到很多地方去找,所以根据其它求,我们只需建一个软链接,指定到我们安装的类库上即可
方法如下:
ln -s /usr/local/lib/libevent-1.4.so.2 /lib/libevent-1.4.so.2

现在可以正常启动memcached了
./memcached -d -u nobody -m 512 127.0.0.1 -p 11211
memcache启动参数说明:
安装好了就可以使用memcached了,下面我用一种最简单的官方提供的方法java_memcached_releas

可以到这里去下载https://github.com/gwhalin/Memcached-Java-Client/downloads

工具类

package org.memcached.xiezhaodong.test;

import java.util.Date;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

/**
 * 
 * <pre><b>功能描述:</b>Memcached的 工具类
 *
 * @author 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 = {"192.168.80.100: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 :xiezhaodong
     * <b>创建日期 :</b>2012-4-25 上午10:57:41
     *
     * @return
     *
     * <b>修改历史:</b>(修改人,修改时间,修改原因/内容)
     *
     * </pre>
     */
    public static MemcachedUtil getInstance() {

        return memcachedUtil;
    }
    
    /**
     * 
     * <pre><b>功能描述:</b>新增一个缓存数据
     * 
     * @author :xiezhaodong
     * <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 :xiezhaodong
     * <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 :xiezhaodong
     * <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 :xiezhaodong
     * <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 :xiezhaodong
     * <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);
    }
}

对象,必须实现序列化接口

package org.memcached.xiezhaodong.test;

import java.io.Serializable;

/**
 * 
 * <pre><b>功能描述:</b>员工类,必须要序列化,否则缓存操作时会报错的
 *
 * @author :xiezhaodong<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;
    }
}


测试类

package org.memcached.xiezhaodong.test;

import com.danga.MemCached.MemCachedClient;

public class MemcachedUtilTest {

	public static void main(String[] args) {

	//	add();
		
		print();

	}

	private static void print() {
		MemcachedUtil cache = MemcachedUtil.getInstance();
		Employee emp=(Employee) cache.get("emp");
		System.out.println("name:"+emp.getCompanyName());
		System.out.println("dep:"+emp.getDeptName());
		System.out.println("emp"+emp.getEmpName());
	}

	private static void add() {
		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);
	}
}


一个简单的单机环境就已经搭建好了。其他的还有一些插件,比如说spring集成的memcached插件等等,以后可以去用一下!

转载请注明http://blog.csdn.net/a837199685


centos安装memcached和java操作实例