转载请注明出处:http://blog.csdn.net/l1028386804/article/details/48229907

这篇文章给大家介绍如何集成spring与Mamcached,以达到系统性能优化的效果

1.安装memcache

1)下载memcached服务端memcached-1.2.6-win32-bin.zip,地址:http://code.jellycan.com/memcached/
2)下载java版客户端 java_memcached-release_2.6.1.zip
3)解压缩memcached-1.2.6-win32-bin.zip到指定目录,例如:D:\memcached-1.2.6-win32 ,
在终端(即cmd命令行界面),执行'D:\memcached-1.2.6-win32\memcached.exe -d install'
安装,再执行:'D:\memcached\memcached.exe -d start'启动,这样memcache就会作为windows系统服务在每 次开机时启动memcache服务。

2. 新建配置文件(spring级别)

新建名为spring-memcache.xml的spring配置文件

<?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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" 
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-2.5.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	<bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance" init-method="initialize" destroy-method="shutDown">
		<constructor-arg>
			<value>neeaMemcachedPool</value>
		</constructor-arg>
		<property name="servers">
			<list>
				<value>${memcache.server}</value>
			</list>
		</property>
		<property name="initConn">
			<value>${memcache.initConn}</value>
		</property>
		<property name="minConn">
			<value>${memcache.minConn}</value>
		</property>
		<property name="maxConn">
			<value>${memcache.maxConn}</value>
		</property>
		<property name="maintSleep">
			<value>${memcache.maintSleep}</value>
		</property>
		<property name="nagle">
			<value>${memcache.nagle}</value>
		</property>
		<property name="socketTO">
			<value>${memcache.socketTO}</value>
		</property>
	</bean>
	<bean id="memcachedClient" class="com.danga.MemCached.MemCachedClient">
		<constructor-arg>
			<value>neeaMemcachedPool</value>
		</constructor-arg>
	</bean>
</beans>

3.Web.xml文件中配置新建的文件

<!-- 配置spring的监听器,加载Spring配置文件-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:/spring/applicationContext-common.xml,classpath:/spring/spring-memcache.xml</param-value>
</context-param>

4. 修改spring配置文件

修改applicationContext-common.xml配置文件。
1).添加properties配置文件(memcache.properties)去配置memcache的属性。

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	<property name="locations">
		<list>
			<value>classpath:memcache.properties</value>
			<value>classpath:jdbc.properties</value>
		</list>
	</property>
</bean>
2).添加bean去初始化我们自己的一个spring工具类,一会进行详细解释
<bean id="springContextHolder" class="com.hxrainbow.crm.util.SpringContextHolder"/>

5. Memcache配置文件

memcache.properties文件内容如下:

mcache.server=127.0.0.1\:11211
memcache.initConn=20
memcache.minConn=10
memcache.maxConn=50
memcache.maintSleep=3000
memcache.nagle=false
memcache.socketTO=3000

6. 获得spring容器的工具类

/**

* 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext.
* @author liuyazhuang
**/

public class SpringContextHolder implements ApplicationContextAware{

	private static ApplicationContext applicationContext;

	/**

	* 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.

	*/
	public voidsetApplicationContext(ApplicationContext applicationContext) {
		SpringContextHolder.applicationContext= applicationContext;
	}

	/**

	* 取得存储在静态变量中的ApplicationContext.

	*/
	public staticApplicationContext getApplicationContext() {
		checkApplicationContext();
		return applicationContext;
	}

	/**

	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.

	*/
	@SuppressWarnings("unchecked")
	public static<T> T getBean(String name) {
		checkApplicationContext();
		return (T) applicationContext.getBean(name);
	}

	/**

	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.

	* 如果有多个Bean符合Class, 取出第一个.

	*/
	@SuppressWarnings("unchecked")
	public static<T> T getBean(Class<T> clazz) {
		checkApplicationContext();
		Map beanMaps = applicationContext.getBeansOfType(clazz);
		if (beanMaps!=null&& !beanMaps.isEmpty()) {
			return(T) beanMaps.values().iterator().next();
		}else{
			return null;
		}
	}
	private static voidcheckApplicationContext() {
		if (applicationContext == null) {
			throw newIllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder");

		}
	}
}
下面是这个方法的简单说明:
Set the ApplicationContext that this object runs in.Normally this call will be used to initialize the object.
我们在配置文件中配置了bean的初始化,然后他就可以用于获得spring容器中的东西了。

7.memcache的工具类

/**
 * memcache的工具类
 * @author liuyazhuang
 */
public class MemcacheUtil {
    public static MemCachedClient getMemCachedClient() {
        return SpringContextHolder.getBean("memcachedClient");
	}
}

8.junit测试类

/**
 * 测试类
 * @author liuyazhuang
 */
public class MemcacheUtilTest {
    static MemCachedClient memcachedClient;
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        ApplicationContext ac=new ClassPathXmlApplicationContext(new String[]{"/spring/applicationContext-common.xml","/spring/spring-memcache.xml"});
    }
    @Test
    public void s() {
        MemCachedClient m=SpringContextHolder.getBean("memcachedClient");
        m.set("name", "liuyazhuang");
        System.out.println(m.get("name"));
    }
}