XMemcached和spring缓存框架集成

在spring项目中 applicationContext.xml中申明


缓存配置随项目启动,交由spring管理生成

spring-xmemcached.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
		<bean id="memcachedClientBuilder" name="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
		    <!-- XMemcachedClientBuilder have two arguments.First is server list,and second is weights array. -->
				<constructor-arg>
						<list>
								<bean class="java.net.InetSocketAddress">
										<constructor-arg>
										    <value>localhost</value>
										</constructor-arg>
										<constructor-arg>
										    <value>11211</value>
										</constructor-arg>
								</bean>
						</list>
				</constructor-arg>
		
				<constructor-arg>
						<list>
						    <value>1</value>
						</list>
				</constructor-arg>
			
			  <property name="connectionPoolSize" value="30"></property>
			  
				<property name="commandFactory">
				    <bean class="net.rubyeye.xmemcached.command.TextCommandFactory"></bean>
				</property>
				
				<property name="sessionLocator">
				    <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
				</property>
				
				<property name="transcoder">
				    <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
				</property>
		</bean>
	 
	 <!-- Use factory bean to build memcached client -->
	 <bean id="memcachedClient" name="memcachedClient" factory-bean="memcachedClientBuilder" factory-method="build" destroy-method="shutdown"/>
</beans>

XMemcachedHelper.java

package xueshenghui.helper.cache;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import xueshenghui.constants.emall.cache.CacheConstant;
import xueshenghui.constants.emall.cache.api3.EmDaixiaoApi3CacheConstant;

import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.exception.MemcachedException;

/**
 * XMemcached 服务器缓存数据
 * 
 * @author Yangyiyong
 *
 */
@Component
public class XMemcachedHelper {
	
	private static Logger logger = Logger.getLogger(XMemcachedHelper.class);

	private static final int defaultWeight = 0;													//	默认权重
	
	private MemcachedClient client ;
	
	public MemcachedClient getClient() {
		return client;
	}

	public void setClient(MemcachedClient client) {
		this.client = client;
	}

	private static final Map<String, String> keyMap = new HashMap<String, String>();			//	可存储的key值
	
	static {
		Field[] fields01 = CacheConstant.class.getDeclaredFields();
		if(null != fields01 && fields01.length > 0){
			for(Field field : fields01){
				keyMap.put(field.getName(), null);
			}
		}
		
		Field[] fields02 = EmDaixiaoApi3CacheConstant.class.getDeclaredFields();
		if(null != fields02 && fields02.length > 0){
			for(Field field : fields02){
				keyMap.put(field.getName(), null);
			}
		}
		
	}
	
	/**
	 * 校验状态
	 * 
	 * @return
	 */
	private boolean checkClientStatus(){
		boolean flag = false;
		if(null != client && !client.isShutdown()){
			flag = true;
		}
		return flag;
	}
	
	/**
	 * 校验是否存在key值
	 * 
	 * @param key
	 * @return
	 */
	private boolean checkKey(String key){
		return keyMap.containsKey(key);
	}
	
	/**
	 * flushAll 清空所有,请谨慎使用
	 * 
	 */
	public void flushAll(){
		if(checkClientStatus()){
			try {
				client.flushAll();
			} catch (TimeoutException e) {
				logger.error("TimeoutException flushAll :".concat(e.getMessage()));
			} catch (InterruptedException e) {
				logger.error("InterruptedException flushAll :".concat(e.getMessage()));
			} catch (MemcachedException e) {
				logger.error("MemcachedException flushAll :".concat(e.getMessage()));
			}
		}
	}
	
	/**
	 * 删除某个key
	 * 
	 * @param key
	 * @return
	 */
	public boolean deleteKey(String key){
		boolean flag = false;
		if(checkClientStatus() && checkKey(key)){
			try {
				flag = client.delete(key);
			} catch (TimeoutException e) {
				logger.error("TimeoutException deleteKey key=".concat(key).concat(" :").concat(e.getMessage()));
			} catch (InterruptedException e) {
				logger.error("InterruptedException deleteKey key=".concat(key).concat(" :").concat(e.getMessage()));
			} catch (MemcachedException e) {
				logger.error("MemcachedException deleteKey key=".concat(key).concat(" :").concat(e.getMessage()));
			}
		}
		return flag;
	}
	
	/**
	 * 存储值
	 * 
	 * @param key
	 * @param val
	 * @return
	 */
	public boolean setVal(String key , Object val){
		boolean flag = false;
		if(checkClientStatus() && checkKey(key) && null != val){
			try {
				Object obj = client.get(key);
				if(null == obj){
					flag = client.set(key, defaultWeight, val);
				}else{
					flag = client.replace(key, defaultWeight, val);
				}
			} catch (TimeoutException e) {
				logger.error("TimeoutException setVal key=".concat(key).concat(" :").concat(e.getMessage()));
			} catch (InterruptedException e) {
				logger.error("InterruptedException setVal key=".concat(key).concat(" :").concat(e.getMessage()));
			} catch (MemcachedException e) {
				logger.error("MemcachedException setVal key=".concat(key).concat(" :").concat(e.getMessage()));
			}
		}
		return flag;
	}
	
