memcached的使用

一、windows下安装

环境:win7专业版+memcached_win32_1.4.5

步骤:

1、cmd切换到指定解压目录
2、memcached -d install安装
3、输入memcached –h,出现下图窗口说明已经安装成功

4、telnet测试是否正常运行 telnet 127.0.0.1 11211 如下图:

5、stats命令查看运行状态如下图:

二、linux下安装

环境:redhat5+memcached-1.4.25
所需安装包:
步骤:
1、解压libevent
tar -zxvf libevent-2.0.21-stable.tar.gz  
2、安装libevent
./configure --prefix /etc/libevent/  
make clean  
make  
make install 
3、解压memcached
tar -zxvf memcached-1.4.21.tar.gz
4、安装memcached
./configure --prefix /etc/memcached/ --with-libevent=/etc/libevent/  
make clean  
make  
make install
5.启动memcached
cd /etc/memcached/bin  
./memcached -d -u root
6.telnet看memcached是否启动成功,stat查看运行状态
 
7.查看memcached运行的进程

8.关闭memcached

三、使用memcached
http://www.cnblogs.com/netWild/archive/2013/05/14/memcached.html
3.1 所需jar包

3.2 MemCachedConfig.xml
<?xml version="1.0" encoding="UTF-8"?>

<!-- 

 *****  memcached数据库配置文件  *****

 ***********************************
-->

<MemCachedConfig>

    <!--
    Enabled : 是否启用memcached内存数据库选项
    可选值 : true - 启用; false - 停用
    -->
    <Enabled>true</Enabled>

    <!--
    Servers : 可用的memcached服务器列表,各服务器根据weight(负载权重值)实现分布式任务均衡
    注意 : 各memcached服务器负载权重值的最大公约数最好为1,可在一定程度上简化其内部的负载均衡算法
    规则 : <Server host="memcached服务器IP或域名" post="memcached服务端口(默认11211)" weight="负载权重值" />
    -->
    <Servers>
    <!--
        <Server host="192.168.1.10" post="11211" weight="2" />
        <Server host="192.168.1.11" post="11211" weight="1" />
        <Server host="192.168.1.12" post="11211" weight="1" />
     -->
        <Server host="192.168.78.128" post="11211" weight="1" />
    </Servers>

    <!--
    Config : memcached数据库配置选项
      initConn : 初始连接数
      minConn : 最小连接数
      maxConn : 最大连接数
      maxIdle : 连接最大空闲时间(毫秒)
      maintSleep : 主线程的维护周期(每隔多少秒维护一次连接池,0表示不启用主线程)
      socketTO : 读取操作的超时限制(毫秒)
      socketConnTO : 连接操作的超时限制(毫秒,0表示不限制)
      compressEnable : 是否启用自动压缩(该参数从java_memcached-release_2.6.1开始不再支持)
      compressThreshold : 超过指定大小(bytes)的数据都会被压缩(该参数从java_memcached-release_2.6.1开始不再支持)
    -->
    <Config>
        <property name="initConn">5</property>
        <property name="minConn">5</property>
        <property name="maxConn">250</property>
        <property name="maxIdle">21600000</property>
        <property name="maintSleep">30</property>
        <property name="socketTO">10000</property>
        <property name="socketConnTO">0</property>
        <property name="compressEnable">true</property>
        <property name="compressThreshold">65536</property>
    </Config>
</MemCachedConfig>

3.3 MemCached.java

package com.kysis.util;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.net.telnet.TelnetClient;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

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

/**
 * @category   memcached内存数据库操作类
 * @version    1.0
 */
public class MemCached {

    //是否启用MemCached内存数据库
    protected static boolean enUsed = true;

    //创建全局唯一的可实例化对象
    protected static MemCached memCached = new MemCached();

    //初始化MemCached客户端对象
    protected static MemCachedClient memClient = new MemCachedClient();

    //定义MemCached服务器运行环境配置文件名称
    private static final String MemCachedConfigFile_NAME = "MemCachedConfig.xml";

    //定义可用的MemCached服务器列表,用于分布式存储
    private static String[] serverListArr = new String[1];

    //定义各MemCached服务器的负载权重列表,与服务器列表按先后顺序对应
    private static Integer[] weightListArr = new Integer[1];;

