发表于: 2020-08-20 23:29:12
1 1392
今天完成的事情:
1.memcache在项目中的使用。
先测学生页面这个请求看看加缓存的效果。
线程组配置
无缓存:
有缓存:
差距还是非常大的。
根据网上的教程自定义注解,然后用aop加缓存
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface CacheResult {
//实际缓存的key
String key();
//过期时间
int expireSecond() default -1;
}
@Aspect
@Component
public class CacheResultAdvice {
private MemCachedClient memCachedClient = MemcacshedUtil.getMemacache();
@Pointcut("@annotation(com.jnshu.Util.CacheResult)")
public void cacheResult() {
}
@Around("cacheResult()")
public Object aroundCacheResult(ProceedingJoinPoint pjp) throws Throwable {
Method method = getCurrentMethod(pjp);
Annotation annotation = getMethodAnnotation(method, CacheResult.class);
String key = (String) quitGetFromAnnotation("key", annotation);
int expireSecond = (int) quitGetFromAnnotation("expireSecond", annotation);
Object obj = getCache(key);
if (obj != null) {
return obj;
}
obj = pjp.proceed();
setCache(key, obj, expireSecond);
return obj;
}
private Object getCache(String key) {
Object object = null;
if (StringUtils.isBlank(key)) {
return null;
}
object = memCachedClient.get(key);
return object;
}
private void setCache(String key, Object value, int expiry) {
memCachedClient.add(key, value, expiry);
}
private Object quitGetFromAnnotation(String methodName, Annotation annotation) {
if (annotation == null) {
return null;
}
try {
return annotation.annotationType().getDeclaredMethod(methodName).invoke(annotation);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private Method getCurrentMethod(ProceedingJoinPoint pjp) throws Throwable {
Signature sig = pjp.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Object target = pjp.getTarget();
Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
return currentMethod;
}
@SuppressWarnings({"unchecked", "rawtypes"})
protected Annotation getMethodAnnotation(Method method, Class annotationClass) {
return method.getAnnotation(annotationClass);
}
}
@Override
@CacheResult(key = "studentKey",expireSecond = 180)
public List<Student> selectAll() {
System.out.println("实际调用方法开始");
List<Student> studentList=studentMapper.selectAll();
System.out.println("实际调用方法结束");
return studentList;
}
第一次查询
第二次查询:
可以看到第二次查询时,是直接返回缓存中的数据。
自定义注解和aop的相关知识明天了解一下,今天就先用用。
明天计划的事情:
了解自定义注解原理,和aop相关知识。
学习看tps图,了解压测应该看哪些指标。
使用redis上缓存。
遇到的问题:
还不会看压测的性能指标。
收获:
memcach在项目中的使用。
评论