@Cacheable 清缓存
时间: 2023-11-07 07:04:12 浏览: 110
@Cacheable注解是Spring框架中用于实现缓存功能的注解之一。它用于标记一个方法的返回结果是可以被缓存的,当调用该方法时,如果缓存中已经存在该方法的结果,则直接返回缓存中的数据,否则执行方法体并将结果存入缓存中。
使用@Cacheable注解时,需要指定一个缓存名称,该名称可以用来区分不同的缓存。当调用带有@Cacheable注解的方法时,Spring会先根据缓存名称在缓存中查找对应的数据,如果找到则直接返回,否则执行方法体并将结果存入缓存中。
@Cacheable注解还可以通过指定key属性来定义缓存的key值,如果不指定key值,则默认使用方法的参数作为key。同时,@Cacheable注解还支持使用SpEL表达式来动态生成key值。
如果想要清空某个缓存,可以使用@CacheEvict注解。@CacheEvict注解可以用于标记一个方法在执行之后清空指定的缓存。需要指定缓存名称和需要清空的key值。当调用带有@CacheEvict注解的方法时,Spring会先执行方法体,然后清空对应的缓存。
相关问题
@Cacheable 如何清除缓存
@Cacheable 是 Spring 框架中的一个注解,用于实现方法级别的缓存。当使用 @Cacheable 注解时,Spring 会将方法的返回值缓存起来,下次调用相同的方法时,会直接从缓存中获取结果,而不是再次执行方法体。
要清除 @Cacheable 注解的缓存,可以使用 @CacheEvict 注解。@CacheEvict 注解可以标记在需要清除缓存的方法上,当该方法被调用时,会清除指定的缓存。
下面是一个示例代码:
```java
@Service
public class MyService {
@Cacheable("myCache")
public String getData() {
// 从数据库或其他数据源获取数据
return "data";
}
@CacheEvict("myCache")
public void clearCache() {
// 清除缓存
}
}
```
在上面的示例中,`getData()` 方法使用了 `@Cacheable("myCache")` 注解,表示该方法的返回值会被缓存在名为 "myCache" 的缓存中。`clearCache()` 方法使用了 `@CacheEvict("myCache")` 注解,表示该方法会清除名为 "myCache" 的缓存。
当调用 `clearCache()` 方法时,会清除名为 "myCache" 的缓存,下次调用 `getData()` 方法时,会重新执行方法体,并将结果缓存起来。
四、实验(训)方法与步骤 1.配置 Redis 连接。 2.使用@Cacheable 缓存方法结果。 3.使用@CacheEvict 清理缓存。 4.编写测试代码验证缓存效果。
四、实验(训练)方法与步骤:
1. **配置 Redis 连接**:首先,你需要在项目中添加Redis依赖,并根据你的应用环境设置合适的Redis连接信息,包括服务器地址、端口、密码等。通常这会在配置文件或者服务启动时初始化。
2. **启用@Cacheable注解**:在需要缓存的方法上添加`@Cacheable`注解,指定缓存的名称、key生成策略以及过期时间。例如:
```java
@Cacheable(value = "myCache", key = "#id")
public SomeObject fetchDataById(int id) {
// 业务逻辑
}
```
这表示对`fetchDataById`方法的结果将自动存储到名为"myCache"的缓存中。
3. **清除缓存**:如果需要在特定场景下清空缓存,可以使用`@CacheEvict`注解,比如在更新数据后执行:
```java
@CacheEvict(value = "myCache", key = "#id")
public void updateData(int id) {
// 更新操作
}
```
这将删除对应id的数据项从缓存中。
4. **编写测试代码验证缓存**:最后,在测试类中,你可以调用被缓存的方法并检查其是否返回预期结果,同时确认缓存是否正常工作。可以模拟清除缓存后再次调用,查看是否会触发缓存加载。此外,还可以直接检查Redis数据库确认缓存内容是否正确。测试示例:
```java
@Test
public void testCache() {
SomeObject cachedObj = service.fetchDataById(1);
assertNotNull(cachedObj); // 检查缓存是否存在
// 更新数据并验证缓存已清除
service.updateData(1);
SomeObject updatedObj = service.fetchDataById(1);
assertNotSame(cachedObj, updatedObj);
// 再次查询应从Redis加载新值
SomeObject freshObj = service.fetchDataById(1);
assertEquals(updatedObj, freshObj);
}
```
阅读全文