之前听说缓存,因为没有深入了解过,所以感觉挺深奥的样子,只知道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>
缓存技术就大功告成了。