前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >springboot cache 基本使用

springboot cache 基本使用

作者头像
smallmayi
发布2022-05-12 11:24:02
5340
发布2022-05-12 11:24:02
举报
文章被收录于专栏:small专栏small专栏

为什么使用缓存? 比如一个复杂的计算结果,一次数据库访问取得的数据等耗时耗资源的数据就能放入缓存,目的就是为了节省开销,我们要用有限的资源(CPU,内存,带宽等等)尽量做最多的事情。

SpringCache

SpringCache包含两个顶级接口,Cache(缓存)和CacheManager(缓存管理器),顾名思义,用CacheManager去管理一堆Cache。 Springboot中会自动加载一个CacheManager(它有默认的实现类),所以只要写好一个自定义的Cache即可(如果想用系统定义好的或者第三方如RedisCache也行,记得向Spring注册这个bean即可) Cache和CacheManager是怎样做关联的,其实是Spring扫包实现的

凡是继承了Cache接口的类,都会被自动注入进CacheManager中,最终存储于CacheManager的实现类中 接着会生成被@Cacheable(或者其他SpringCache注解修饰过)的代理类,并会将管理它的CacheManager赋值进去

1.依赖

无需依赖,spingboot 已经集成,开启使用就行。 百度结果都是如下依赖,经测试2.2.1和2.0.5 都是开启直接使用

代码语言:javascript
复制
 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
 </dependency>
2.开启缓存

启动类上添加

代码语言:javascript
复制
//开启缓存
@EnableCaching
3.使用

主要注解有四个

三个用于方法注解,必须要有value 或cacheNames 作为命名空间,只能有一个,两个会报错,类似于 Map map = new HashMap();中的小map,key 类似 map.put() 中的key

  • @Cacheable/@CachePut/@CacheEvict
在这里插入图片描述
在这里插入图片描述

参数详解:

参数

作用

value、cacheName

缓存名称,数组类型,至少定义一个,例如:@Cacheable(value=”mycache”)

key

缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:@Cacheable(value=”testcache”,key=”#id”)

keyGenerator

用于指定key生成器,非必需。若需要指定一个自定义的key生成器,我们需要去实现org.springframework.cache.interceptor.KeyGenerator接口,并使用该参数来指定。需要注意的是:该参数与key是互斥的

cacheMnager

用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用

cacheResolver

用于指定使用那个缓存解析器,非必需。需通过

condition

缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存/清除缓存例如:@Cacheable(value=”testcache”,condition=”#userName.length()>2”)

unless

否定缓存。当条件结果为TRUE时,就不会缓存。@Cacheable(value=”testcache”,unless=”#userName.length()>2”)

sync

缓存的同步,在多线程环境下,某些操作可能使用相同参数同步调用。默认情况下,缓存不锁定任何资源,可能导致多次计算,而违反了缓存的目的。对于这些特定的情况,属性 sync 可以指示底层将缓存锁住,使只有一个线程可以进入计算,而其他线程堵塞,直到返回结果更新到缓存中。

allEntries (@CacheEvict )

是否清空所有缓存内容缺省为 false,如果指定为true则方法调用后立即清空所有缓存               例如:@CachEvict(value=”testcache”,allEntries=true)

beforeInvocation (@CacheEvict)

是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存例如:@CachEvict(value=”testcache”,beforeInvocation=true)

使用区别

代码语言:javascript
复制
@Cacheable(cacheNames = "test")
//@CachePut(cacheNames = "test")
//@CacheEvict(value = "test")
public Person cacheableTest() {
    log.info("进入ctrl层Cacheable");
    return cacheService.cacheableTest();
}

@Cacheable,执行到此会检索名为cacheNames的缓存。有则不进入方法,没有则继续进入方法缓存数据。

@CachePut,此注解的方法会直接进入,将更新后数据放入cacheNames的缓存。类似更新操作

@CacheEvict 清除所有缓存

一个类注解

  • @CacheConfig
在这里插入图片描述
在这里插入图片描述

当我们需要缓存的地方越来越多,你可以使用@CacheConfig(cacheNames = {“myCache”})注解来统一指定value的值,这时可省略value,如果你在你的方法依旧写上了value,那么依然以方法的value值为准。 示例:

代码语言:javascript
复制
@CacheConfig(cacheNames = "test")
public class CacheTest {
//类上使用了@CacheConfig,使用方法时可以不指定value或cacheNames
    @GetMapping("/Cacheable")
    @Cacheable
    public Person cacheableTest() {
        log.info("进入ctrl层Cacheable");
        return cacheService.cacheableTest();
    }
}
根据属性自定义key
代码语言:javascript
复制
//1.直接使用参数作为key
@Cacheable(value = "test",key = "#id")
public Person cacheableTest(String id) {}
//2.使用第一个参数作为key,SpEL表达式
@Cacheable(value = "test",key = "#p0")
public Person cacheableTest(String id) {}
//3.使用对象属性为key
@Cacheable(value = "test",key = "#user.id")
public Person cacheableTest(User user) {}
//4.使用第一个参数对象属性为key
@Cacheable(value = "test",key = "#p0.id")
public Person cacheableTest(User user) {}
SpEL表达式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringCache
  • 1.依赖
  • 2.开启缓存
  • 3.使用
  • 根据属性自定义key
  • SpEL表达式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档