    //定义MemCached服务器运行环境表,配置文件中关于参数相关数据将保存到该表
    private static Map<String, String> serverConfig;

    //定义MemCached服务器运行状态表,用于保存各状态的中文解释
    protected static HashMap<String, String> statsItems;

    //设置全局静态参数,以下代码在整个服务器运行周期内仅运行一次!
    static {

        //初始化MemCached运行环境配置
        //首先初始化各参数默认值,然后加载配置文件,遍历其中的参数值并进行覆盖。
        initConfig();

        if(enUsed){ //如果已启用memcached缓存服务
            //获取socke连接池的实例对象
            SockIOPool pool = SockIOPool.getInstance();

            //设置可用的MemCached服务器信息,实现分布式存储
            pool.setServers(serverListArr);

            //设置各MemCached服务器的负载权重,根据可支配内存实现负载均衡
            pool.setWeights(weightListArr);

            //设置初始连接数
            pool.setInitConn(Integer.parseInt(serverConfig.get("initConn").toString()));

            //设置最小连接数
            pool.setMinConn(Integer.parseInt(serverConfig.get("minConn").toString()));

            //设置最大连接数
            pool.setMaxConn(Integer.parseInt(serverConfig.get("maxConn").toString()));

            //设置连接最大空闲时间
            pool.setMaxIdle(Long.parseLong(serverConfig.get("maxIdle").toString()));

            //设置主线程的睡眠时间,每隔该时间维护一次各连接线程状态
            pool.setMaintSleep(Long.parseLong(serverConfig.get("maintSleep").toString()));

            //关闭nagle算法
            pool.setNagle(false);

            //读取操作的超时限制
            pool.setSocketTO(Integer.parseInt(serverConfig.get("socketTO").toString()));

            //连接操作的超时限制,0为不限制
            pool.setSocketConnectTO(Integer.parseInt(serverConfig.get("socketConnTO").toString()));

            //初始化连接池
            pool.initialize();

            //压缩设置,超过指定大小的数据都会被压缩
            //从java_memcached-release_2.6.1开始已经不再支持内置的数据压缩功能
            //memClient.setCompressEnable(Boolean.parseBoolean(serverConfig.get("compressEnable").toString()));
            //memClient.setCompressThreshold(Long.parseLong(serverConfig.get("compressThreshold").toString()));
        }
    }

