SpringCache的依赖

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

一 在启动类上加入 @EnableCaching

1
2
3
4
5
6
7
8
9
@Slf4j
@SpringBootApplication
@EnableCaching
public class CacheDemoApplication {
public static void main(String[] args) {
SpringApplication.run(CacheDemoApplication.class,args);
log.info("项目启动成功...");
}
}

二 在需要缓存数据的方法上加入 @CachePut

1
2
3
4
5
6
7
8
9
@PostMapping
@CachePut(cacheNames = "userCache", key = "#user.id") // 如果使用SpringCache缓存数据, key的生成: userCache:: 2
@CachePut(cacheNames = "userCache", key = "#result.id") // 对象导航, 此时result获得的是该方法的返回值
@CachePut(cacheNames = "userCache", key = "#p0.id") // 此时获取到的是第一个形参的id, p1则是第二个形参
@CachePut(cacheNames = "userCache", key = "#a0.id") // 此时获取到的也是第一个形参的id, p1则是第二个形参
public User save(@RequestBody User user){
userMapper.insert(user);
return user;
}

在redis中数据的存在形式

此种情况是 使用的user.id作为key, 前缀name是userCache, redis会将 :: 之间连接的关系做树状分类

三 在查询数据库前先查缓存, 在这样的方法上加入 @Cacheable, 如果缓存中没有, 则查数据库,然后自动将数据加入缓存

1
2
3
4
5
6
@GetMapping
@Cacheable(cacheNames = "userCache", key = "#id") // 在 Redis中查询 userCache:: id , 如果存在则不从数据库中查询
public User getById(Long id){
User user = userMapper.getById(id);
return user;
}

四 要清理一条或多条缓存, 则在该方法上加入 @CacheEnvict , 要清理一条则指定key = “#id”, 要清理所有cacheName下的缓存, 则加入allEntries = true

1
2
3
4
5
6
7
8
9
10
11
12
   @CacheEvict(cacheNames = "userCache", key = "#id") // 此时指定清理一条缓存 userCache::id
@DeleteMapping
public void deleteById(Long id){
userMapper.deleteById(id);
}

@CacheEvict(cacheNames = "userCache", allEntries = true) // 此时清理所有 userCache下的缓存
@DeleteMapping("/delAll")
public void deleteAll(){
userMapper.deleteAll();
}