membercached安装与部署及应用

来源:互联网 发布:网络教育本科毕业论文 编辑:程序博客网 时间:2024/06/05 06:42

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

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


membercached安装部署:

1.下载memcached和libeventcd /tmpwget http://www.danga.com/memcached/dist/memcached-1.2.0.tar.gzwget http://www.monkey.org/~provos/libevent-1.2.tar.gz2.安装libevent:tar zxvf libevent-1.2.tar.gzcd libevent-1.2./configure --prefix=/usrmakemake install (管理员权限sudo make install)(http://blog.csdn.net/big1980/article/details/10155509)3.测试libevent是否安装成功:ls -al /usr/lib | grep libevent(有内容表示成功)4.安装memcached,同时需要安装中指定libevent的安装位置:cd /tmptar zxvf memcached-1.2.0.tar.gzcd memcached-1.2.0./configure --with-libevent=/usrmakemake 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 12000Trying 192.168.141.64...Connected to 192.168.141.64 (192.168.141.64).Escape character is '^]'.set key1 0 60 4zhouSTOREDget key1VALUE key1 0 4zhouEND
当然,如果是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 0