SpringCache
springCache介绍
springCache是一个框架,实现了基于注解的缓存功能,只需要简单加一个注解,就实现缓存功能。
Spring Cache提供一层抽象,底层可以切换不同cache实现,具体就是通过CacheManager接口来同一不同的缓存技术。
CacheManager是spring提供的各种缓存技术抽象接口。
针对不同的缓存技术需要实习不同的CacheManager:
CacheManager | 描述 |
---|---|
EhCacheCacheManager | 使用EhCache作为缓存技术 |
GuavaCacheManager | 使用Google的GuavaCache作为缓存技术 |
RedisCacheManager | 使用Redis作为缓存技术 |
Spring Cache 常用注解
注解 | 说明 |
---|---|
@EnableCaching | 开启缓存注解功能 |
@Cacheable | 在方法执行前spring先查看缓存中是否有数据,如果有数据就直接返回,没有数据将从数据库查询出来并放到缓存中 |
@CachePut | 将方法返回值放入缓存中 |
@CacheEvict | 将一条或者多条数据从缓存中删除 |
在spring boot项目中,使用缓存技术只需在项目中导入相关的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可
列如:使用Redis作为缓存技术,只需要导入spring data Redis的maven坐标即可.
Spring Cache 常用注解使用
-
导入对应的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <scope>compile</scope> </dependency>
-
在启动类上加入@EnableCaching注解
@Slf4j @SpringBootApplication @EnableCaching public class CacheDemoApplication { public static void main(String[] args) { SpringApplication.run(CacheDemoApplication.class,args); log.info("项目启动成功..."); } }
-
在controller中注入我们的缓存接口
@RestController @RequestMapping("/user") @Slf4j public class UserController { @Autowired private CacheManager cacheManager;
@CachePut注解的使用
/**
* @CachePut:将方法返回值放入缓存
* value:缓存的名称,每个缓存名称下可以有多个key
* key:缓存的key
*/
@CachePut(value = "userCache",key = "#user.id")
@PostMapping
public User save(User user){
userService.save(user);
return user;
}
@CacheEvict注解的使用
/**
* @CacheEvict:清理指定缓存
* value:缓存的名称,每个缓存名称下可以有多个key
* key:缓存的key
*/
@CacheEvict(value = "userCache",key = "#id")
//@CacheEvict(value = "userCache",key = "#p0")
//@CacheEvict(value = "userCache",key = "#root.args[0]")
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id){
userService.removeById(id);
}
@CacheEvict(value = "userCache",key = "#user.id")
//@CacheEvict(value = "userCache",key = "#result.id")
@PutMapping
public User update(User user){
userService.updateById(user);
return user;
}
@Cacheable注解的使用
/**
*
* @Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据就直接返回,没有数据将从数据库查询出来并放到缓存中
* value:缓存的名称,每个缓存名称下可以有多个key
* key:缓存的key
* condition:条件,满足条件时才执行缓存
*/
@Cacheable(value = "userCache",key = "#id",condition = "#result != null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id){
User user = userService.getById(id);
return user;
}
@Cacheable(value = "userCache",key = "#user.id+ '_' +#user.name")
@GetMapping("/list")
public List<User> list(User user){
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(user.getId() != null,User::getId,user.getId());
queryWrapper.eq(user.getName() != null,User::getName,user.getName());
List<User> list = userService.list(queryWrapper);
return list;
}
使用Redis作为缓存产品
-
导入maven坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
配置yml文件
#redis配置 redis: host: localhost port: 6379 #password: 123456 database: 0 #操作的是0号数据库 cache: redis: time-to-live: 1800000 #设置缓存有效时间
-
在启动类上增加@EnableCaching注解开启缓存注解功能
@Slf4j @SpringBootApplication @EnableCaching public class CacheDemoApplication { public static void main(String[] args) { SpringApplication.run(CacheDemoApplication.class,args); log.info("项目启动成功..."); } }
-
在Controller的方法上加上以上注解,进行缓存操作
/** * * @Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据就直接返回,没有数据将从数据库查询出来并放到缓存中 * value:缓存的名称,每个缓存名称下可以有多个key * key:缓存的key * condition:条件,满足条件时才执行缓存 * result:满足条件就不缓存 */ @Cacheable(value = "userCache",key = "#id",unless = "#result == null") @GetMapping("/{id}") public User getById(@PathVariable Long id){ User user = userService.getById(id); return user; } /** * @CacheEvict:清理指定缓存 * value:缓存的名称,每个缓存名称下可以有多个key * key:缓存的key */ @CacheEvict(value = "userCache",key = "#id") //@CacheEvict(value = "userCache",key = "#p0") //@CacheEvict(value = "userCache",key = "#root.args[0]") @DeleteMapping("/{id}") public void delete(@PathVariable Long id){ userService.removeById(id); }
-
测试:我们可以通过apipost来进行测试,我们只需要将我们的redis服务打开,然后执行操作我们就可以在redis中看到我们的缓存信息了。
ete(@PathVariable Long id){
userService.removeById(id);
}
5. 测试:我们可以通过apipost来进行测试,我们只需要将我们的redis服务打开,然后执行操作我们就可以在redis中看到我们的缓存信息了。
[外链图片转存中...(img-cyunvY5U-1688547477338)]