SpringBoot缓存注解说明

博客围绕Spring Boot展开,介绍了几个重要概念和缓存注解,详细讲解了@Cacheable、@CachePut、@CacheEvict主要的参数,还阐述了缓存中SpEL表达式的用法。

一、个重要概念&缓存注解

Cache

缓存接口,定义缓存操作。实现有:RedisCacheEhCacheCacheConcurrentMapCache

CacheManager

缓存管理器,管理各种缓存(Cache)组件

@Cacheable

主要针对方法配置,能够根据方法的请求参数对其结果进行缓存

@CacheEvict

清空缓存

@CachePut

保证方法被调用,又希望结果被缓存。

@EnableCaching

开启基于注解的缓存

keyGenerator

缓存数据时key生成策略

serialize

缓存数据时value序列化策略

二、@Cacheable/@CachePut/@CacheEvict 主要的参数

@Cacheable/@CachePut/@CacheEvict 主要的参数

value

缓存的名称,在 spring 配置文件中定义,必须指定至少一个

例如:
@Cacheable(value=”mycache”) 或者 
@Cacheable(value={”cache1”,”cache2”}

key

 

缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合

例如:
@Cacheable(value=”testcache”,key=”#userName”)

condition

缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存/清除缓存,在调用方法之前之后都能判断

例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)

allEntries

(@CacheEvict )

是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存

例如:
@CachEvict(value=”testcache”,allEntries=true)

beforeInvocation

(@CacheEvict)

是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存

例如:

@CachEvict(value=”testcache”beforeInvocation=true)

unless

(@CachePut)

(@Cacheable)

用于否决缓存的,不像condition,该表达式只在方法执行之后判断,此时可以拿到返回值result进行判断。条件为true不会缓存,fasle才缓存

例如:
@Cacheable(value=”testcache”,unless=”#result == null”)

三、缓存中SpEL表达式用法

名字

位置

描述

示例

methodName

root object

当前被调用的方法名

#root.methodName

method

root object

当前被调用的方法

#root.method.name

target

root object

当前被调用的目标对象

#root.target

targetClass

root object

当前被调用的目标对象类

#root.targetClass

args

root object

当前被调用的方法的参数列表

#root.args[0]

caches

root object

当前方法调用使用的缓存列表(如@Cacheable(value={"cache1", "cache2"})),则有两个cache

#root.caches[0].name

argument name

evaluation context

方法参数的名字. 可以直接 #参数名 ,也可以使用 #p0#a0 的形式,0代表参数的索引;

#iban  #a0   #p0 

result

evaluation context

方法执行后的返回值(仅当方法执行之后的判断有效,如‘unless’,’cache put’的表达式 ’cache evict’的表达式beforeInvocation=false)

#result

 

 

 

 

### Spring Boot 中缓存注解及其使用方法 #### @EnableCaching 注解 为了使Spring应用能够支持声明式的缓存特性,需要在配置类上添加`@EnableCaching`注解。这会激活底层代理机制来拦截被标记的方法调用,并处理缓存逻辑[^3]。 ```java @Configuration @EnableCaching public class CacheConfig { // 配置内容... } ``` #### @Cacheable 注解注解用于标注那些其返回结果会被加入到缓存中的方法。每当执行该操作前都会先查询是否有符合条件的数据存在于缓存之中;如果有,则直接返回已有的数据而不再真正去运行这个方法体内的代码。可以通过设置value/key/condition等参数来自定义缓存策略[^1]。 - `value`: 指定要使用的缓存名称。 - `key`: 定义唯一标识符,默认情况下是根据传入参数生成的哈希值。 - `condition`: 表达式,在满足条件时才进行缓存。 ```java @Service public class BookService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Cacheable(value="books", key="#id") public String findBookById(Long id){ logger.info("查找书籍ID:" + id); return "book-" + id; } } ``` #### @CachePut 注解 更新现有条目而不影响其他行为的方式之一就是利用`@CachePut`。这意味着每次触发带有此类标签的方法之后都将刷新关联项的内容,即使输入相同的参数也不会阻止实际函数被执行。 ```java @CachePut(value="books", key="#result.id") public Book update(Book book) { ... } ``` #### @CacheEvict 注解 清除特定条件下匹配的所有记录可借助于`@CacheEvict`完成。allEntries=true表示清空整个命名空间下的所有元素;beforeInvocation=true则是在方法之前就移除缓存而不是等待正常结束后再做清理工作。 ```java @CacheEvict(value="books", allEntries=true, beforeInvocation=true) public void deleteAllBooks() {...} // 或者仅删除单个实体对应的缓存 @CacheEvict(value="books", key="#id") public void removeBook(long id){...} ``` #### 自动化测试验证效果 创建单元测试案例模拟多次请求同一个资源接口的过程,观察日志输出次数的变化情况以确认是否达到了预期的效果——即除了第一次之外后续几次都应该命中缓存从而避免了重复计算开销。 ```java @Test void testFindBookById(){ assertEquals("book-1L", service.findBookById(1L)); assertEquals("book-1L", service.findBookById(1L)); // 应该从缓存读取 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值