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

目录
相关文章
|
1月前
|
缓存 JavaScript 前端开发
Java 如何确保 JS 不被缓存
【10月更文挑战第19天】在 Java 中,可以通过设置 HTTP 响应头来确保 JavaScript 文件不被浏览器缓存。方法包括:1. 使用 Servlet 设置响应头,通过 `doGet` 方法设置 `Expires`、`Cache-Control` 和 `Pragma` 头;2. 在 Spring Boot 中配置拦截器,通过 `NoCacheInterceptor` 类和 `WebConfig` 配置类实现相同功能。这两种方法都能确保每次请求都能获取到最新的 JavaScript 内容。
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
3月前
|
缓存 Java Spring
Java本地高性能缓存实践问题之Caffeine中设置刷新机制的问题如何解决
Java本地高性能缓存实践问题之Caffeine中设置刷新机制的问题如何解决
|
3月前
|
存储 缓存 Java
Java本地高性能缓存实践问题之如何定义Caffeine的缓存
Java本地高性能缓存实践问题之如何定义Caffeine的缓存
|
3月前
|
缓存 Java
Java本地高性能缓存实践问题之Caffeine缓存库中基于时间设置驱逐策略的问题如何解决
Java本地高性能缓存实践问题之Caffeine缓存库中基于时间设置驱逐策略的问题如何解决
|
3月前
|
缓存 Java
Java本地高性能缓存实践问题之AsyncCache中移除一个缓存元素的问题如何解决
Java本地高性能缓存实践问题之AsyncCache中移除一个缓存元素的问题如何解决
|
3月前
|
缓存 Java
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
|
1月前
|
缓存 JavaScript 前端开发
Java 如何确保 JS 不被缓存
大家好,我是 V 哥。本文探讨了 Java 后端确保 JavaScript 不被缓存的问题,分析了文件更新后无法生效、前后端不一致、影响调试与开发及安全问题等场景,并提供了使用版本号、设置 HTTP 响应头、配置静态资源缓存策略和使用 ETag 等解决方案。最后讨论了缓存的合理使用及其平衡方法。
消息中间件 缓存 监控
121 0
|
3月前
|
缓存 NoSQL Java
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常