首页 > 其他分享 >通过注解实现本地缓存caffeine的学习

通过注解实现本地缓存caffeine的学习

时间:2024-02-16 14:44:44浏览次数:36  
标签:缓存 object caffeine annotation key 注解 id

注解源码如下

1 @Target(ElementType.METHOD)
2 @Retention(RetensionPolicy.RUNTIME)
3 @Documented
4 public @interface RvcCache{
5       Strng key();
6       String id() default StringUtils.EMPTY;
7 }    
 1 @Component
 2 @Aspect
 3 @RequiredArgsConstructor
 4 public class RvcCacheAspect {
 5 
 6     private final CacheUtils cacheUtils;
 7 
 8     private final UserLogUtils userLogUtils;  
 9     /**
10      *  @Around为环绕advice(增强),被RvcCache注解的方法为切入点Pointcut
11      * 使用ProceedingJoinPoint类型作为环绕增强型方法的参数,用于调用被增强的方法
12      * 在以下代码实例中就是获取key和id的值,以及被增强方法return的数据
13      */
14    @Around("@annotation(rvc.core.cache.annotation.RvcCache)")
15     public Object doAround(ProceedingJoinPoint point) throws Throwable {
16         MethodSignature signature = (MethodSignature)point.getSignature();
17         Method method = signature.getMethod();
18         RvcCache annotation = method.getAnnotation(RvcCache.class);
19         //获取key和id
20         String realKey = annotation.key();
21         if (StringUtils.isNotEmpty(annotation.id())) {
22             //拼接解析springEl表达式的map
23             //简单理解这段代码就是将springEl表达式的id值解析成正确的值
24             String[] paramNames = signature.getParameterNames();
25             Object[] args = point.getArgs();
26             TreeMap<String, Object> treeMap = new TreeMap<>();
27             for (int i = 0; i < paramNames.length; i++) {
28                 treeMap.put(paramNames[i], args[i]);
29             }
30             String elResult = ElStringUtils.parse(annotation.id(), treeMap);
31             //id值可为空,如果为空,则缓存对象cache的key为注解的key值,如果不为空,则缓存对象的key为注解"key.id"
32             realKey = annotation.key() + "." + elResult;
33         }
34         //内部方法,获取当前key的值,内部的存储结构为ConcurrentHashMap(Integer, Cache<String, Object>);
35         //Integer为本地缓存的存活时间,自定义的时间,Cache为缓存的对象(内部的缓存工具通过Caffeine.newBuilder().expireAfterWrite(expireTime, TimeUnit.HOURS)来设置存活时间)    
36         //也就是说相同存活时间的缓存对象在同一个map下
37         Cache<String, Object> cache = cacheUtils.getManualCache(realKey);
38         //读写,查询Caffeine,根据处理的key查询,查到则直接返回数据
39         Object object = cache.getIfPresent(realKey);
40         if (Objects.nonNull(object)) {
41             return object;
42         }
43         //没有查询到则获取当前被注解方法执行完后return的数据,并判断这个数据是正确返回的(无异常、无报错)后写入Caffeine,
44         object = point.proceed();
45         if (object instanceof RetParamBase) {
46             RetParamBase ret = (RetParamBase)object;
47             if (!ret.isSucceed()) {
48                 return ret;
49             }
50             //写入Caffeine
51             cache.put(realKey, object);
52         }
53         return object;
54     }
55 }

先弄明白几个概念:

springEl表达式:一种强大,简洁的装配Bean的方式,他可以通过运行期间执行的表达式将值装配到我们的属性或构造函数当中,更可以调用JDK中提供的静态常量,获取外部Properties文件中的的配置。在上述注解中id的值可以通过以下方式获取

 

标签:缓存,object,caffeine,annotation,key,注解,id
From: https://www.cnblogs.com/zeevy/p/18017128

相关文章

  • 【性能测试】MYSQL缓存命中率03
    一、查询缓存(querycache) 缓存命中率:所有的查询语句,命中缓存的请求数,占所有请求数的比例查看是否开启缓存命中率#缓存的开关showvariableslike'%query_cache_type%';#缓存的大小showvariableslike'%query_cache_size%';开启缓存设置MySQL的配置文件my......
  • dotnet aspnet redis 缓存 分布式缓存
    分布式缓存\appsettings.Development.json{"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warning"}}}分布式缓存\appsettings.json{"Logg......
  • 力扣链表 哈希表 之 146. LRU 缓存
    请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intvalue) ......
  • [spring] spring学习笔记(3): 通过注解实现依赖注入
    注解Annotation注解是代码中的一种特殊标记,java中的格式为@Anno_Name(pro=value)注解可以被使用在方法,类和属性上;在spring中,使用注解来实现自动装配,可以简化Bean的配置,基本步骤如下:引入依赖开启组件扫描使用注解定义Bean注入依赖引入依赖在新建的spring项目下的src/main......
  • 7.读写配置文件和添加缓存
    感觉没什么好总结的,直接上代码吧:配置文件:1添加一个枚举///<summary>///配置键名///</summary>publicenumConfigKey{///<summary>///系统配置///</summary>SystemConfig,///<summary>......
  • @RestController和@Controller注解
     @RestController和@Controller是Spring框架中用于定义控制器的两个注解; @RestConteroller注解:@RestController是@Controller的特殊形式,是用于创建RESTfulWeb服务的控制器类,而非传统的Web形式;控制器方法使用@RequstMapping或其他衍生注解来映射url路径,这些数据返回......
  • Spring Boot 集成 Redisson分布式锁(注解版)
    转载自:https://blog.csdn.net/Ascend1977/article/details/131126047        Redisson是一种基于Redis的Java驻留集群的分布式对象和服务库,可以为我们提供丰富的分布式锁和线程安全集合的实现。在SpringBoot应用程序中使用Redisson可以方便地实现分布式应用......
  • JUnit 5 注解总结与解析
    前言大家好,我是chowley,通过前篇的JUnit实践,我对这个框架产生了好奇,除了断言判断,它还有哪些用处呢?下面来总结一下它的常见注解及作用。正文在Java单元测试中,JUnit是一种常用的测试框架,它提供了丰富的注解用于标识测试方法、设置测试环境以及控制测试执行流程。除了用于断言判断之......
  • MyBatis缓存
    MyBatis缓存缓存就是内存中的数据,常常来自对数据库查询结果的保存,使用缓存,我们可以避免频繁的与数据进行交互,进而提高响应速度。MyBatis也提供两种缓存模式,分为一级缓存和二级缓存。优点:提供查询效率减少频繁进行I/O操作,从而减少数据库的压力。适合存放缓存的数据:【1】查询频......
  • 【Spring】- 自动注入注解
    【@Autowired】冷知识:@AutowiredprivateMovieCatalog[]movieCatalogs;//根据类型注入全部的bean对象数组@AutowiredprivateSet<MovieCatalog>movieCatalogs;//根据类型注入全部的bean对象集合@AutowiredprivateMap<String,MovieCatalog>movieCatalogs;//根据类型注......