zoukankan      html  css  js  c++  java
  • Spring集成Memcached三种方式(一)

    转载:http://blog.csdn.net/u013725455/article/details/52102170

    Memcached Client目前有3种: 
    Memcached Client for Java 
    SpyMemcached 
    XMemcached

    这三种Client一直存在各种争议: 
    Memcached Client for Java 比 SpyMemcached更稳定、更早、更广泛; 
    SpyMemcached 比 Memcached Client for Java更高效; 
    XMemcached 比 SpyMemcache并发效果更好。

    方式一:Memcached Client for Java 
    jar包准备:java_memcached-release_2.6.6.jar

    memcached.properties配置文件:配置服务器地址,连接数,超时时间等

    #######################Memcached配置#######################  
    #服务器地址  
    memcached.server1=127.0.0.1
    memcached.port1=11211
    #memcached.server=127.0.0.1:11211
    #初始化时对每个服务器建立的连接数目  
    memcached.initConn=20  
    #每个服务器建立最小的连接数  
    memcached.minConn=10  
    #每个服务器建立最大的连接数  
    memcached.maxConn=50  
    #自查线程周期进行工作,其每次休眠时间  
    memcached.maintSleep=3000  
    #Socket的参数,如果是true在写数据时不缓冲,立即发送出去  
    memcached.nagle=false  
    #Socket阻塞读取数据的超时时间  
    memcached.socketTO=3000  
    
    
    ##pool.setServers(servers);  
    ##pool.setWeights(weights);  
    ##pool.setHashingAlg(SockIOPool.CONSISTENT_HASH);  
    ##pool.setInitConn(5);  
    ##pool.setMinConn(5);  
    ##pool.setMaxConn(250);  
    ##pool.setMaxIdle(1000 * 60 * 60 * 6);  
    ##pool.setMaintSleep(30);  
    ##pool.setNagle(false);  
    ##pool.setSocketTO(3000);  
    ##pool.setSocketConnectTO(0);  
    

    配置Bean

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
          http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
           http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
        <!-- properties config   -->  
        <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
          <property name="order" value="1"/>  
          <property name="ignoreUnresolvablePlaceholders" value="true"/>  
          <property name="locations">  
            <list> 
                <!--<value>classpath:/com/springmvc/config/memcached.properties</value>--> 
                <value>/WEB-INF/config/memcached.properties</value>  
            </list>  
          </property>  
        </bean>  
        <!-- Memcached配置 -->  
        <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool"  
            factory-method="getInstance" init-method="initialize" destroy-method="shutDown">  
            <property name="servers">  
            <!-- ${memcached.server} -->
                <list>  
                    <value>${memcached.server1}:${memcached.port1}</value>  
                </list>  
            </property>  
            <property name="initConn">  
                <value>${memcached.initConn}</value>  
            </property>  
            <property name="minConn">  
                <value>${memcached.minConn}</value>  
            </property>  
            <property name="maxConn">  
                <value>${memcached.maxConn}</value>  
            </property>  
            <property name="maintSleep">  
                <value>${memcached.maintSleep}</value>  
            </property>  
            <property name="nagle">  
                <value>${memcached.nagle}</value>  
            </property>  
            <property name="socketTO">  
                <value>${memcached.socketTO}</value>  
            </property>  
        </bean>  
    </beans>
    

    将app-context-memcached.xml配置到app-context.xml中

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
          http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd
           http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
        <import resource="app-context-memcached.xml" /><!--memcached 缓存配置 -->
        <!-- <import resource="app-context-xmemcached.xml" /> -->
        <!-- <import resource="app-context-spymemcached.xml" />  -->
        <!-- @Component and @Resource -->
        <bean
            class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
        <!-- 对com包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
        <context:component-scan base-package="com.springmvc.imooc" />
        <!-- 定时器 -->
        <!-- <task:annotation-driven /> -->
        <!-- mvc -->
        <mvc:annotation-driven />
        <!-- Aspect -->
        <!-- <aop:aspectj-autoproxy /> -->
    </beans>
    

    Memcached工具类:

    /*
     * 文件名:MemcachedUtils.java
     * 版权:Copyright 2007-2016 517na Tech. Co. Ltd. All Rights Reserved. 
     * 描述: MemcachedUtils.java
     * 修改人:peiyu
     * 修改时间:2016年8月2日
     * 修改内容:新增
     */
    package com.springmvc.imooc.util;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.util.Date;
    
    import com.danga.MemCached.MemCachedClient;
    
    /**
     * @author peiyu
     */
    public final class MemcachedUtils {
        /**
         * cachedClient.
         */
        private static MemCachedClient cachedClient;
        static {
            if (cachedClient == null) {
                cachedClient = new MemCachedClient("memcachedPool");
            }
        }
        /**
         * 构造函数.
         */
        private MemcachedUtils() {
        }
        /**
         * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换.
         * @param key 键
         * @param value 值
         * @return boolean
         */
        public static boolean set(String key, Object value) {
            return setExp(key, value, null);
        }
        /**
         * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换.
         * @param key 键
         * @param value 值
         * @param expire 过期时间 New Date(1000*10):十秒后过期
         * @return boolean
         */
        public static boolean set(String key, Object value, Date expire) {
            return setExp(key, value, expire);
        }
        /**
         * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换.
         * @param key 键
         * @param value 值
         * @param expire 过期时间 New Date(1000*10):十秒后过期
         * @return boolean
         */
        private static boolean setExp(String key, Object value, Date expire) {
            boolean flag = false;
            try {
                flag = cachedClient.set(key, value, expire);
            } catch (Exception e) {
                MemcachedLog.writeLog("Memcached set方法报错,key值:" + key + "
    " + exceptionWrite(e));
            }
            return flag;
        }
        /**
         * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对.
         * @param key 键
         * @param value 值
         * @return boolean
         */
        public static boolean add(String key, Object value) {
            return addExp(key, value, null);
        }
        /**
         * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对.
         * @param key 键
         * @param value 值
         * @param expire 过期时间 New Date(1000*10):十秒后过期
         * @return boolean
         */
        public static boolean add(String key, Object value, Date expire) {
            return addExp(key, value, expire);
        }
        /**
         * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对.
         * @param key 键
         * @param value 值
         * @param expire 过期时间 New Date(1000*10):十秒后过期
         * @return boolean
         */
        private static boolean addExp(String key, Object value, Date expire) {
            boolean flag = false;
            try {
                flag = cachedClient.add(key, value, expire);
            } catch (Exception e) {
                MemcachedLog.writeLog("Memcached add方法报错,key值:" + key + "
    " + exceptionWrite(e));
            }
            return flag;
        }
        /**
         * 仅当键已经存在时,replace 命令才会替换缓存中的键.
         * @param key 键
         * @param value 值
         * @return boolean
         */
        public static boolean replace(String key, Object value) {
            return replaceExp(key, value, null);
        }
        /**
         * 仅当键已经存在时,replace 命令才会替换缓存中的键.
         * @param key 键
         * @param value 值
         * @param expire 过期时间 New Date(1000*10):十秒后过期
         * @return boolean
         */
        public static boolean replace(String key, Object value, Date expire) {
            return replaceExp(key, value, expire);
        }
        /**
         * 仅当键已经存在时,replace 命令才会替换缓存中的键.
         * @param key 键
         * @param value 值
         * @param expire 过期时间 New Date(1000*10):十秒后过期
         * @return boolean
         */
        private static boolean replaceExp(String key, Object value, Date expire) {
            boolean flag = false;
            try {
                flag = cachedClient.replace(key, value, expire);
            } catch (Exception e) {
                MemcachedLog.writeLog("Memcached replace方法报错,key值:" + key + "
    " + exceptionWrite(e));
            }
            return flag;
        }
        /**
         * get 命令用于检索与之前添加的键值对相关的值.
         * @param key 键
         * @return boolean
         */
        public static Object get(String key) {
            Object obj = null;
            try {
                obj = cachedClient.get(key);
            } catch (Exception e) {
                MemcachedLog.writeLog("Memcached get方法报错,key值:" + key + "
    " + exceptionWrite(e));
            }
            return obj;
        }
        /**
         * 删除 memcached 中的任何现有值.
         * @param key 键
         * @return boolean
         */
        public static boolean delete(String key) {
            return deleteExp(key, null);
        }
        /**
         * 删除 memcached 中的任何现有值.
         * @param key 键
         * @param expire 过期时间 New Date(1000*10):十秒后过期
         * @return boolean
         */
        public static boolean delete(String key, Date expire) {
            return deleteExp(key, expire);
        }
        /**
         * 删除 memcached 中的任何现有值.
         * @param key 键
         * @param expire 过期时间 New Date(1000*10):十秒后过期
         * @return boolean
         */
        @SuppressWarnings("deprecation")
        private static boolean deleteExp(String key, Date expire) {
            boolean flag = false;
            try {
                flag = cachedClient.delete(key, expire);
            } catch (Exception e) {
                MemcachedLog.writeLog("Memcached delete方法报错,key值:" + key + "
    " + exceptionWrite(e));
            }
            return flag;
        }
        /**
         * 清理缓存中的所有键/值对.
         * @return boolean
         */
        public static boolean flashAll() {
            boolean flag = false;
            try {
                flag = cachedClient.flushAll();
            } catch (Exception e) {
                MemcachedLog.writeLog("Memcached flashAll方法报错
    " + exceptionWrite(e));
            }
            return flag;
        }
        /**
         * 返回异常栈信息,String类型.
         * @param e Exception
         * @return boolean
         */
        private static String exceptionWrite(Exception e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            pw.flush();
            return sw.toString();
        }
    }
    

      

    测试:

    System.out.println(MemcachedUtils.set("aa", "bb", new Date(1000 * 60)));
    Object obj = MemcachedUtils.get("aa");  
    System.out.println("***************************");  
    System.out.println(obj.toString());  
    
  • 相关阅读:
    PAT甲级1060 Are They Equal【模拟】
    PAT甲级1131 Subway Map【dfs】【输出方案】
    PAT甲级1052 Linked List Sorting
    Dev的GridControl控件选择框的使用
    关于MongoDB数据库中文件唯一性的问题
    docker-学习笔记5-存储卷
    docker-学习笔记4-网络
    docker-学习笔记3-镜像基础
    docker-学习笔记2-基础用法
    docker-学习笔记1-基础入门
  • 原文地址:https://www.cnblogs.com/rench/p/5733964.html
Copyright © 2011-2022 走看看