缓存技术之第一次亲密接触

     之前听说缓存,因为没有深入了解过,所以感觉挺深奥的样子,只知道hibernate内嵌了缓存技术,他能加快查询的速度,没有真正自己写过。今天有一个计算保费的接口,因为计算所涉及到的固定参数比较多,每次请求都先获取参数,再要计算,计算逻辑倒不复杂。先前把它存进了数据库,因为需要多次查询数据库,导致计算速度比较慢,用户抱怨,所以需要优化一下,降低查询的时间。好了背景就交代这么多吧,开始看看缓存怎么使用吧!

第一步,建立一个面向切面的拦截处理类,把保费计算的接口都拦截

package com.travelsky.umetrip.insure.util.common;


import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import cn.co.msky.core.cache.memcache.MemCacheWrap;

/**
 * @author murong
 * @version 创建时间:2014-12-12 下午2:13:07 
 * memCache缓存处理
 */
@Aspect
@Component
public class CacheInterceptor {
	/**
	 * @Pointcut :表示规定切入点 execution() 语法规范 第一个“*”表示任意返回结果类型
	 *           “cn.itcast.service.impl.PersonServiceBean”:表示对此类进行拦截,
	 *           如果是cn.itcast.service..*.*:表示对包cn.itcast.service以及子包里所
	 *           有的类的所有方法进行拦截, (..)表示拦截方法的参数
	 */

	@SuppressWarnings("unused")
	@Pointcut("execution(* com.travelsky.umetrip.insure.dao.premium.impl.PremiumDaoImpl.*(..))")
	private void anyMethod() {
	}// 声明一个切入点

	@Around("anyMethod()")
	public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
		String open = PropertiesLoader.load("cache_open");
		
		Object obj = null;
              //读取缓存状态参数,如果为开启状态
		if (!StringUtils.isBlank(open) && "true".equals(open)) {
			try {
				Object target = pjp.getTarget();
				String key = getObjectKey(pjp);
				int cacheTime = getCacheTime(pjp);
				Object memCacheGet = MemCacheWrap.MemCacheGet(key);
				LogUtil.info(this.getClass(), "get key="+key+" value="+memCacheGet);
				if(memCacheGet == null)
				{
					obj = pjp.proceed();
					MemCacheWrap.MemCachePut(key, obj, cacheTime);
					Object memCacheG = MemCacheWrap.MemCacheGet(key);
					LogUtil.info(this.getClass(), "get key="+key+" value="+memCacheG);
					LogUtil.info(this.getClass(), "put key="+key+" value="+obj);
				}else {
					obj = memCacheGet;
				}
			} catch (Exception e) {
				LogUtil.error(this.getClass(), "memcache doBasicProfiling Exception!" + pjp,e);
			}			
		}else {
			obj = pjp.proceed();
		}
		return obj;
	}

	private String getObjectKey(ProceedingJoinPoint pjp) {
		// TODO Auto-generated method stub
		String project = "UmetripInsure";
		String key = "";
		Object target = pjp.getTarget();
		String className = pjp.getTarget().getClass().getSimpleName();
		String methodName = pjp.getSignature().getName();

		Object[] args = pjp.getArgs();
		key = project + "$"+className+"$"+methodName+"$"+PropertiesLoader.paraToString(args);
		return key;
}

private int getCacheTime(ProceedingJoinPoint pjp){
	String className = pjp.getTarget().getClass().getSimpleName();
	String methodName = pjp.getSignature().getName();
	String key = className+"_"+methodName+"_cachetime";
	String cachetime =PropertiesLoader.load(key);
	if (cachetime == null) {
		cachetime =PropertiesLoader.load("default_cachetime");
	}
	return Integer.parseInt(cachetime);
}
}

把当前的类配置到xml的bean里,这个就不贴代码了。

 

第二步,在配置文件里添加配置的memcached.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<memcached>  
    <!-- one -->
    <client name="mskymemcache1" compressEnable="true" defaultEncoding="UTF-8" socketpool="pool0">
        <errorHandler>com.alisoft.xplatform.asf.cache.memcached.MemcachedErrorHandler</errorHandler>
    </client>
    <client name="mskymemcache1bk" compressEnable="true" defaultEncoding="UTF-8" socketpool="pool0bk">
        <errorHandler>com.alisoft.xplatform.asf.cache.memcached.MemcachedErrorHandler</errorHandler>
    </client>
    <socketpool name="pool0" failover="true" initConn="5" minConn="5" maxConn="250" maintSleep="0"
        nagle="false" socketTO="3000" aliveCheck="true">
         <servers>122.119.120.15:11211</servers>
    </socketpool>
    <socketpool name="pool0bk" failover="true" initConn="5" minConn="5" maxConn="250" maintSleep="0"
        nagle="false" socketTO="3000" aliveCheck="true">
         <servers>122.119.120.16:11211</servers> 
    </socketpool>  
      <cluster name="cluster1" mode="standby">//mode = active,standby
        <memCachedClients>mskymemcache1,mskymemcache1bk</memCachedClients>
    </cluster>
    
    <!-- two -->
    
    <client name="mskymemcache2" compressEnable="true" defaultEncoding="UTF-8" socketpool="pool2">
        <errorHandler>com.alisoft.xplatform.asf.cache.memcached.MemcachedErrorHandler</errorHandler>
    </client>
    <client name="mskymemcache2bk" compressEnable="true" defaultEncoding="UTF-8" socketpool="pool2bk">
        <errorHandler>com.alisoft.xplatform.asf.cache.memcached.MemcachedErrorHandler</errorHandler>
    </client>
    
    <socketpool name="pool2" failover="true" initConn="5" minConn="5" maxConn="250" maintSleep="0"
        nagle="false" socketTO="3000" aliveCheck="true">
        <servers>122.101.120.15:1111</servers> 
    </socketpool>
    <socketpool name="pool2bk" failover="true" initConn="5" minConn="5" maxConn="250" maintSleep="0"
        nagle="false" socketTO="3000" aliveCheck="true">
         <servers>122.101.120.16:1111</servers> 
    </socketpool> 
    <cluster name="cluster2" mode="standby">//mode = active,standby
        <memCachedClients>mskymemcache2, mskymemcache2bk</memCachedClients>
    </cluster>
</memcached>

第三步,在你的properties文件中添加两个配置

cache_open=true<span style="font-family:Microsoft YaHei;">//是否开启缓存</span>
default_cachetime=86400<span style="font-family:Microsoft YaHei;">//缓存保存的时间(单位:秒)</span>


缓存技术就大功告成了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值