    /**
     * @category 初始化MemCached运行环境配置
     * @category 注:该方法在整个服务器周期内仅运行一次
     */
    protected static void initConfig(){

        //初始化可用的MemCached服务器列表默认值(本机)
        serverListArr[0] = "127.0.0.1:11211";
        weightListArr[0] = 1;

        //初始化MemCached服务器运行环境表(默认值),当某参数未在配置文件中进行定义时,将使用该默认值
        serverConfig = new HashMap<String, String>(){
            private static final long serialVersionUID = 1L;
            {
                put("initConn", "5"); //设置初始连接数
                put("minConn", "5"); //设置最小连接数
                put("maxConn", "250"); //设置最大连接数
                put("maxIdle", "21600000"); //设置连接最大空闲时间(6小时)
                put("maintSleep", "30"); //设置主线程的睡眠时间(30秒)
                put("socketTO", "10000"); //读取操作的超时限制(10秒)
                put("socketConnTO", "0"); //连接操作的超时限制(不限制)
                put("compressEnable", "true"); //是否启用自动压缩(启用)
                put("compressThreshold", "65536"); //超过指定大小的数据都会被压缩(64K)
            }
        };

        //开始读取配置文件,并将其中的参数值向默认环境表中进行覆盖
        String filePath = Thread.currentThread().getContextClassLoader().getResource("MemCachedConfig.xml").getPath().substring(1);
        File file = new File(filePath.replaceAll("%20"," "));
        try{
            if(file.exists()){ //如果可以成功加载配置文件
                SAXReader sr = new SAXReader();
                Document doc = sr.read(file);
                Element Root = doc.getRootElement(); //获得根节点
                Element Enabled = (Element)Root.selectSingleNode("Enabled"); //获得是否启用memcached节点
                Element Servers = (Element)Root.selectSingleNode("Servers"); //获得可用的服务器列表父节点
                Element Config = (Element)Root.selectSingleNode("Config"); //获得运行环境参数列表父节点
                enUsed = Boolean.parseBoolean(Enabled.getText()); //是否启用memcached缓存服务
                List<Element> serverDoms = Servers.elements(); //备用的服务器列表
                List<Element> serverUsed = new ArrayList<Element>(); //经检测,实际可用的服务器列表
                TelnetClient telnet = new TelnetClient(); //初始化Telnet对象,用来检测服务器是否可以成功连接
                telnet.setConnectTimeout(5000); //连接超时:5秒
                for(Element serverTmp : serverDoms){
                    try{
                        telnet.connect(serverTmp.attributeValue("host"), Integer.parseInt(serverTmp.attributeValue("post"))); //连接到服务器
                        telnet.disconnect(); //断开连接
                        serverUsed.add(serverTmp); //连接成功,将服务器添加到实际可用列表
                    }catch(Exception e){}
                }
                int serverCount = serverUsed.size(); //经检测,实际可用的服务器个数
                if(serverCount == 0){ //没有发现实际可用的服务器,返回
                    enUsed = false;
                    return;
                }
                serverListArr = new String[serverCount]; //初始化服务器地址及端口号数组
                weightListArr = new Integer[serverCount]; //初始化服务器负载权重数组
                for(int ind=0; ind < serverCount; ind++){ //向服务器数组进行赋值
                    serverListArr[ind] = serverUsed.get(ind).attributeValue("host") + ":" + serverUsed.get(ind).attributeValue("post");
                    weightListArr[ind] = Integer.parseInt(serverUsed.get(ind).attributeValue("weight").toString());
                }
                Object[] serverConfigArr = serverConfig.keySet().toArray(); //返回服务器运行环境参数列表,用于遍历配置文件
                for(Object cfgItem : serverConfigArr){
                    Node node = Config.selectSingleNode("//property[@name='" + cfgItem + "']"); //查找指定的参数节点
                    if(node == null) continue; //如果该参数节点不存在,则继续查找下一个参数,该参数将采用默认值
                    Element configNode = (Element)node;
                    serverConfig.put(cfgItem.toString(), configNode.getTextTrim()); //添加配置文件中定义的参数值
                }
            }
        }catch(Exception e){
            System.out.println(e.toString());
        }

        //初始化MemCached服务器运行状态表,对各状态进行中文解释
        statsItems = new HashMap<String, String>(){
            {
                put("pid", "MemCached服务进程ID");
                put("version", "MemCached服务版本");
                put("pointer_size", "MemCached服务器架构");
                put("time", "服务器当前时间");
                put("uptime", "服务器本次启动以来,总共运行时间");
                put("connection_structures", "服务器分配的连接结构数");
                put("total_connections", "服务器本次启动以来,累计响应连接总次数");
                put("curr_connections", "当前打开的连接数");
                put("limit_maxbytes", "允许服务支配的最大内存容量");
                put("bytes", "当前已使用的内存容量");
                put("bytes_written", "服务器本次启动以来,写入的数据量");
                put("bytes_read", "服务器本次启动以来,读取的数据量");
                put("total_items", "服务器本次启动以来,曾存储的Item总个数");
                put("curr_items", "当前存储的Item个数");
                put("cmd_get", "服务器本次启动以来,执行Get命令总次数");
                put("get_hits", "服务器本次启动以来,Get操作的命中次数");
                put("get_misses", "服务器本次启动以来,Get操作的未命中次数");
                put("cmd_set", "服务器本次启动以来,执行Set命令总次数");
            }
        };
    }

    /**
     * @category 保护型构造方法,不允许实例化!
     */
    protected MemCached() {

    }

    /**
     * @category 操作类入口:获取唯一实例.
     *
     * @return MemCached对象
     */
    public static MemCached getInstance() {
        return memCached;
    }

    /**
     * @category 返回是否已经启用memcached内存服务器
     *
     * @return boolean
     */
    public static boolean used(){
        return enUsed;
    }

    /**
     * @category 插入新记录.
     * @category 前提:记录的Key在缓存中不存在
     * @param key 记录的主键
     * @param value 记录的内容
     * @return boolean 操作结果
     */
    public boolean add(String key, Object value) {
        if(!enUsed){
            return false;
        }else{
            return memClient.add(key, value);
        }
    }

