Spring | Spring Cache(缓存框架)

Spring Cache功能介绍

  • Spring CacheSpring的一个框架,实现了基于注解的缓存功能。只需简单加一个注解,就能实现缓存功能

  • Spring Cache提供了一层抽象底层可以切换不同的缓存实现。比较常见的(底层)缓存实现有:

    Redis、EHCache、Caffeine。可自定义地修改Spring Cache底层的缓存实现比如: 你想用Redis进行缓存,可修改Spring Cache配置,让其底层通过Redis来实现缓存功能。

  • 在具体的项目中,想切换Spring Cache底层的“缓存实现”时
    只需修改该 “缓存实现”的依赖Spring Cache底层就会自动切换“缓存实现”
    例如:此时的底层的缓存实现为: EHCache,想修改为Redis,只需把Redis依赖修改为EHCache的依赖即可。 (当然你的电脑得提前装好Redis、配置好Redis)

Spring Cache的Maven依赖

       <!--  Spring-data-redis依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

  <!-- Spring Cache的依赖,结合上面的Redis依赖,所以该Cache框架的底层“缓存实现”为: Redis  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

Spring Cache的常用注解

@EnableCaching注解

  • 通常加在类 (启动类 )上,用于 开启缓存注解功能

在这里插入图片描述

  • @Slf4j
    @SpringBootApplication
    @EnableCaching  //开启缓存注解功能
    public class CacheDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(CacheDemoApplication.class,args);
            log.info("项目启动成功...");
        }
    }
    

@CachePut注解

  • 一般加在方法上方法的返回值放到缓存
    只能“放”缓存数据

  •   @PostMapping
        /*
         * 当数据插入到数据库的同时,还需要把这个数据保存到Redis中一份(进行数据的缓存),
         * 此时可用Spring Cache框架的 @CachePut注解 :将方法的返回值存入到缓存中。
         */
        //使用Spring Cache缓存数据
        /* 如果此时User的id为1,那么存入Redis中的“key名称”为: userCache::1 */
        @CachePut(cacheNames = "userCache",key = "#user.id")
        public User save(@RequestBody User user){
            userMapper.insert(user);
            return user;
        }
    

    @CachePut注解的多种实现方式:

在这里插入图片描述

  •   @PostMapping
        /*
         * 当数据插入到数据库的同时,还需要把这个数据保存到Redis中一份(进行数据的缓存),
         * 此时可用Spring Cache框架的 @CachePut注解 :将方法的返回值存入到缓存中。
         */
        //使用Spring Cache缓存数据
        /* 如果此时User的id为1,那么存入Redis中的“key名称”为: userCache::1 */
        @CachePut(cacheNames = "userCache",key = "#user.id")
    
        /* #result得到是一个User对象,结合该对象的id,生成存入Redis数据库中的 key */
         @CachePut(cacheNames = "userCache",key = "#result.id") //存入Redis的key名为: userCache::1 --对象导航
    
        /* #p0 : 获得save()方法的第一个参数,即User对象 */
        @CachePut(cacheNames = "userCache",key = "#p0.id") //存入Redis的key名为: userCache::1
    
        /* #a0 : 获得方法的第一个参数,... */
        @CachePut(cacheNames = "userCache",key = "#a0.id") //存入Redis的key名为: userCache::1
    
        /* #root.args[1] : 获得第一个参数 */
        @CachePut(cacheNames = "userCache",key = "#root.args[1].id") //存入Redis的key名为: userCache::1
        //上面的@CachePut()注解选其中一个使用即可。
        public User save(@RequestBody User user){
            userMapper.insert(user);
            return user;
        }
    

@Cacheable注解

  • 一般加在方法上在方法执行前,先查询缓存中是否有数据如果有数据,则直接返回缓存数据如果没有缓存数据,调用方法并将方法返回值放到缓存中
    即“可”取缓存数据,也可“放”缓存数据

在这里插入图片描述

  •  @GetMapping
         /*
          在方法执行前,先查询缓存中是否有数据,如果有数据,则直接返回缓存数据。
          如果没有缓存数据,调用方法并将方法返回值放到缓存中。
         */
        @Cacheable(cacheNames = "userCache",key = "#id") // key的生成 : userCache::10
        public User getById(Long id){ //如果该id的值为: 10
            User user = userMapper.getById(id);
            return user;
      }
    

@CacheEvict注解

  • 一般加在方法上,有 一条多条缓存数据从缓存中删除

在这里插入图片描述

  •    /*
          数据库中的数据被删掉了,对应的也需要给清理掉 (清除一条缓存数据)
         */
        @CacheEvict(cacheNames="userCache",key ="#id") //清理一条或多条缓存数据
        @DeleteMapping
        public void deleteById(Long id){
            userMapper.deleteById(id);
        }
    
        /*
         数据库中的数据被删掉了,对应的也需要给清理掉 (清除多条缓存数据)
        */
    @CacheEvict(cacheNames = "userCache",allEntries = true) //清理一条或多条缓存数据
    	@DeleteMapping("/delAll")
        public void deleteAll(){
            userMapper.deleteAll();
     }
    
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值