	/**
	 * 获取值
	 * 
	 * @param key
	 * @return
	 */
	public Object getVal(String key){
		if(checkClientStatus() && checkKey(key)){
			try {
				return client.get(key);
			} catch (TimeoutException e) {
				logger.error("TimeoutException getVal key=".concat(key).concat(" :").concat(e.getMessage()));
			} catch (InterruptedException e) {
				logger.error("InterruptedException getVal key=".concat(key).concat(" :").concat(e.getMessage()));
			} catch (MemcachedException e) {
				logger.error("MemcachedException getVal key=".concat(key).concat(" :").concat(e.getMessage()));
			}
		}
		return null;
	}
	
}


在spring中使用 @Cacheable实现缓存

将数据放入缓存    @Cacheable(value = "employee")



java代码如下 
Java代码   收藏代码
  1. MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("10.10.1.1:11211 10.10.1.2:11211"));  
  2.  MemcachedClient memcachedClient = builder.build();  


但是上一段代码,如何用spring初始化呢? 
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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"  
  3.     xsi:schemaLocation="  
  4. http://www.springframework.org/schema/beans   
  5. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
  6. http://www.springframework.org/schema/context   
  7. http://www.springframework.org/schema/context/spring-context-3.2.xsd   
  8. http://www.springframework.org/schema/tx   
  9. http://www.springframework.org/schema/tx/spring-tx-3.2.xsd   
  10. http://www.springframework.org/schema/aop    
  11. http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">  
  12.     <!-- 配置文件 -->  
  13.     <bean id="configproperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
  14.         <property name="locations">  
  15.             <list>  
  16.                 <value>classpath:application.properties</value>  
  17.             </list>  
  18.         </property>  
  19.     </bean>  
  20.     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">  
  21.         <property name="properties" ref="configproperties" />  
  22.     </bean>  
  23.     <!-- memcached初始化 -->  
  24.     <bean id="builder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">  
  25.         <constructor-arg>  
  26.             <bean class="net.rubyeye.xmemcached.utils.AddrUtil" factory-method="getAddresses">  
  27.                 <constructor-arg value="${memached.host}" />  
  28.             </bean>  
  29.         </constructor-arg>  
  30.     </bean>  
  31.     <bean id="memcachedClient" class="net.rubyeye.xmemcached.MemcachedClient" factory-bean="builder" factory-method="build" destroy-method="shutdown" />  
  32. </beans>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 <bean name="factoryMemcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> <property name="servers"> <value>${XMemcached_servers}</value> </property> <!-- server's weights --> <property name="weights"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> <!-- nio connection pool size --> <property name="connectionPoolSize" value="${XMemcached_connectionPoolSize}"></property> <!-- Use binary protocol,default is TextCommandFactory, BinaryCommandFactory KestrelCommandFactory --> <property name="commandFactory"> <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"></bean> </property> <!-- Distributed strategy KetamaMemcachedSessionLocator--> <property name="sessionLocator"> <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean> </property> <!-- Serializing transcoder --> <property name="transcoder"> <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" /> </property> <!-- ByteBuffer allocator --> <property name="bufferAllocator"> <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"></bean> </property> </bean> <bean id="cachingClient" class="com.dmx.cache.caching.impl.CachingXMemcachedClient" init-method="init" destroy-method="destroy"> <property name="memcachedClient" ref="factoryMemcachedClient" /> <property name="isflushAll" value="${XMemcached_isflushAll}" /> </bean> <bean id="cachingManager" class="com.dmx.cache.caching.impl.CachingManagerImpl"> <property name="cachingClient" ref="cachingClient" /> </bean> <bean id="cacheBeforeAdvice" class="com.dmx.cache.interceptor.advice.CacheBeforeAdvice"></bean> <bean id="cacheAfterAdvice" class="com.dmx.cache.interceptor.advice.CacheAfterAdvice"></bean> <bean id="cacheInterceptor" class="com.dmx.cache.interceptor.CacheInterceptor"> <property name="cachingManager" ref="cachingManager" /> <property name="cacheAttributes"> <props> <prop key="save*">update</prop> <prop key="remove*">update</prop> <prop key="add*">update</prop> <prop key="del*">update</prop> <prop key="get*">readOnly</prop> <prop key="getPlaybill">readOnly=10</prop> </props> </property> </bean> <bean id="cacheProxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="interceptorNames"> <list> <value>cacheBeforeAdvice</value> <value>cacheAfterAdvice</value> <value>cacheInterceptor</value> </list> </property> </bean> <bean id="demoDao" parent="cacheProxyFactoryBean"> <property name="target" ref="demoDaotarget" /> </bean>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值