设为首页 收藏本站
查看: 1648|回复: 0

[经验分享] memcached 的配置及 spymemcached 客户端简单使用

[复制链接]

尚未签到

发表于 2015-8-31 11:55:40 | 显示全部楼层 |阅读模式
  Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。同时也可以用作不同系统之间的数据共享。应用比较广泛。下面介绍一下环境的memcached环境的搭建及简单实用

  • 1. 下载 libevent。官网下载 libevent
  • 2. 下载 memcached。官网下载 memcached
  • 3. 安装libevent,解压压缩包  
       1:  ./configure –prefix=/usr/local/libevent   2:  make   3:  make install


  • 4.安装memcached。




  •    1:  ./configure-prefix=/usr/local/memcached-with-libevent –with-libevent=/usr/local/libevent   2:  make   3:  make install


  • 5. 运行


  •    1:  ./memcached -u root
  • 不出意外的话,服务器端的安装完毕了。

  • 简单的Java客户端Demo。使用的是spymemcached客户端
  • 最近上生产环境因为使用memcached差点导致宕机。由于spymemcached在发不通主机是会不断的请求连接。同时代码的写法有问题,每一次请求都新建了一个客户端。所以需要注意的是,SpyMemcachedManager 应该全局使用一个对象。减少开销。
  • /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    package memcached;

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.SocketAddress;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;
    import net.spy.memcached.AddrUtil;
    import net.spy.memcached.ConnectionObserver;
    import net.spy.memcached.MemcachedClient;
    import net.spy.memcached.transcoders.Transcoder;

    /**
    *
    * @author yingzi.zhu
    */
    public class SpyMemcachedManager {

        private List<String> servers;   // 192.168.159.129:11211
        private MemcachedClient memClient;
        public static int DEFAULT_TIMEOUT = 5;   
        public static TimeUnit DEFAULT_TIMEUNIT = TimeUnit.SECONDS;
       
        public SpyMemcachedManager(List<String> servers) {        
            this.servers = servers;        
        }   
       
        public void connect() throws IOException {        
            if (memClient != null) {            
                return;            
            }        
            StringBuffer buf = new StringBuffer();        
            for (int i = 0; i < servers.size(); i++) {            
                String server = servers.get(i);            
                buf.append(server).append(" ");            
            }        
            memClient = new MemcachedClient(AddrUtil.getAddresses(buf.toString()));        
        }   
       
        public void disConnect() {        
            if (memClient == null) {            
                return;            
            }        
            memClient.shutdown();        
        }   
       
        public void addObserver(ConnectionObserver obs) {        
            memClient.addObserver(obs);        
        }   
       
        public void removeObserver(ConnectionObserver obs) {        
            memClient.removeObserver(obs);        
        }

       
        public boolean set(String key, Object value, int expire) {        
            Future<Boolean> f = memClient.set(key, expire, value);        
            return getBooleanValue(f);        
        }   
       
        public Object get(String key) {        
            return memClient.get(key);        
        }   
       
        public Object asyncGet(String key) {        
            Object obj = null;        
            Future<Object> f = memClient.asyncGet(key);        
            try {            
                obj = f.get(SpyMemcachedManager.DEFAULT_TIMEOUT,
                        SpyMemcachedManager.DEFAULT_TIMEUNIT);            
            } catch (Exception e) {            
                f.cancel(false);            
            }        
            return obj;        
        }   
       
        public boolean add(String key, Object value, int expire) {        
            Future<Boolean> f = memClient.add(key, expire, value);        
            return getBooleanValue(f);        
        }   
       
        public boolean replace(String key, Object value, int expire) {        
            Future<Boolean> f = memClient.replace(key, expire, value);        
            return getBooleanValue(f);        
        }   
       
        public boolean delete(String key) {        
            Future<Boolean> f = memClient.delete(key);        
            return getBooleanValue(f);        
        }   
       
        public boolean flush() {        
            Future<Boolean> f = memClient.flush();        
            return getBooleanValue(f);        
        }   
       
        public Map<String, Object> getMulti(Collection<String> keys) {        
            return memClient.getBulk(keys);        
        }   
       
        public Map<String, Object> getMulti(String[] keys) {        
            return memClient.getBulk(keys);        
        }   
       
        public Map<String, Object> asyncGetMulti(Collection<String> keys) {        
            Map map = null;        
            Future<Map<String, Object>> f = memClient.asyncGetBulk(keys);        
            try {            
                map = f.get(SpyMemcachedManager.DEFAULT_TIMEOUT,
                        SpyMemcachedManager.DEFAULT_TIMEUNIT);            
            } catch (Exception e) {            
                f.cancel(false);            
            }        
            return map;        
        }   
       
        public Map<String, Object> asyncGetMulti(String keys[]) {        
            Map map = null;        
            Future<Map<String, Object>> f = memClient.asyncGetBulk(keys);        
            try {            
                map = f.get(SpyMemcachedManager.DEFAULT_TIMEOUT,
                        SpyMemcachedManager.DEFAULT_TIMEUNIT);            
            } catch (Exception e) {            
                f.cancel(false);            
            }        
            return map;        
        }

        public long increment(String key, int by, long defaultValue, int expire) {        
            return memClient.incr(key, by, defaultValue, expire);        
        }   
       
        public long increment(String key, int by) {        
            return memClient.incr(key, by);        
        }   
       
        public long decrement(String key, int by, long defaultValue, int expire) {        
            return memClient.decr(key, by, defaultValue, expire);        
        }   
       
        public long decrement(String key, int by) {        
            return memClient.decr(key, by);        
        }   
       
        public long asyncIncrement(String key, int by) {        
            Future<Long> f = memClient.asyncIncr(key, by);        
            return getLongValue(f);        
        }   
       
        public long asyncDecrement(String key, int by) {        
            Future<Long> f = memClient.asyncDecr(key, by);        
            return getLongValue(f);        
        }
       
        public void printStats() throws IOException {        
            printStats(null);        
        }   
       
        public void printStats(OutputStream stream) throws IOException {        
            Map<SocketAddress, Map<String, String>> statMap =
                    memClient.getStats();        
            if (stream == null) {            
                stream = System.out;            
            }        
            StringBuffer buf = new StringBuffer();        
            Set<SocketAddress> addrSet = statMap.keySet();        
            Iterator<SocketAddress> iter = addrSet.iterator();        
            while (iter.hasNext()) {            
                SocketAddress addr = iter.next();            
                buf.append(addr.toString() + "/n");            
                Map<String, String> stat = statMap.get(addr);            
                Set<String> keys = stat.keySet();            
                Iterator<String> keyIter = keys.iterator();            
                while (keyIter.hasNext()) {               
                    String key = keyIter.next();               
                    String value = stat.get(key);               
                    buf.append("  key=" + key + ";value=" + value + "/n");               
                }            
                buf.append("/n");            
            }        
            stream.write(buf.toString().getBytes());        
            stream.flush();        
        }   
       
        public Transcoder getTranscoder() {        
            return memClient.getTranscoder();        
        }   
       
        private long getLongValue(Future<Long> f) {        
            try {            
                Long l = f.get(SpyMemcachedManager.DEFAULT_TIMEOUT,
                        SpyMemcachedManager.DEFAULT_TIMEUNIT);            
                return l.longValue();            
            } catch (Exception e) {            
                f.cancel(false);            
            }        
            return -1;        
        }   
       
        private boolean getBooleanValue(Future<Boolean> f) {        
            try {            
                Boolean bool = f.get(SpyMemcachedManager.DEFAULT_TIMEOUT,
                        SpyMemcachedManager.DEFAULT_TIMEUNIT);            
                return bool.booleanValue();            
            } catch (Exception e) {            
                f.cancel(false);            
                return false;            
            }        
        }   
    }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106779-1-1.html 上篇帖子: memcached系列2:memcached实例 下篇帖子: Memcached 类库 EnyimMemcached 下的JSON序列化和二进制序列化兼容
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表