    /**
     * @category 插入新记录并设置超时日期
     * @category 前提:记录的Key在缓存中不存在
     * @param key 记录的主键
     * @param value 记录的内容
     * @param expiryDate 超时日期
     * @return boolean 操作结果
     */
    public boolean add(String key, Object value, Date expiryDate) {
        if(!enUsed){
            return false;
        }else{
            return memClient.add(key, value, expiryDate);
        }
    }

    /**
     * @category 插入新记录并设置超时天数
     * @category 前提:记录的Key在缓存中不存在
     * @param key 记录的主键
     * @param value 记录的内容
     * @param expiryDays 超时天数
     * @return boolean 操作结果
     */
    public boolean add(String key, Object value, int expiryDays){
        if(!enUsed){
            return false;
        }else{
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            calendar.add(Calendar.DATE,expiryDays); //增加天数
            return memClient.add(key, value, calendar.getTime());
        }
    }

    /**
     * @category 插入新记录或更新已有记录
     * @category 解释:记录的Key在缓存中不存在则插入;否则更新
     * @param key 记录的主键
     * @param value 记录的内容
     * @return boolean 操作结果
     */
    public boolean set(String key, Object value){
        if(!enUsed){
            return false;
        }else{
            return memClient.set(key, value);
        }
    }

    /**
     * @category 插入新记录或更新已有记录,并设置超时日期
     * @category 解释:记录的Key在缓存中不存在则插入;否则更新
     * @param key 记录的主键
     * @param value 记录的内容
     * @param expiryDate 超时日期
     * @return boolean 操作结果
     */
    public boolean set(String key, Object value, Date expiryDate){
        if(!enUsed){
            return false;
        }else{
            return memClient.set(key, value, expiryDate);
        }
    }

    /**
     * @category 插入新记录或更新已有记录,并设置超时天数
     * @category 解释:记录的Key在缓存中不存在则插入;否则更新
     * @param key 记录的主键
     * @param value 记录的内容
     * @param expiryDate 超时天数
     * @return boolean 操作结果
     */
    public boolean set(String key, Object value, int expiryDays){
        if(!enUsed){
            return false;
        }else{
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            calendar.add(Calendar.DATE,expiryDays); //增加天数
            return memClient.set(key, value, calendar.getTime());
        }
    }

    /**
     * @category 更新已有记录
     * @category 前提:记录的Key在缓存中已经存在
     * @param key 记录的主键
     * @param value 记录的内容
     * @return boolean 操作结果
     */
    public boolean replace(String key, Object value) {
        if(!enUsed){
            return false;
        }else{
            return memClient.replace(key, value);
        }
    }

    /**
     * @category 更新已有记录,并设置超时日期
     * @category 前提:该值在缓存中已经存在
     * @param key 记录的主键
     * @param value 记录的内容
     * @param expiryDate 超时日期
     * @return boolean 操作结果
     */
    public boolean replace(String key, Object value, Date expiryDate) {
        if(!enUsed){
            return false;
        }else{
            return memClient.replace(key, value, expiryDate);
        }
    }

    /**
     * @category 更新已有记录,并设置超时天数
     * @category 前提:该值在缓存中已经存在
     * @param key 记录的主键
     * @param value 记录的内容
     * @param expiryDays 超时天数
     * @return boolean 操作结果
     */
    public boolean replace(String key, Object value, int expiryDays) {
        if(!enUsed){
            return false;
        }else{
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(new Date());
            calendar.add(Calendar.DATE,expiryDays); //增加天数
            return memClient.replace(key, value, calendar.getTime());
        }
    }

    /**
     * @category 返回单条记录
     *
     * @param key 记录的主键
     * @return 记录的内容
     */
    public Object get(String key) {
        if(!enUsed){
            return null;
        }else{
            return memClient.get(key);
        }
    }

    /**
     * @category 返回多条记录
     *
     * @param keys 记录的主键数组
     * @return Map<String, Object> 多条记录的内容
     */
    public Map<String, Object> get(String[] keys) {
        if(!enUsed){
            return null;
        }else{
            return memClient.getMulti(keys);
        }
    }

