当前位置:网站首页>缓存技术之第一次亲密接触
缓存技术之第一次亲密接触
2022-06-26 00:15:00 【慕容田雨】
之前听说缓存,因为没有深入了解过,所以感觉挺深奥的样子,只知道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>
缓存技术就大功告成了。
边栏推荐
- recvmsg & sendmsg
- 影响个人成长的三个因素
- GUN make (1) 简介
- 元素定位的八大法则
- web测试
- Textcnn paper Interpretation -- revolutionary neural networks for sense classification
- 反向输出一个整数
- JQ 自定义属性取值
- Sweet girl lisixia was invited to be the little host of the global finals of the sixth season perfect child model
- 甜酷少女金书伊 受邀担任第六季完美童模全球总决赛代言人
猜你喜欢

Postman断言对应脚本的解释

recvmsg & sendmsg

Log4j2 vulnerability

Redis7.0的安装步骤

Pre ++, post ++ and pre -- and post -- (+a, a++ and --a, a--)

What happens from entering a web address in the browser's input box to seeing the contents of the web page?

recvmsg & sendmsg

Pixel6 unlock bootloader

Basic concepts of machine learning

biggan:large scale gan training for high fidelity natural image synthesis
随机推荐
Energetic girl wangyujie was invited to be the spokesperson for the global finals of the sixth season perfect children's model
Talking about interface test (I)
Log4j2 vulnerability
前置++,后置++与前置--与后置--(++a,a++与--a,a--)
记录一个诡异的图片上传问题
How to add a "security lock" to the mobile office of government and enterprises?
Eight principles of element positioning
Redis7.0 installation steps
User unlock status query
Redis7.0的安装步骤
cyclegan:unpaired image-to-image translation using cycle-consistent adversarial network
Rollback Protection
Differences and functions of export set env in makefile
关于strlen与sizeof的区别
Theoretical speed calculation method of WiFi
求n乘阶之和
元素定位的八大法则
buffer
Forgotten Jieba participle
regular expression