membercached安装与部署及应用

membercached用于高效简单缓存,如果你要做的是简单的缓存(没有非常复杂和数据操作),那么membercached是缓存首选

因为他的缺点是 不能直接遍历key。如果需要直接遍历key,建议用redis


membercached安装部署:

1.下载memcached和libevent
cd /tmp
wget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gz
wget http://www.monkey.org/~provos/libevent-1.2.tar.gz

2.安装libevent:
tar zxvf libevent-1.2.tar.gz
cd libevent-1.2
./configure --prefix=/usr
make
make install (管理员权限sudo make install)
(http://blog.csdn.net/big1980/article/details/10155509)
3.测试libevent是否安装成功:
ls -al /usr/lib | grep libevent(有内容表示成功)


4.安装memcached,同时需要安装中指定libevent的安装位置:
cd /tmp
tar zxvf memcached-1.2.0.tar.gz
cd memcached-1.2.0
./configure --with-libevent=/usr
make
make install (管理员权限sudo make install)
如果中间出现报错,请仔细检查错误信息,按照错误信息来配置或者增加相应的库或者路径。
安装完成后会把memcached放到 /usr/local/bin/memcached 

5.测试是否成功安装memcached:
ls -al /usr/local/bin/mem*

 

启动Memcached服务:
1.启动Memcache的服务器端:
# /usr/local/bin/memcached -d -m 256 -u root -l 127.0.0.1 -p 12000 -c 256 -P /tmp/memcached.pid
(对外网 /usr/local/bin/memcached -d -m 256 -u weblogic -l 0.0.0.0 -p 12000 -c 256 -P /tmp/memcached.pid)

-d选项是启动一个守护进程
-m是分配给Memcache使用的内存数量,单位是MB
-u是运行Memcache的用户,我这里是root
-l是监听的服务器IP地址
-p是设置Memcache监听的端口
-c选项是最大运行的并发连接数,默认是1024
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid,

2.如果要结束Memcache进程,执行:

# kill `cat /tmp/memcached.pid`

 

测试Memcached:

 

复制代码
[root@localhost /]# telnet 192.168.141.64 12000
Trying 192.168.141.64...
Connected to 192.168.141.64 (192.168.141.64).
Escape character is '^]'.
set key1 0 60 4
zhou
STORED
get key1
VALUE key1 0 4
zhou
END
当然,如果是windows,直接下载一个安装一下就好了


membercached应用:

提供UTIL:

<dependency>
	   	<groupId>membercached</groupId>
		<artifactId>membercached</artifactId>
		<version>2.6.6</version>
</dependency>

package util;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.codec.digest.DigestUtils;

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

/**
 *    
 * 项目名称:yy   
 * 类名称:MemberCachedUtil   
 * 类描述:TODO  缓存工具类
 * 创建人: yy
 * 创建时间:2015年7月1日 下午3:43:19   
 * @version  
 */
 
public class MemberCacheUtil {

	// 创建全局的唯一实例  
    protected static MemCachedClient mcc = new MemCachedClient();  
    
	public static final int ADDTYPE_ADD=0;//新数据 存入
	public static final int ADDTYPE_REPLACE=1;//值相同 存入
	public static final int ADDTYPE_SET=2;//任何情况 存入
	// 服务器列表和其权重  
    private static  String[] servers = null;  
    private static  Integer[] weights = null;  

	
	
	/** 
	 * @Title: get 
	 * @Description: TODO 根据key 返回 指定类型 
	 * @date 2015年7月1日
	 * @author yy
	 * @param @param key
	 * @param @param c
	 * @param @return   
	 * @return T  
	 * @throws 
	 */
	public static <T> T get(String key,Class c)
	{
		key=DigestUtils.md5Hex(key);
		 return (T) mcc.get(key);
	}
	
	/** 
	 * @Title: get 
	 * @Description: TODO 返回String类型
	 * @date 2016年1月4日
	 * @author yy
	 * @param @param key
	 * @param @return   
	 * @return String  
	 * @throws 
	 */
	public static String get(String key)
	{
		return MemberCacheUtil.get(key, String.class);
	}
    public static Object getObject(String key)
    {
        return MemberCacheUtil.get(key, Object.class);
    }
	/** 
	 * @Title: put 
	 * @Description: TODO 存入缓存
	 * 如key value为null,则抛出:membercache参数不能为空
	 * @date 2016年1月4日
	 * @author yy
	 * @param @param key
	 * @param @param value
	 * @param @param secends 0为 永不过期
	 * @param @return   
	 * @return boolean  
	 * @throws 
	 */
	public static boolean put(String key,Object value,long secends)
	{
		if(key==null || value==null)
			throw new RuntimeException("membercache参数不能为空");
		if(key.length()>255)
			throw new RuntimeException("membercache key 长度不能超过255");
		key=DigestUtils.md5Hex(key);
		return put(key, value, secends, MemberCacheUtil.ADDTYPE_SET);
	}
	
	
	/** 
	 * @Title: clear 
	 * @Description: TODO 清除所有数据,慎用
	 * @date 2016年3月8日
	 * @author yy
	 * @param    
	 * @return void  
	 * @throws 
	 */
	public static void clearAll()
	{
		mcc.flushAll();
	}
	/** 
	 * @Title: delete 
	 * @Description: TODO 根据key值删除缓存中信息
	 * @date 2016年3月8日
	 * @author yy
	 * @param @param key   
	 * @return void  
	 * @throws 
	 */
	public static void delete(String key)
	{
		if(key!=null)
			mcc.delete(key);
	}
    /** 
     * @Title: init 
     * @Description: TODO 初始化服务器,按先后顺序排列优先级
     * @date 2016年1月4日
     * @author yy
     * @param @param servername   
     * @return void  
     * @throws 
     */
    public static void init(String...servername)
    {
    	servers=servername;
    	weights=new Integer[servers.length];
    	for (int i = 0; i < servers.length; i++) {
			weights[i]=i+1;
		}
    	connect();
    }
	/** 
	 * @Title: add 
	 * @Description: TODO 
	 * @date 2015年7月1日
	 * @author yy
	 * @param @param key 
	 * @param @param value
	 * @param @param secends 0为 永不过期
	 * @param @param addtype 0新数据存入,1值相同存入 任何情况存入
	 * @param @return   
	 * @return boolean  
	 * @throws 
	 */
	private static boolean put(String key,Object value,long secends,int addtype)
	{
		boolean result;
		switch (addtype) {
		case MemberCacheUtil.ADDTYPE_ADD:
			result=mcc.add(key, value,new Date(secends*1000));
			break;
		case MemberCacheUtil.ADDTYPE_REPLACE:
			result=mcc.replace(key, value,new Date(secends*1000));
			break;
		case MemberCacheUtil.ADDTYPE_SET:
			result=mcc.set(key, value,new Date(secends*1000));
			break;
		default:
			result=mcc.add(key, value,new Date(secends*1000));
			break;
		}
		return result;
	}
	
    private static void connect() {  
        // 获取socke连接池的实例对象  
        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的规则就是在发送一个包之前,本地机器会等待远程主机  
        // 对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存,  
        // 以至这个包准备好了就发;  
  
        // 设置TCP的参数,连接超时等  
        pool.setNagle(false);  
        pool.setSocketTO(3000);  
        pool.setSocketConnectTO(0);  
  
        // 初始化连接池  
        pool.initialize(); 
        
        //测试是否已经连通
        try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
		}
        MemberCacheUtil.put("000", "000", 3);
        if(MemberCacheUtil.get("000")==null)
        	throw new RuntimeException("未成功链接memcache,请确认是否成功开启memcache...");
        // 压缩设置,超过指定大小(单位为K)的数据都会被压缩  
//        mcc.setCompressEnable(true);  
//        mcc.setCompressThreshold(64 * 1024);
    }



    public static void main(String[] args) {
    	MemberCacheUtil.init("127.0.0.1:12000");
       // mcc.flushAll();
        /*for (int i = 0; i < 2; i++) {
            MemberCacheUtil.put("same" + i, JsonUtils.toJson(new float[]{1, 2, 3, 4, i}) , 1000);
            //System.out.println("same"+i+":" + MemberCacheUtil.get("same" + i, Object.class));
        }*/
    	//System.out.println(MemberCacheUtil.get("same1",Object.class));
    	List list = new ArrayList();
    	list.add("001");
    	MemberCacheUtil.put("xxxx", list, 0L);
    	System.out.println(MemberCacheUtil.getObject("xxxx"));
	}
}

用main方法测试一下吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值