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方法测试一下吧