Renchunbing / xmemcached

Automatically exported from code.google.com/p/xmemcached
Apache License 2.0
1 stars 0 forks source link

使用Xmemcached操作memcached的连接问题 #111

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
自己写了一个工具类,但是不清楚这么操作性能如何,效率��
�何?工具类会随后附上。

问题1: 
此工具类是builder和memcached只建立一次,只有builder和memcached为
空时才重新建立连接。是不是每次操作都重新建立builder和memc
ached好?

能不能帮我指出我写的工具类的不足?

使用方式是HtmlMemcachedUtil.addCached(), 
HtmlMemcachedUtil.getCachedValueByKey()

工具类如下:

import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeoutException;

import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.exception.MemcachedException;
import net.rubyeye.xmemcached.utils.AddrUtil;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.code.yanf4j.util.ResourcesUtils;

/**
 * MemcacheUtil类,负责Memcached的连接、添加、删除、更新等
 * 
 * @author Thomasong
 */
public class HtmlMemcachedUtil {
    private static final Logger LOG = LoggerFactory.getLogger(HtmlMemcachedUtil.class);
    private static final long serialVersionUID = -3485654964012463023L;

    private static  MemcachedClientBuilder builder = getBuilder();;
    private static  MemcachedClient memcachedClient = getMemecachedClient();
    /**
     * 获取memcached配置地址 
     * @return
     */
    public static String getServer() {
        try {
            Properties properties = ResourcesUtils.getResourceAsProperties("memcached.properties");
            if (properties.get("servers") == null) {
                LOG.error("请配置memcached服务地址");
            }
            String servers = (String) properties.get("servers");
            return servers;
        } catch (Exception e) {
            e.printStackTrace();
            LOG.error("请配置memcached服务地址");
        }
        return null;
    }

    /*
     * 获取Memcached Builder
     * */
    public static MemcachedClientBuilder getBuilder() {
        if (builder == null) {
            return new XMemcachedClientBuilder(AddrUtil.getAddresses(getServer()));
        } else {
            return builder;
        }

    }

    /**
     * 获取Mmecached Client
     * @return
     */
    public static MemcachedClient getMemecachedClient() {
        try {
            if (builder == null ) {
                builder=getBuilder();
                MemcachedClient client=builder.build();
                //client.getTranscoder().setCompressionThreshold(512);
//              MemcachedClientBuilder builder = getBuilder();
//              memcachedClient = builder.build();
//              memcachedClient.setSanitizeKeys(false);
//              memcachedClient.getTranscoder().setCompressionThreshold(6072 * 1024);
//              return memcachedClient;
                return client;
            } else {
                return builder.build();
            }
        } catch (IOException e) {
            e.printStackTrace();
            LOG.error("获取MemcachedClient失败");
        }
        return null;
    }

    /**
     * 设置Memcached的Key/Value Key为URI Value为 html MemcachedUtil.addCached(String uri,Integer validTime)
     * 
     * @param MemcachedItem
     * @return
     */
    public static boolean addCached(MemcachedItem mi, int validTime) {
        try {
            if ( memcachedClient == null||memcachedClient.isShutdown()) memcachedClient=getMemecachedClient();
            memcachedClient.set(mi.getKey(), validTime, mi.getValue());
//          memcachedClient.shutdown();
            return true;
        } catch (MemcachedException e) {
            LOG.error("MemcachedClient operation fail");
            e.printStackTrace();
        } catch (TimeoutException e) {
            LOG.error("TimeoutException");
            e.printStackTrace();
        } catch (InterruptedException e) {
            LOG.error("InterruptedException e");
            e.printStackTrace();
        }
        LOG.error("Add Cached ERROR" + mi.getKey() + mi.getValue());
        return false;
    }

