统一缓存处理
为什么要做缓存处理?
内存的访问速度 远远大于 磁盘的访问速度 (1000倍起)
<!--md5加密--> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency> <!--redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.5.3</version> </dependency>
import java.lang.annotation.*; @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Cache { long expire() default 1 * 60 * 1000; String name() default ""; }
import com.alibaba.fastjson.JSON; import com.mszlu.blog.vo.Result; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.AliasFor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.lang.reflect.Method; import java.time.Duration; @Aspect @Component @Slf4j public class CacheAspect { @Autowired private RedisTemplate<String, String> redisTemplate; @Pointcut("@annotation(com.mszlu.blog.common.cache.Cache)") public void pt(){} @Around("pt()") public Object around(ProceedingJoinPoint pjp){ try { Signature signature = pjp.getSignature(); //类名 String className = pjp.getTarget().getClass().getSimpleName(); //调用的方法名 String methodName = signature.getName(); Class[] parameterTypes = new Class[pjp.getArgs().length]; Object[] args = pjp.getArgs(); //参数 String params = ""; for(int i=0; i<args.length; i++) { if(args[i] != null) { params += JSON.toJSONString(args[i]); parameterTypes[i] = args[i].getClass(); }else { parameterTypes[i] = null; } } if (StringUtils.isNotEmpty(params)) { //加密 以防出现key过长以及字符转义获取不到的情况 params = DigestUtils.md5Hex(params); } Method method = pjp.getSignature().getDeclaringType().getMethod(methodName, parameterTypes); //获取Cache注解 Cache annotation = method.getAnnotation(Cache.class); //缓存过期时间 long expire = annotation.expire(); //缓存名称 String name = annotation.name(); //先从redis获取 String redisKey = name + "::" + className+"::"+methodName+"::"+params; String redisValue = redisTemplate.opsForValue().get(redisKey); if (StringUtils.isNotEmpty(redisValue)){ log.info("走了缓存~~~,{},{}",className,methodName); return JSON.parseObject(redisValue, Result.class); } Object proceed = pjp.proceed(); redisTemplate.opsForValue().set(redisKey,JSON.toJSONString(proceed), Duration.ofMillis(expire)); log.info("存入缓存~~~ {},{}",className,methodName); return proceed; } catch (Throwable throwable) { throwable.printStackTrace(); } return Result.fail(-999,"系统错误"); } }
使用
@PostMapping("hot") @Cache(expire = 5 * 60 * 1000,name = "hot_article") public Result hotArticle(){ int limit = 5; return articleService.hotArticle(limit); }
一起学java 文章被收录于专栏
分享平时学习心得及见解,还有学习笔记