    /**
     * @category 返回所有key值
     *
     * @return Arraylist<String> 多条记录的内容
     */
    public static ArrayList<String> getAllKey() {
        if(!enUsed){
            return null;
        }else{
    		ArrayList<String> list = new ArrayList<String>();
    		Map<String, Map<String, String>> items = memClient.statsItems();
    		for (Iterator<String> itemIt = items.keySet().iterator(); itemIt.hasNext();) {
    			String itemKey = itemIt.next();
    			Map<String, String> maps = items.get(itemKey);
    		    for (Iterator<String> mapsIt = maps.keySet().iterator(); mapsIt.hasNext();) {
    		    	String mapsKey = mapsIt.next();
                    String mapsValue = maps.get(mapsKey);
                    if (mapsKey.endsWith("number")) {  //memcached key 类型  item_str:integer:number_str
                    	String[] arr = mapsKey.split(":");
                        int slabNumber = Integer.valueOf(arr[1].trim());
                        int limit = Integer.valueOf(mapsValue.trim());
                        Map<String, Map<String, String>> dumpMaps = memClient.statsCacheDump(slabNumber, limit);
                        for (Iterator<String> dumpIt = dumpMaps.keySet().iterator(); dumpIt.hasNext();) {
                            String dumpKey = dumpIt.next();
                            Map<String, String> allMap = dumpMaps.get(dumpKey);
                            for (Iterator<String> allIt = allMap.keySet().iterator(); allIt.hasNext();) {
                                String allKey = allIt.next();
                                list.add(allKey.trim());
                            }
                        }
                    }
    			}
    		}
        	return list;
        }

    }
	/**
	 * 获取存储的key值
	 * 已存在的prefix:FlightFocusInfo
	 * 新增加的prefix命名时需确保唯一性,避免取值出问题
	 */
	public static String getKey(String prefix,ArrayList<String> parms) {
		StringBuffer generateKey = new StringBuffer("");
		if(!ToolUtil.isNull(parms)){
			Iterator<String> itr = parms.iterator();
			generateKey=generateKey.append(prefix).append("_");
			while(itr.hasNext()){
				generateKey.append(itr.next()).append("_");
			}
		}
		return generateKey.toString();
	}
	/**
	 * 匹配符合条件的key值
	 */
	public static ArrayList<String> matchKey(String prefix,ArrayList<String> parms) {
		ArrayList<String> matchKeys = new ArrayList<String>();
		if(!ToolUtil.isNull(parms)){
			ArrayList<String> keys = new ArrayList<String>();
			boolean findFlag = true;
			parms.add(prefix);
			keys = getAllKey();
			Iterator<String> keysItr = keys.iterator();
			while(keysItr.hasNext()){
				String key = keysItr.next();
				String[] k = key.split("_");
				List k_a = Arrays.asList(k);
				Iterator<String> parmsItr = parms.iterator();
				while(parmsItr.hasNext()){
					if(!k_a.contains(parmsItr.next())){
						findFlag = false;
					}
				}
				if(findFlag){
					matchKeys.add(key);
				}
				findFlag = true;
			}
		}
		return matchKeys;
	}
    /**
     * @category 删除记录
     * @category 执行该方法之后,使用stats的统计结果会同步更新
     * @param key 记录的主键
     * @return 操作结果
     */
    public boolean delete(String key){
        if(!enUsed){
            return false;
        }else{
            return memClient.delete(key);
        }
    }

    /*
     * ****************************************************************************************************************
     * 下面的6个方法都是为了对memcached服务器进行监控及管理所用的,可能对服务器造成阻塞,所以除Debug以外,不推荐使用!
     */

    /**
     * @category 清空全部缓存数据。*慎用!!
     * @category 执行该方法之后,使用stats的统计结果不会马上发生变化,每get一个不存在的item之后,该item的值才会被动清空
     * @return 操作结果
     */
    public boolean flushAll(){
        if(!enUsed){
            return false;
        }else{
            return memClient.flushAll();
        }
    }

    /**
     * @category 返回可用的服务器列表
     * @return 数组(服务器地址:端口)
     */
    public String[] servers(){
        if(!enUsed) return null;
        return serverListArr;
    }

