• 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依赖

           
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-data-redisartifactId>
            dependency>
    
      
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-cacheartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Spring Cache的常用注解

    @EnableCaching注解

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

    在这里插入图片描述

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

    @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;
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      @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;
          }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25

    @Cacheable注解

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

    在这里插入图片描述

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

    @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();
       }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
  • 相关阅读:
    Sentinel 热点规则 (ParamFlowRule)
    【python】一:基础学习-数据类型及相关方法
    AI+Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!
    Spring手动构建BeanDefinition的几种方法
    Linux系统编程笔记--系统(文件)I/O操作
    【luogu P7967】Magneti(DP)
    java计算机毕业设计民宿运营管理网站源码+mysql数据库+系统+lw文档+部署
    利用EXCEL进行XXE攻击
    axios 请求拦截器&响应拦截器与router的导航守卫
    Linux 文本处理命令 - chmod
  • 原文地址:https://blog.csdn.net/m0_70720417/article/details/134002629