springboot cache 基本使用

为什么使用缓存?
比如一个复杂的计算结果,一次数据库访问取得的数据等耗时耗资源的数据就能放入缓存,目的就是为了节省开销,我们要用有限的资源(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 都是开启直接使用

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
 </dependency>
2.开启缓存

启动类上添加

//开启缓存
@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)

使用区别

@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值为准。
示例:

@CacheConfig(cacheNames = "test")
public class CacheTest {
//类上使用了@CacheConfig,使用方法时可以不指定value或cacheNames
    @GetMapping("/Cacheable")
    @Cacheable
    public Person cacheableTest() {
        log.info("进入ctrl层Cacheable");
        return cacheService.cacheableTest();
    }
}
根据属性自定义key
//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表达式

在这里插入图片描述
在这里插入图片描述

参考:
最全的Spring Boot Cache使用与整合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值