    /**
     * @category 返回所有缓存服务器当前的运行状态

     * @return
     *
     *   Map
     *    |-- Key : ServerName01, Value : LinkedHashMap
     *    |                                |-- Key : statName01, Value : statValue
     *    |                                |-- ...
     *    |
     *    |-- Key : ServerName02, Value : LinkedHashMap
     *    |                                |-- Key : statName01, Value : statValue
     *    |                                |-- ...
     *    |
     *    |-- ...
     *
     */
    public Map<String,LinkedHashMap<String, String>> stats(){
        if(!enUsed) return null;
        Map<String,LinkedHashMap<String, String>> retMap = new HashMap<String,LinkedHashMap<String, String>>();
        for(String server : serverListArr){
            LinkedHashMap<String, String> serverStats = this.stats(server);
            retMap.put(server, serverStats);
        }
        return retMap;
    }

    /**
     * @category 返回指定服务器当前的运行状态
     * @param server 服务器地址:端口
     *
     * 优化: 参数名称中文显示
     * 优化: 毫秒数转换为小时
     * 优化: 字节数转换为MB或KB
     * 优化: UNIX时间戳转换为标准时间
     * 优化: 参数显示顺序更加直观
     *
     * @return LinkedHashMap<String, String> 可对Map进行有序遍历
     *
     */
    public LinkedHashMap<String, String> stats(String server){
        if(!enUsed) return null;
        LinkedHashMap<String, String> retMap = new LinkedHashMap<String, String>();
        Map<String, Map<String, String>> statsList = memClient.stats(new String[]{server});
        //System.out.println(memClient.stats().toString());
        DecimalFormat format = new DecimalFormat("0.0");
        for(Object serverTitle : statsList.keySet().toArray()){
            Map<String, String> serverStats = (Map<String, String>)statsList.get(serverTitle);
            retMap.put(statsItems.get("pid"), serverStats.get("pid").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("version"), serverStats.get("version").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("pointer_size"), serverStats.get("pointer_size").replaceAll("\\r\\n", "") + "位");
            retMap.put(statsItems.get("time"), new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(Long.parseLong(serverStats.get("time").replaceAll("\\r\\n", "")) * 1000)).toString());
            retMap.put(statsItems.get("uptime"), format.format(Double.parseDouble(serverStats.get("uptime").replaceAll("\\r\\n", ""))/(60*60)) + "小时");
            retMap.put(statsItems.get("connection_structures"), serverStats.get("connection_structures").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("total_connections"), serverStats.get("total_connections").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("curr_connections"), serverStats.get("curr_connections").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("limit_maxbytes"), format.format(Double.parseDouble(serverStats.get("limit_maxbytes").replaceAll("\\r\\n", ""))/(1024*1024)) + "MB");
            retMap.put(statsItems.get("bytes"), format.format(Double.parseDouble(serverStats.get("bytes").replaceAll("\\r\\n", ""))/(1024*1024)) + "MB");
            retMap.put(statsItems.get("bytes_written"), format.format(Double.parseDouble(serverStats.get("bytes_written").replaceAll("\\r\\n", ""))/(1024)) + "KB");
            retMap.put(statsItems.get("bytes_read"), format.format(Double.parseDouble(serverStats.get("bytes_read").replaceAll("\\r\\n", ""))/(1024)) + "KB");
            retMap.put(statsItems.get("total_items"), serverStats.get("total_items").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("curr_items"), serverStats.get("curr_items").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("cmd_get"), serverStats.get("cmd_get").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("get_hits"), serverStats.get("get_hits").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("get_misses"), serverStats.get("get_misses").replaceAll("\\r\\n", ""));
            retMap.put(statsItems.get("cmd_set"), serverStats.get("cmd_set").replaceAll("\\r\\n", ""));
        }
        return retMap;
    }

    /**
     * @category 返回指定服务器及Slab中当前使用的item列表
     * @param server 服务器地址:端口
     * @param slab SlabId
     * @param counter 最多显示items条数
     * @return
     */
    public LinkedList<String> items(String server, int slab, int counter){
        if(!enUsed) return null;
        LinkedList<String> ret = new LinkedList<String>();
        Map<String, String> itemsKey = memClient.statsCacheDump(new String[]{server}, slab, counter).get(server);
        for(Object key : itemsKey.keySet().toArray()){
            ret.add(key.toString());
        }
        return ret;
    }

    /**
     * @category 返回指定服务器当前使用的SlabsID列表
     * @param server 服务器地址:端口
     * @return
     */
    public LinkedList<Integer> slabs(String server){
        if(!enUsed) return null;
        LinkedList<Integer> slabsId = new LinkedList<Integer>();
        Map<String, String> itemsMap = memClient.statsItems(new String[]{server}).get(server);
        Object[] itemsArr = itemsMap.keySet().toArray();
        for(int i=0, len=itemsArr.length; i<len; i+=2){
            slabsId.add(Integer.parseInt(itemsArr[i].toString().split(":")[1]));
        }
        return slabsId;
    }

    /*
     * 上面的6个方法都是为了对memcached服务器进行监控及管理所用的,可能对服务器造成阻塞,所以除Debug以外,不推荐使用!
     * ****************************************************************************************************************
     */

    /**
     * 使用示例
     */
    public static void main(String[] args) {

        //初始化memcached操作类对象
        MemCached cache = MemCached.getInstance();

        //验证memcached服务是否已启用
        if(!cache.used()){
            System.out.println("memcached服务未启用!");
            return;
        }

        //插入新记录
        System.out.println("开始插入新记录(add):\r\n===================================");
        System.out.println("keyTest01:" + cache.add("keyTest01", "keyTest01Content"));
        System.out.println("keyTest02:" + cache.add("keyTest02", "keyTest02Content"));
        System.out.println("插入新记录操作完成\r\n===================================");

        //读取单条记录
        System.out.println("读取单条记录(get):\r\n===================================");
        System.out.println("keyTest01:" + cache.get("keyTest01"));
        System.out.println("keyTest02:" + cache.get("keyTest02"));
        System.out.println("读取单条记录操作完成\r\n===================================");

        //读取多条记录
        System.out.println("读取多条记录(add):\r\n===================================");
        System.out.println("keyTest01、keyTest02:" + cache.get(new String[]{"keyTest01", "keyTest02"}));
        System.out.println("读取多条记录操作完成\r\n===================================");

        //修改记录值
        System.out.println("修改记录值(replace):\r\n===================================");
        System.out.println("keyTest01:" + cache.get("keyTest01"));
        System.out.println("keyTest01:" + cache.replace("keyTest01", "keyTest01ContentReplace!"));
        System.out.println("keyTest01:" + cache.get("keyTest01"));
        System.out.println("修改记录值操作完成\r\n===================================");

        //添加或修改记录
        System.out.println("添加或修改记录(set):\r\n===================================");
        System.out.println("keyTest03:" + cache.set("keyTest03", "keyTest03Content"));
        System.out.println("keyTest03:" + cache.get("keyTest03"));
        System.out.println("keyTest03:" + cache.set("keyTest03", "keyTest03ContentReplace!"));
        System.out.println("keyTest03:" + cache.get("keyTest03"));
        System.out.println("添加或修改记录操作完成\r\n===================================");

        //删除记录
        System.out.println("删除记录(delete):\r\n===================================");
        System.out.println("keyTest01:" + cache.delete("keyTest01"));
        System.out.println("keyTest02:" + cache.delete("keyTest02"));
        System.out.println("keyTest03:" + cache.get("keyTest03"));
        System.out.println("keyTest03:" + cache.delete("keyTest03"));
        System.out.println("keyTest03:" + cache.get("keyTest03"));
        System.out.println("修改记录值操作完成\r\n===================================");

        //打印当前的服务器参数及统计信息
        System.out.println("服务器参数及统计信息(stats):\r\n===================================");
        Map statsList = cache.stats();
        for(Object server : statsList.keySet().toArray()){
            System.out.println("-------------------------\r\n服务器:" + server + " : \r\n-------------------------");
            LinkedHashMap serverStats = (LinkedHashMap)statsList.get(server);
            for(Object statKey : serverStats.keySet().toArray()){
                System.out.println(statKey + " : " + serverStats.get(statKey));
            }
        }
    }
}
				
