Spring Cache

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发

Spring Cache 是一个框架,实现了了基于注解的缓存功能,只需要简单地添加一个注解,就能实现缓存功能。

Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如:

  • EHCache
  • Caffeine
  • Redis

导入cache的maven坐标:

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.7.3</version>
</dependency>

若你想通过Redis来作为具体的缓存实现,只需在pom文件中导入Reids的java客户端

想使用Spring Cache,主要就是使用它的一系列注解

常用注解:

注解 说明
@EnableCaching 开启缓存功能,通常加在启动类上
@Cacheable 在方法执行前先查询缓存中是否有数据,若有:则直接返回缓存数据:若无,调用方法并将方法返回值放到缓存中
@CachePut 将方法的返回值放到缓存中
@CacheEvict 将一条或多条数据从缓存中删除

@CachePut使用说明:

1
2
3
4
5
6
@PostMapping
@CachePut(cacheNames = "userCache",key = "#user.id") //这将会以cacheNames::key为键存到redis中,这里的#user.id为spring的表达式语言,将会动态地取到形参user的id值
public User save(@RequestBody User user){
userMapper.insert(user);
return user;
}

这里的#user.id可以改为result.id,result在这里是固定的表达,指的是返回值

key = “#user.id” 也可以换为key = “#p0.id”,p0在这里指的是第一个参数

. :对象导航

@Cacheable使用说明:

1
2
3
4
5
6
@GetMaping
@Cacheable(cacheNames ="userCache",key="#id")
public User getById(Long id){
User user = userMapper.getById(id);
return user;
}

@CacheEvict使用说明:

1
2
3
4
5
@DeletMapping
@CacheEvict(cacheName="userCache",key="#id")
public void deldteById(LOng id){
userMapper.deleteById(id);
}