    /**
     * 通过Key找到Value
     * 
     * @param uri
     * @return
     */
    public static MemcachedItem getCachedValueByKey(String uri) {
        try {
            if ( memcachedClient == null||memcachedClient.isShutdown()) memcachedClient=getMemecachedClient();
            String value = memcachedClient.get(uri);
            if(value==null||value.equals(""))return null;
            MemcachedItem mi = new MemcachedItem();
            mi.setKey(uri);
            mi.setValue(value);
//          memcachedClient.shutdown();
            return mi;
        } catch (MemcachedException e) {
            LOG.error("MemcachedClient operation fail");
            e.printStackTrace();
        } catch (TimeoutException e) {
            LOG.error("TimeoutException");
            e.printStackTrace();
        } catch (InterruptedException e) {
            LOG.error("InterruptedException e");
            e.printStackTrace();
        }catch (NullPointerException e) {
            LOG.error("NullPointerException e");
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据URI删除Cached
     * 
     * @param uri
     * @return
     */
    public static boolean deleteCachedValueByKey(String uri) {
        try {
            if(memcachedClient == null||memcachedClient.isShutdown() ) memcachedClient=getMemecachedClient();
             memcachedClient.delete(uri);
//           memcachedClient.shutdown();
            return true;
        } catch (MemcachedException e) {
            LOG.error("MemcachedClient operation fail");
            e.printStackTrace();
        } catch (TimeoutException e) {
            LOG.error("TimeoutException");
            e.printStackTrace();
        } catch (InterruptedException e) {
            LOG.error("InterruptedException e");
            e.printStackTrace();
        }
        return false;
    }

    public static boolean closeConnect() {
        try {
            // memcachedClient = builder.build();
            if (memcachedClient!=null&&!memcachedClient.isShutdown()) {
                memcachedClient.shutdown();
            }
            return true;
        } catch (IOException e) {
            LOG.error("IOException");
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 判断是否包含所需要的URL
     * @param url
     * @return
     */
    public boolean isContainUrl(String url) {
        try {
            if(memcachedClient==null||memcachedClient.isShutdown()) memcachedClient=getMemecachedClient();
            String value = memcachedClient.get(url);
            if (value == null || value.equals(""))
                return false;
        } catch (Exception e) {
            e.printStackTrace();
            LOG.error("判断是否含有URL" + url + "失败");
        }
        return true;
    }

    /**set get block**/

    public static MemcachedClient getMemcachedClient() {
        return memcachedClient;
    }

    public static void setMemcachedClient(MemcachedClient memcachedClient) {
        HtmlMemcachedUtil.memcachedClient = memcachedClient;
    }

}

Original issue reported on code.google.com by songduan...@gmail.com on 12 Feb 2011 at 5:57

GoogleCodeExporter commented 9 years ago
服务器端出现如下的日志算是正常吗?
2011-02-12 13:58:37 AbstractSession [DEBUG] read 15 bytes from channel
2011-02-12 13:58:43 MemcachedHandler [DEBUG] Session (%s) is idle,send heartbeat
2011-02-12 13:58:43 AbstractSession [DEBUG] After encodingversion

2011-02-12 13:58:43 Optimizer [DEBUG] Optimieze merge buffer:version

2011-02-12 13:58:43 AbstractSession [DEBUG] send buffers:
[
 buffer:position=0,limit=9,capacity=9
]
2011-02-12 13:58:43 AbstractSession [DEBUG] read 15 bytes from channel

Original comment by songduan...@gmail.com on 12 Feb 2011 at 6:00

GoogleCodeExporter commented 9 years ago
使用前仔细看下用户指南和最佳实践吧
http://code.google.com/p/xmemcached/wiki/PerformanceTurnning

MemcachedClient不用每次都build一个,应该作为单例使用,它的创
建代价很大,创建的时候即建立连接。
日志是正常的,生产环境调整为INFO级别就不会出现了。

Original comment by killme2...@gmail.com on 14 Feb 2011 at 2:38

GoogleCodeExporter commented 9 years ago
使用前仔细看下用户指南和最佳实践吧
http://code.google.com/p/xmemcached/wiki/PerformanceTurnning

MemcachedClient不用每次都build一个,应该作为单例使用,它的创
建代价很大,创建的时候即建立连接。
日志是正常的,生产环境调整为INFO级别就不会出现了。

Original comment by killme2...@gmail.com on 14 Feb 2011 at 2:38

GoogleCodeExporter commented 9 years ago
您好,您写的这个封装正式用了没,用的怎么样?

Original comment by 404228...@163.com on 19 Jul 2012 at 7:45