时间: 2024-10-14 00:31:53

memcached的使用的相关文章

关于win下Memcached安装步骤

2天对我来说有点煎熬..数据量达到17w的时候 我本地执行查询速度特别慢! 请教了一些php大牛如何解决速度问题,在加了索引和优化sql后还是速度慢!我决定在win环境下用Memcached和memcache 来处理,先声明一下: memcache是php的拓展,memcached是客户端,复杂的说:Memcache模块提供了于memcached方便的面向过程及面向对象的接口,memcached是为了降低动态web应用 从数据库加载数据而产生的一种常驻进程缓存产品. 因为我本地用的是xampp集

memcached安装

今天有台服务器需要迁移业务安装memcached,以前没有安装过,按照网上步骤尝试了下,并且记录了安装过程. 安装包准备: libevent-1.4.14b-stable.tar.gz memcached-1.4.5.tar.gz 首先安装libevent: tar zxvf libevent-1.4.14-stable.tar.gz -C /usr/local/ cd libevent-1.4.14-stable/ ./configure -prefix=/usr/libevent make

Linux下安装搭建Memcached集群环境

Linux下安装搭建Memcached集群环境

linux编译安装memcached

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度. Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以 用任何语言来编写,并通过memcached协议与守护进程通信. 1.memcached安装: 安装开发包:yum -y install gcc 安装memcached相应依赖组件: yum -y ins

