Java--SpringBoot-24-内置缓存CacheManager

简介: 今天来看一下SpringBoot的内置缓存CacheManager怎么使用!

今天来看一下SpringBoot的内置缓存CacheManager怎么使用!

直接上代码:

一、先建立个dao层模仿查询数据库:

packagecom.xing.studyboot.rest.dao.impl;
importorg.springframework.stereotype.Service;
importcom.xing.studyboot.rest.dao.CommonDao;
@ServicepublicclassCommonDaoImplimplementsCommonDao {
@OverridepublicStringget() {
return"ok!奥里给";
  }
}


二、建个Service调用dao

@Cacheable("cache")
@OverridepublicStringgetCache() {
System.out.println("调用getCache开始");
Stringres=commonDao.get();
System.out.println("调用getCache结束"+res);
returnres;
}

三、在Controller中发布一个接口来访问

packagecom.xing.studyboot.rest.controller;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importcom.xing.studyboot.rest.service.CommonService;
@RestController@RequestMapping("/cache")
publicclassCacheController {
@AutowiredCommonServicecommonService;
@RequestMapping("/get")
publicStringgetName() {
Stringres=commonService.getCache();
return"缓存-》"+res;
  }
}

四、在启动类添加@EnableCaching注解来启用缓存

packagecom.xing.studyboot;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cache.annotation.EnableCaching;
importcom.xing.studyboot.config.MyBanner;
@SpringBootApplication@EnableCachingpublicclassStudybootApplication {
publicstaticvoidmain(String[] args) {
SpringApplicationspringApplication=newSpringApplication(StudybootApplication.class);
springApplication.run(args);
  }
}


访问一下:

image.png

image.png


       第一次访问,发现控制台打印调用了Service中的方法,输出了开始结束过程。再次刷新访问,发现并没有继续输出,但是页面却正常的返回了数据。说明缓存使用成功了!

       我重新启动服务,发现缓存竟然没有消失,同样没有执行Service中的方法就返回了数据,我们来添加一个配置类来指定一下缓存的存储位置:

packagecom.xing.studyboot.config.redis;
importjava.util.Arrays;
importorg.springframework.cache.CacheManager;
importorg.springframework.cache.concurrent.ConcurrentMapCache;
importorg.springframework.cache.support.SimpleCacheManager;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
/***  配置一个简单的缓存,指定缓存位置* @author xing* @createTime*/@ConfigurationpublicclassCacheManagerConfig {
@BeanpublicCacheManagercacheManager() {
SimpleCacheManagercacheManager=newSimpleCacheManager();
cacheManager.setCaches(Arrays.asList(newConcurrentMapCache("sampleCacheTest")));
cacheManager.afterPropertiesSet();
returncacheManager;
    }
}


       现在指定缓存到一个叫 sampleCacheTest 的ConcurrentMapCache对象中,再次访问突然报错,原来是在方法上的@Cacheable("sampleCacheTest")注解,这里应该指定存到sampleCacheTest 。

       这样每次重新启动后,就会清空sampleCacheTest 对象中的缓存啦。

打开注解源码发现很多熟悉的东西哈:

image.png

搜了点几个注解的说明:

1.@CacheableCacheManager管理多个Cache组件的,对缓存的真正CRUD操作在Cache组件中,每一个缓存组件有自己唯一一个名字cacheNames/value: 指定缓存组件的名字(缓存到哪个缓存组件中)key:缓存数据使用的key;可以用它来指定。默认是使用方法参数的值,1-方法的返回值编写SpEl;#id;参数id的值#a0#p0#root.args[0]
keyGenerator:key的生成器;可以自己指定key的生成器的组件id(可以自定义一个KeyGenerator,然后注册到容器中)(下一篇运行流程原理会测试)key/keyGenerator:二选一使用cacheManager:指定缓存管理器;或者cacheResolver指定获取解析器(后面单独有一篇写这个的)condition:指定符合条件的情况下才缓存condition="#id > 1":id大于1才进行缓存unless:否定缓存/排除条件;当unless指定的条件为true,方法的返回值就不会被缓存;可以获取到结果并进行判断unless="#result == null"unless="#id == 2" : id等于2就不缓存(如果满足condition也满足unless,以unless的为准)sync:是否同步;在多线程环境下,某些操作可能使用相同参数同步调用。默认情况下(默认不同步,也就是异步),缓存不锁定任何资源,可能导致多次计算,而违反了缓存的目的。对于这些特定的情况,属性sync可以指示底层将缓存锁住,使只有一个线程可以进入计算,而其他线程堵塞,直到返回结果更新到缓存中。2.@CachePut先调用目标方法(目标方法一定会被执行)将方法的返回值存到缓存中3.@CacheEvict删除缓存中的数据key:指定要删除的keyallEntries:是否删除该缓存组件中的所有缓存(默认false)beforeInvocation:是否在目标方法执行之前清除缓存默认false:在目标方法执行之后清除缓存;如果目标方法执行时出错了就不会清除缓存了beforeInvocation=true:在目标方法执行之前清除缓存;不管目标方法出错与否都会清除缓存4.@Caching属性是缓存注解的集合,因此可以配置复杂的缓存配置例如:@Caching(
cacheable= {
@Cacheable(cacheNames="emp", key="#lastName")
  },
put= {
@CachePut(cacheNames="emp", key="#result.id")
  }
)
5.CacheConfig标注在类上,抽取每个方法中相同的属性,这里只要定义一次就ok,以cacheNames为例@CacheConfig(cacheNames="emp")
@ServicepublicclassEmployeeService {}


总结:

       项目中一般都使用缓存中间件,比如redis等。


END

目录
相关文章
|
4天前
|
缓存 Java
java开发常用模块——缓存模块
java开发常用模块——缓存模块
|
4天前
|
缓存 Java
【JAVA】基于Guava实现本地缓存
【JAVA】基于Guava实现本地缓存
33 0
|
4天前
|
缓存 算法 Java
Caffeine Cache~高性能 Java 本地缓存之王
Caffeine Cache~高性能 Java 本地缓存之王
87 1
|
4天前
|
缓存 Java
JAVA带缓存的输入输出流
JAVA带缓存的输入输出流
22 0
|
5月前
|
缓存 NoSQL Java
Java项目启动时先加载某些方法可用于redis缓存预热
Java项目启动时先加载某些方法可用于redis缓存预热
67 0
|
4天前
|
存储 缓存 NoSQL
在Java中实现redis缓存中的布隆过滤器
在Java中实现redis缓存中的布隆过滤器
38 0
|
3天前
|
缓存 安全 Java
7张图带你轻松理解Java 线程安全,java缓存机制面试
7张图带你轻松理解Java 线程安全,java缓存机制面试
|
3天前
|
缓存 算法 Java
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
|
4天前
|
缓存 算法 Java
Java本地高性能缓存实践
本篇博文将首先介绍常见的本地缓存技术,对本地缓存有个大概的了解;其次介绍本地缓存中号称性能最好的Cache,可以探讨看看到底有多好?怎么做到这么好?最后通过几个实战样例,在日常工作中应用高性能的本地缓存。
|
4天前
|
存储 缓存 监控
构建高效的Java缓存策略
【4月更文挑战第18天】本文探讨了如何构建高效的Java缓存策略,强调缓存可提升系统响应和吞吐量。关键因素包括缓存位置、粒度、失效与更新策略、并发管理、序列化及选择合适库(如Ehcache、Guava Cache、Caffeine)。最佳实践包括明确需求、选择合适解决方案、监控调整及避免常见陷阱。缓存优化是一个持续过程,需根据需求变化不断优化。