目录
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要一个简单的注解,就能实现缓存功能。
Spring Cache提供了一层抽象,底层可以切换不同的缓存实现,例如: EHche Caffeine Redis.对应的不同缓存有不同的依赖。
开启缓存注解功能,通常用在启动类上。
在某个方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据value的值;如果没有缓存数据,调用方法并将返回值放到缓存中。
将方法的返回值放到缓存中。
将一条或多条数据从缓存中删除
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-cacheartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-data-redisartifactId>
- dependency>
- create database spring_cache_demo;
- use spring_cache_demo;
- CREATE TABLE `user` (
- `id` bigint NOT NULL AUTO_INCREMENT,
- `name` varchar(45) DEFAULT NULL,
- `age` int DEFAULT NULL,
- PRIMARY KEY (`id`)
- );
- @Data
- public class User implements Serializable {
-
- private static final long serialVersionUID = 1L;
-
- private Long id;
-
- private String name;
-
- private int age;
-
- }
由于当前业务逻辑比较简单,所以我们不需要service层的代码
- //Controller层
- @RestController
- @RequestMapping("/user")
- @Slf4j
- public class UserController {
-
- @Autowired
- private UserMapper userMapper;
-
- @PostMapping
- public User save(@RequestBody User user){
- userMapper.insert(user);
- return user;
- }
-
- @DeleteMapping
- public void deleteById(Long id){
- userMapper.deleteById(id);
- }
-
- @DeleteMapping("/delAll")
- public void deleteAll(){
- userMapper.deleteAll();
- }
-
- @GetMapping
- public User getById(Long id){
- User user = userMapper.getById(id);
- return user;
- }
-
- }
- //mapper层代码
- @Mapper
- public interface UserMapper{
-
- @Insert("insert into user(name,age) values (#{name},#{age})")
- @Options(useGeneratedKeys = true,keyProperty = "id")
- void insert(User user);
-
- @Delete("delete from user where id = #{id}")
- void deleteById(Long id);
-
- @Delete("delete from user")
- void deleteAll();
-
- @Select("select * from user where id = #{id}")
- User getById(Long id);
- }
-
-
- @Slf4j
- @EnableCaching//代表开启注解
- @SpringBootApplication
- public class CacheDemoApplication {
- public static void main(String[] args) {
- SpringApplication.run(CacheDemoApplication.class,args);
- log.info("项目启动成功...");
- }
- }
当是插入操作时,我们考虑用哪个注解?
我们考虑使用的是@CachePut这个注解(原因:这个注解是将方法的返回值存储到缓存当中)。
- @Autowired
- private UserMapper userMapper;
- @CachePut(cacheNames = "userCache",key ="#user.id")
- //如果使用springCache缓存数据,key的生成:userCache:
-
- @PostMapping
- public User save(@RequestBody User user){
- userMapper.insert(user);
- return user;
- }
同时在mapper接口中,要加入user的id返回的注解,代码如下:
- @Insert("insert into user(name,age) values (#{name},#{age})")
- @Options(useGeneratedKeys = true,keyProperty = "id")
- void insert(User user);
接口文档中进行测试:
Redis中进行查看:
当根据用户的id查询用户时,我们该使用哪个注解?
我们使用@Cacheable注解(在方法执行前,判断有没有缓存数据,如果有,直接进行返回,如果没有,则调用方法并将数据放到缓存当中)。
- @GetMapping
- @Cacheable(cacheNames = "userCache", key="#id")
- //key的生成:userCache:id value:为查询相应的数据,若是查询到,直接进行返回,如果查询不到,则将其加入到缓存
- public User getById(Long id){
- User user = userMapper.getById(id);
- return user;
- }
当删除一条或者多条数据时,使用哪个注解?
这个比较简单,我们使用@CacheEvit注解(这个注解可以删除一条或者多条数据)。
- @DeleteMapping
- @CacheEvict(cacheNames = "userCache",key="#id")
- public void deleteById(Long id){
- userMapper.deleteById(id);
- }
-
- @DeleteMapping("/delAll")
- @CacheEvict(cacheNames = "userCache",allEntries=true)
- public void deleteAll(){
- userMapper.deleteAll();
- }