(apache+tomcat集群+memcached番外篇)单台tomcat的session信息的2种持久化方式

为什么要实现搭建tomcat集群环境呢?主要因为单个tomcat无论从吞吐量和并发数上,会达到一定的极限.如果访问量超过单个tomcat的承受能力的话,tomcat一般要么拒绝提供服务,要么直接宕掉.所以,必须要依靠tomcat集群技术.举个最简单的例子,拿"送快件"比喻,如果一个人,5分钟送一件,一小时之内,送10个,一个人完全能胜任这项工作.假设现在到了双十一,要求1小时,送100个, 那怎么办?只能安排更多的人加入"送快件"这项工作中来.这其实和集群一个道理.

修改memcached服务的端口号

windows下修改memcached服务的端口号(默认端口:11211) 如果不是作为服务启动memcached的话,memcached -p 端口号就可以了. 通过修改注册表可以简单实现 运行:regedit打开注册表,搜索memcached或者按下面的目录查找: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server 其中的ImagePath项的值为:"c:\memcached\memcached.exe&

基于nginx+tomcat的负载均衡以及memcached解决交叉存储

nginx是以多进程的方式工作的,有一个master进程和多个worker进程master进程用来管理worker进程(1)向各worker进程发送信号(2)监控worker进程,当一个worker进程出现异常后,会启动新的worker进程. master进程会先建立好需要监听的socket,fork函数生成子进程workers,继承scoket,一般来讲,当有连接进入后,所有accept在这个socket上面的进程都会收到通知,而只有一个进程会accept这个连接,其它都会失败.  --->

第八章 企业项目开发--分布式缓存memcached

注意:本节代码基于<第七章 企业项目开发--本地缓存guava cache> 1.本地缓存的问题 本地缓存速度一开始高于分布式缓存,但是随着其缓存数量的增加,所占内存越来越大,系统运行内存越来越小,最后系统会被拖慢(这一点与第二点联系起来) 本地缓存存于本机,其缓存数量与大小受本机内存大小限制 本地缓存存于本机,其他机器的访问不到这样的缓存 解决方案:分布式缓存 Jboss cache:缓存还存于本机,但是会同步更新到其他机器(解决了第三个问题,解决不了第一和第二个问题),如果缓存机器数量很多

memcached完全剖析–1. memcached的基础

系列文章导航: memcached完全剖析–1. memcached的基础 memcached全面剖析–2. 理解memcached的内存存储 memcached全面剖析–3. memcached的删除机制和发展方向 memcached全面剖析–4. memcached的分布式算法 memcached全面剖析–5. memcached的应用和兼容程序 翻译一篇技术评论社的文章,是讲memcached的连载.fcicq同学说这个东西很有用,希望大家喜欢. 发表日:2008/7/2 作者:长野雅广(

memcached全面剖析--4

memcached的分布式算法   memcached的分布式 正如第1次中介绍的那样, memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能. 服务器端仅包括 第2次. 第3次 前坂介绍的内存存储功能,其实现非常简单. 至于memcached的分布式,则是完全由客户端程序库实现的. 这种分布式是memcached的最大特点. memcached的分布式是什么意思? 这里多次使用了“分布式”这个词,但并未做详细解释. 现在开始简单地介绍一下其原理,各个客户端的实现基本相