发表于: 2020-08-20 23:29:12

1 1391


今天完成的事情:

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在项目中的使用。


返回列表 返回列表
评论

    分享到